Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Glasgow Haskell Compiler ( GHC ) является открытым исходным кодом машинного кода компилятором для функционального программирования языка Haskell . [4] Он обеспечивает кроссплатформенную среду для написания и тестирования кода Haskell и поддерживает многочисленные расширения, библиотеки и оптимизации, которые упрощают процесс генерации и выполнения кода. GHC - наиболее часто используемый компилятор Haskell. [5] Ведущие разработчики - Саймон Пейтон Джонс и Саймон Марлоу .

История [ править ]

Первоначально GHC был запущен в 1989 году как прототип, написанный на LML (Lazy ML) Кевином Хаммондом из Университета Глазго . Позже в том же году прототип был полностью переписан на Haskell, за исключением его парсера , Корделией Холл, Уиллом Партейном и Саймоном Пейтоном Джонсом. Его первая бета-версия была выпущена 1 апреля 1991 года, а в последующих выпусках был добавлен анализатор строгости, а также языковые расширения, такие как монадический ввод-вывод , изменяемые массивы, распакованные типы данных, модели параллельного и параллельного программирования (такие как программная транзакционная память и параллелизм данных ). и профилировщик . [2]

Пейтон Джонс, а также Марлоу позже перешли в Microsoft Research в Кембридже, Англия , где они продолжали нести основную ответственность за разработку GHC. GHC также содержит код от более чем трехсот других участников. [1] С 2009 года взносы третьих сторон в GHC финансируются Industrial Haskell Group. [6]

Архитектура [ править ]

Сам GHC будет написан в Haskell , [7] , но исполняющая система для Haskell, необходимо для запуска программ, написана в C и C-- .

GHC, передний конец -incorporating в лексическом анализаторе , анализатор и программе проверка -is предназначены для сохранения как можно больше информации о языке источника , как это возможно только после вывода типа завершения, к цели обеспечения четких сообщений об ошибках пользователей. [2] После проверки типа, код на Haskell является обессахаренной в типизированном промежуточном язык , известный как «ядро» ( на основе системы F , с расширенной letи caseвыражениями). Недавно Core был расширен для поддержки обобщенных алгебраических типов данных в своей системе типов и теперь основан на расширении Системы F, известном как Система F.C . [8]

В традициях компиляции, ориентированной на типы, упрощатель GHC, или «средний конец», где выполняется большинство оптимизаций, реализованных в GHC, структурирован как серия преобразований исходного кода в код ядра. Анализ и преобразования, выполняемые на этом этапе компиляции, включают анализ спроса (обобщение анализа строгости ), применение определяемых пользователем правил перезаписи (включая набор правил, включенных в стандартные библиотеки GHC, которые выполняют слияние складывания и сборки ), развертывание (называемое " inlining »в более традиционных компиляторах), let-float , анализ, определяющий, какие аргументы функции можно распаковать,построен анализ результатов продукта , специализации из перегруженных функций, а также набор простых локальных преобразований , таких как постоянное складывания и бета - редукции . [9]

Внутренняя часть компилятора преобразует код ядра во внутреннее представление C-- через промежуточный язык STG (сокращение от «Spineless Tagless G-machine»). [10] Затем код C-- может идти по одному из трех путей: он либо печатается как код C для компиляции с помощью GCC , либо преобразуется непосредственно в машинный код (традиционная фаза « генерации кода »), либо преобразуется в виртуальную машину LLVM. код для компиляции с LLVM. Во всех трех случаях результирующий собственный код, наконец, связывается с системой времени выполнения GHC для создания исполняемого файла.

Язык [ править ]

GHC соответствует языковым стандартам, как Haskell 98 [11], так и Haskell 2010 . [12] Он также поддерживает множество дополнительных расширений стандарта Haskell: например, библиотеку программной транзакционной памяти (STM), которая позволяет выполнять транзакции с составной памятью .

Расширения Haskell [ править ]

Было предложено несколько расширений Haskell. Эти расширения предоставляют функции, не описанные в спецификации языка, или переопределяют существующие конструкции. Таким образом, каждое расширение может поддерживаться не всеми реализациями Haskell. Постоянно прилагаются усилия [13] для описания расширений и выбора тех, которые будут включены в будущие версии спецификации языка.

Расширения [14], поддерживаемые компилятором Glasgow Haskell, включают:

  • Распакованные типы и операции. Они представляют примитивные типы данных базового оборудования без косвенного указания указателя на кучу или возможности отложенной оценки. Код с большим количеством цифр может быть значительно быстрее при кодировании с использованием этих типов.
  • Возможность указать строгую оценку для поля значения, привязки шаблона или типа данных.
  • Более удобный синтаксис для работы с модулями, шаблонами, списками , операторами, записями и кортежами.
  • Синтаксический сахар для вычислений со стрелками и рекурсивно определенными монадическими значениями. Оба эти понятия распространяются монадическим делать -notation представленного в стандартном Haskell.
  • Значительно более мощная система типов и классов типов, описанная ниже.
  • Template Haskell , система метапрограммирования во время компиляции . Программист может писать выражения, которые создают код Haskell в форме абстрактного синтаксического дерева . Эти выражения проверяются по типу и оцениваются во время компиляции; сгенерированный код затем включается, как если бы он был написан непосредственно программистом. Вместе с возможностью размышлять над определениями это обеспечивает мощный инструмент для дальнейших расширений языка.
  • Квази-цитирование, которое позволяет пользователю определять новый конкретный синтаксис для выражений и шаблонов. Квази-цитирование полезно, когда метапрограмма, написанная на Haskell, манипулирует кодом, написанным на языке, отличном от Haskell.
  • Универсальные классы типов, которые определяют функции исключительно в терминах алгебраической структуры типов, с которыми они работают.
  • Параллельное вычисление выражений с использованием нескольких ядер ЦП. Это не требует явного создания потоков. Распределение работы происходит неявно, на основе аннотаций, предоставленных программистом.
  • Прагмы компилятора для направления оптимизаций, таких как встроенное расширение и специализация функций для определенных типов.
  • Настраиваемые правила перезаписи. Программист может предоставить правила, описывающие, как заменить одно выражение эквивалентным, но более эффективно вычисляемым выражением. Они используются в основных библиотеках структур данных для повышения производительности всего кода на уровне приложения. [15]
  • Запишите синтаксис точки. Предоставляет синтаксический сахар для доступа к полям (потенциально вложенной) записи, которая аналогична синтаксису многих других языков программирования. [16]

Расширения системы типов [ править ]

Выразительная система статических типов - одна из основных определяющих особенностей Haskell. Соответственно, большая часть работы по расширению языка была направлена ​​на типы и классы типов .

Glasgow Haskell Compiler поддерживает расширенную систему типов на основе теоретической системы F C . [8] Основные расширения к системе типов включают:

  • Произвольный и непредикативный полиморфизм . По сути, полиморфная функция или конструктор типа данных может потребовать, чтобы один из его аргументов сам был полиморфным.
  • Обобщенные алгебраические типы данных . Каждый конструктор полиморфного типа данных может кодировать информацию в результирующий тип. Функция, которая соответствует шаблону для этого типа, может использовать информацию о типе конструктора для выполнения более конкретных операций с данными.
  • Экзистенциальные типы . Их можно использовать для «связывания» некоторых данных вместе с операциями над этими данными таким образом, чтобы операции можно было использовать, не раскрывая конкретный тип базовых данных. Такое значение очень похоже на объект в объектно-ориентированных языках программирования .
  • Типы данных, которые фактически не содержат никаких значений. Они могут быть полезны для представления данных в метапрограммировании на уровне типов .
  • Семейства типов : определяемые пользователем функции от типов к типам. В то время как параметрический полиморфизм обеспечивает одинаковую структуру для каждого экземпляра типа, семейства типов предоставляют специальный полиморфизм с реализациями, которые могут различаться между экземплярами. Сценарии использования включают оптимизацию контейнеров с учетом содержимого и метапрограммирование на уровне типов.
  • Параметры неявной функции, имеющие динамическую область видимости . Они представлены в типах почти так же, как ограничения классов типов.
  • Линейные типы (GHC 9.0)

Расширения, относящиеся к классам типов, включают:

  • Класс типа может быть параметризован более чем для одного типа. Таким образом, класс типов может описывать не только набор типов, но и n- мерное отношение типов.
  • Функциональные зависимости , которые ограничивают части этого отношения математической функцией типов. То есть ограничение указывает, что какой-то параметр класса типа полностью определяется после того, как фиксируется какой-то другой набор параметров. Это направляет процесс вывода типов в ситуациях, когда в противном случае возникла бы двусмысленность.
  • Значительно смягчены правила относительно допустимой формы экземпляров классов типов. Когда они включены полностью, система классов типов становится полным по Тьюрингу языком для логического программирования во время компиляции.
  • Семейства типов, как описано выше, также могут быть связаны с классом типов.
  • Автоматическая генерация экземпляров классов определенного типа расширена несколькими способами. Поддерживаются новые классы типов для универсального программирования и общие шаблоны рекурсии. Кроме того, когда новый тип объявлен как изоморфный существующему типу, любой экземпляр класса типа, объявленный для базового типа, может быть преобразован в новый тип «бесплатно».

Переносимость [ править ]

Версии GHC доступны для нескольких платформ , включая Windows и большинство разновидностей Unix (таких как Linux , FreeBSD , OpenBSD и macOS ). [17] GHC также был перенесен на несколько различных архитектур процессоров . [17]

См. Также [ править ]

  • Объятия
  • Yhc
  • Платформа Haskell

Ссылки [ править ]

  1. ^ a b «Команда GHC» . Haskell.org . Проверено 1 сентября 2016 года .
  2. ^ a b c Худак, П .; Hughes, J .; Peyton Jones, S .; Уодлер, П. (июнь 2007 г.). «История Haskell: лень с классом» (PDF) . Proc. Третья конференция ACM SIGPLAN по истории языков программирования (HOPL-III) . Проверено 1 сентября 2016 года .
  3. ^ "Скачать - компилятор Glasgow Haskell" . Haskell.org .
  4. ^ "Руководство пользователя системы компиляции Glorious Glasgow Haskell" . Haskell.org . Проверено 27 июля 2014 года .
  5. ^ «Состояние результатов опроса Haskell за 2017 год» . taylor.fausak.me . 15 ноября 2017 . Проверено 11 декабря 2017 года .
  6. ^ "Промышленная группа Haskell" . Haskell.org . 2014 . Проверено 1 сентября 2016 года .
  7. ^ «Комментарий GHC: Компилятор» . Haskell.org . 23 марта 2016 года Архивировано из оригинала 23 марта 2016 года . Проверено 26 мая 2016 .
  8. ^ a b Sulzmann, M .; Чакраварти, ММТ; Peyton Jones, S .; Доннелли, К. (январь 2007 г.). «Система F с принуждением к равенству типов» . Proc. Семинар ACM по типам в языковом дизайне и реализации (TLDI) .
  9. Перейти ↑ Peyton Jones, S. (апрель 1996). «Компиляция Haskell путем трансформации программы: отчет из окопов» . Proc. Европейский симпозиум по программированию (ESOP) .
  10. Перейти ↑ Peyton Jones, S. (апрель 1992 г.). «Реализация ленивых функциональных языков на стандартном оборудовании: Spineless Tagless G-machine, версия 2.5» . Журнал функционального программирования . 2 (2): 127–202. DOI : 10.1017 / S0956796800000319 .
  11. ^ "Haskell 98 Language and Libraries: The Revised Report" . Haskell.org . Проверено 28 января 2007 года .
  12. ^ "Отчет о языке Haskell 2010" . Haskell.org . Проверено 30 августа 2012 года .
  13. ^ «Добро пожаловать в Haskell» (Haskell Prime) » . Haskell.org . Проверено 26 мая 2016 .
  14. ^ «Особенности языка GHC» . Haskell.org . Проверено 25 мая 2016 .
  15. ^ Coutts, D .; Лещинский, Р .; Стюарт, Д. (апрель 2007 г.). «Stream Fusion: от списков к потокам - к чему-то вообще» . Proc. ACM SIGPLAN Международная конференция по функциональному программированию (ICFP) . Архивировано из оригинального 23 сентября 2007 года.
  16. ^ Митчелл, Нил; Флетчер, Шейн (3 мая 2020 г.). «Записать синтаксис с точкой» . ghc-предложения . GitHub . Проверено 30 июня 2020 .
  17. ^ a b Платформы на gitlab.haskell.org

Внешние ссылки [ править ]

  • Домашняя страница GHC