Глазго Хаскелл-компилятор
Оригинальный автор(ы) | Кевин Хэммонд |
---|---|
Разработчик(и) | Саймон Марлоу , Саймон Пейтон Джонс , команда Glasgow Haskell [1] |
Первоначальный выпуск | декабрь 1992 г [2] |
Стабильная версия | 9.8.1 ![]() |
Репозиторий | |
Написано в | Хаскелл , С |
Операционная система | Linux , OS X 10.7 Lion и новее, Windows 2000 и новее, FreeBSD |
Платформа | х86 , х86-64 , ARM |
Доступно в | Английский |
Тип | Компилятор |
Лицензия | БСД Новый |
Веб-сайт | www |
Компилятор Glasgow Haskell ( GHC ) — это машинного кода компилятор для программирования функционального языка Haskell . [4] Он предоставляет кроссплатформенную программную среду для написания и тестирования кода Haskell и поддерживает множество расширений, библиотек и оптимизаций, которые упрощают процесс генерации и выполнения кода. GHC — наиболее часто используемый компилятор Haskell. [5] Это бесплатное программное обеспечение с открытым исходным кодом, выпущенное под лицензией BSD . Ведущими разработчиками являются Саймон Пейтон Джонс и Саймон Марлоу .
История [ править ]
Первоначально GHC зародился в 1989 году как прототип, написанный на языке Lazy ML (LML) Кевином Хаммондом из Университета Глазго . Позже в том же году прототип был полностью переписан на Haskell, за исключением его синтаксического анализатора , Корделией Холл, Уиллом Партейном и Саймоном Пейтоном Джонсом. Его первая бета-версия состоялась 1 апреля 1991 года. В более поздних выпусках были добавлены анализатор строгости и расширения языка, такие как монадический ввод-вывод , изменяемые массивы, распакованные типы данных, модели параллельного и параллельного программирования (такие как программная транзакционная память и параллелизм данных ) и профайлер . [2]
Пейтон Джонс и Марлоу позже перешли в Microsoft Research в Кембридже , где продолжали нести основную ответственность за разработку GHC. GHC также содержит код более чем трехсот других участников. [1] С 2009 года сторонние взносы в GHC финансируются Industrial Haskell Group. [6]
Имена GHC [ править ]
С ранних выпусков официальный сайт [7] называет GHC The Glasgow Haskell Compiler , тогда как в команде исполняемой версии он обозначается как The Glorious Glasgow Haskell Compilation System . [8] Это отражено в документации. [9] Первоначально он имел внутреннее название The Glamorous Glamourous Glasgow Haskell Compiler . [10]
Архитектура [ править ]
GHC написан на Haskell , [11] но система выполнения Haskell, необходимая для запуска программ, написана на C и C-- .
GHC Интерфейс , включающий в себя лексер , синтаксический анализатор и проверку типов , предназначен для сохранения как можно большего количества информации об исходном языке до тех пор, пока не будет завершен вывод типа , с целью предоставления пользователям четких сообщений об ошибках. [2] После проверки типа код Haskell преобразуется в типизированный промежуточный язык, известный как «Core» (основанный на System F , расширенный с помощью let
и case
выражения). Core был расширен для поддержки обобщенных алгебраических типов данных в своей системе типов и теперь основан на расширении System F, известном как System FC . [12]
В традициях компиляции с управлением типами упроститель GHC, или «средний конец», где выполняется большая часть оптимизаций , реализованных в GHC, структурирован как серия между исходными кодами преобразований кода Core. Анализы и преобразования, выполняемые на этом этапе компиляции, включают анализ требований (обобщение анализа строгости ), применение определяемых пользователем правил перезаписи (включая набор правил, включенных в стандартные библиотеки GHC, которые выполняют слияние Foldr/Build ), развертывание (называемое " inlining » в более традиционных компиляторах), let-float , анализ, определяющий, какие аргументы функции могут быть распакованы, результатов сконструированного продукта , специализация перегруженных анализ функций и набор более простых локальных преобразований, таких как свертывание констант и бета-редукция . [13]
Серверная часть компилятора преобразует код Core во внутреннее представление C-- через промежуточный язык STG (сокращение от «Spineless Tagless G-machine»). [14] Затем код C-- может пойти одним из трех маршрутов: он либо распечатывается как код C для компиляции с помощью GCC , преобразуется непосредственно в собственный машинный код (традиционная фаза « генерации кода ») или преобразуется в LLVM IR для компиляции с LLVM. . Во всех трех случаях полученный собственный код наконец связывается с системой времени выполнения GHC для создания исполняемого файла.
Язык [ править ]
GHC соответствует языковым стандартам Haskell 98 [15] и Хаскель 2010 . [16] Он также поддерживает множество дополнительных расширений стандарта Haskell: например, библиотеку программной транзакционной памяти (STM), которая позволяет выполнять составные транзакции с памятью .
Расширения Haskell [ править ]
Было предложено множество расширений Haskell. Они предоставляют функции, не описанные в спецификации языка, или переопределяют существующие конструкции. Таким образом, каждое расширение может поддерживаться не всеми реализациями Haskell. Постоянно предпринимаются усилия [17] описать расширения и выбрать те, которые будут включены в будущие версии спецификации языка.
Расширения [18] поддерживаемые компилятором Glasgow Haskell, включают:
- Распакованные типы и операции. Они представляют примитивные типы данных базового оборудования без косвенного указателя на кучу или возможности отложенной оценки. Код с интенсивным числом вычислений может работать значительно быстрее при кодировании с использованием этих типов.
- Возможность указать строгую оценку для поля значения, привязки шаблона или типа данных.
- Более удобный синтаксис для работы с модулями, шаблонами, списками , операторами, записями и кортежами.
- Синтаксический сахар для вычислений со стрелками и рекурсивно определяемыми монадическими значениями. Обе эти концепции расширяют монадическую do -нотация, предусмотренная в стандартном Haskell.
- Значительно более мощная система типов и классов типов, описанная ниже.
- Шаблон Haskell — система метапрограммирования во время компиляции . Выражения могут быть написаны для создания кода Haskell в форме абстрактного синтаксического дерева . Эти выражения проверяются на тип и оцениваются во время компиляции; сгенерированный код затем включается, как если бы он был частью исходного кода. Вместе с возможностью размышлять над определениями это обеспечивает мощный инструмент для дальнейшего расширения языка.
- Квази-цитата, которая позволяет пользователю определять новый конкретный синтаксис для выражений и шаблонов. Квазицитирование полезно, когда метапрограмма, написанная на Haskell, манипулирует кодом, написанным на языке, отличном от Haskell.
- Общие классы типов, которые определяют функции исключительно с точки зрения алгебраической структуры типов, с которыми они работают.
- Параллельная оценка выражений с использованием нескольких ядер ЦП. Это не требует явного создания потоков. Распределение работы происходит неявно, на основе аннотаций, предусмотренных в программе.
- компилятора Прагмы для управления оптимизацией, такой как встроенное расширение и специализация функций для определенных типов.
- Настраиваемые правила перезаписи — это правила, описывающие, как заменить одно выражение эквивалентным, но более эффективно вычисляемым выражением. Они используются в базовых библиотеках структур данных для повышения производительности кода уровня приложения. [19]
- Запишите синтаксис точки. Предоставляет синтаксический сахар для доступа к полям (потенциально вложенной) записи, который аналогичен синтаксису многих других языков программирования. [20]
Введите системные расширения [ править ]
Выразительная система статических типов — одна из основных определяющих особенностей Haskell. Соответственно, большая часть работы по расширению языка была направлена на типы данных и классы типов .
Компилятор Glasgow Haskell поддерживает систему расширенных типов, основанную на теоретической системе FC . [12] Основные расширения системы типов включают:
- Произвольный ранг и непредикативный полиморфизм . По сути, полиморфная функция или конструктор типа данных могут потребовать, чтобы один из ее аргументов сам был полиморфным.
- Обобщенные алгебраические типы данных . Каждый конструктор полиморфного типа данных может кодировать информацию в результирующий тип. Функция, которая выполняет сопоставление с шаблоном этого типа, может использовать информацию о типе каждого конструктора для выполнения более конкретных операций с данными.
- Экзистенциальные типы . Их можно использовать для «объединения» некоторых данных вместе с операциями над этими данными таким образом, чтобы операции можно было использовать без раскрытия конкретного типа базовых данных. Такое значение очень похоже на объект , встречающийся в объектно-ориентированных языках программирования.
- Типы данных, которые фактически не содержат никаких значений. на уровне типа Они могут быть полезны для представления данных в метапрограммировании .
- Семейства типов : определяемые пользователем функции от типов к типам. В то время как параметрический полиморфизм обеспечивает одну и ту же структуру для каждого экземпляра типа, семейства типов предоставляют специальный полиморфизм с реализациями, которые могут различаться между экземплярами. Варианты использования включают оптимизацию контейнеров с учетом содержимого и метапрограммирование на уровне типов.
- Параметры неявной функции, имеющие динамическую область действия . Они представлены в типах почти так же, как ограничения классов типов.
- Линейные типы (GHC 9.0)
Расширения, относящиеся к классам типов, включают:
- Класс типа может быть параметризован более чем для одного типа. Таким образом, класс типов может описывать не только набор типов, но и n -арное отношение к типам.
- Функциональные зависимости , которые ограничивают части этого отношения математической функцией типов. То есть ограничение указывает, что некоторый параметр класса типа полностью определяется после фиксирования некоторого другого набора параметров. Это направляет процесс вывода типа в ситуациях, когда в противном случае возникла бы неоднозначность.
- Значительно смягчены правила относительно допустимой формы экземпляров классов типов. Когда они включены полностью, система классов типов становится полным по Тьюрингу языком для логического программирования во время компиляции.
- Семейства типов, как описано выше, также могут быть связаны с классом типов.
- Автоматическое создание экземпляров классов определенных типов расширяется несколькими способами. новые классы типов для общего программирования Поддерживаются и общие шаблоны рекурсии. Кроме того, когда новый тип объявлен как изоморфный существующему типу, любой экземпляр класса типа, объявленный для базового типа, может быть преобразован в новый тип «бесплатно».
Портативность [ править ]
Версии GHC доступны для нескольких систем или вычислительных платформ , включая Windows и большинство разновидностей Unix (таких как Linux , FreeBSD , OpenBSD и macOS ). [21] GHC также был портирован на несколько различных процессорных архитектур . [21]
См. также [ править ]
Ссылки [ править ]
- ↑ Перейти обратно: Перейти обратно: а б «Команда GHC» . Хаскелл.орг . Проверено 1 сентября 2016 г.
- ↑ Перейти обратно: Перейти обратно: а б с Худак П.; Хьюз, Дж.; Пейтон Джонс, С .; Уодлер, П. (июнь 2007 г.). «История Haskell: лень с классами» (PDF) . Процедуры Третьей конференции ACM SIGPLAN History of Programming Languages (HOPL-III) . Проверено 1 сентября 2016 г.
- ^ «Загрузить – Компилятор Glasgow Haskell» . Хаскелл.орг .
- ^ «Руководство пользователя системы компиляции Glorious Glasgow Haskell» . Хаскелл.орг . Проверено 27 июля 2014 г.
- ^ «Результаты опроса о состоянии Haskell за 2017 год» . taylor.fausak.me . 15 ноября 2017 года . Проверено 11 декабря 2017 г.
- ^ «Промышленная группа Хаскелл» . Хаскелл.орг . 2014 . Проверено 1 сентября 2016 г.
- ^ «GHC Компилятор Haskell Глазго» . Хаскелл.орг . Проверено 14 января 2022 г.
- ^ «Репозиторий: configure.ac» . gitlab.haskell.org . 12 января 2022 г. Проверено 14 января 2022 г.
- ^ «Руководство пользователя системы компиляции Haskell Glorious Glasgow, версия 7.6.3» . downloads.haskell.org . Проверено 14 января 2022 г.
- ^ «ghc-0.29-src.tar.gz» ( tar gzip ) . downloads.haskell.org . Файл: ghc-0.29/ghc/PATCHLEVEL . Проверено 14 января 2022 г.
- ^ «Комментарий GHC: Составитель» . Хаскелл.орг . 23 марта 2016 г. Архивировано из оригинала 23 марта 2016 г. . Проверено 26 мая 2016 г.
- ↑ Перейти обратно: Перейти обратно: а б Зульцманн, М.; Чакраварти, ММТ; Пейтон Джонс, С .; Доннелли, К. (январь 2007 г.). «Система F с приведением равенства типов» . Процедуры семинара ACM по типам в языковом проектировании и реализации (TLDI) .
- ^ Пейтон Джонс, С. (апрель 1996 г.). «Компиляция Haskell путем преобразования программы: отчет с окопов» . Процедуры Европейского симпозиума по программированию (ESOP) .
- ^ Пейтон Джонс, С. (апрель 1992 г.). «Реализация ленивых функциональных языков на стандартном оборудовании: G-машина Spineless Tagless, версия 2.5» . Журнал функционального программирования . 2 (2): 127–202. дои : 10.1017/S0956796800000319 .
- ^ «Язык Haskell 98 и библиотеки: пересмотренный отчет» . Хаскелл.орг . Проверено 28 января 2007 г.
- ^ «Отчет о языке Haskell 2010» . Хаскелл.орг . Проверено 30 августа 2012 г.
- ^ «Добро пожаловать в Haskell (Haskell Prime)» . Хаскелл.орг . Архивировано из оригинала 20 февраля 2016 года . Проверено 26 мая 2016 г.
- ^ «Особенности языка GHC» . Хаскелл.орг . Архивировано из оригинала 29 июня 2016 года . Проверено 25 мая 2016 г. .
- ^ Куттс, Д.; Лещинский Р.; Стюарт, Д. (апрель 2007 г.). «Stream Fusion: от списков к потокам и вообще к нулю» . Процедуры Международной конференции ACM SIGPLAN по функциональному программированию (ICFP) . Архивировано из оригинала 23 сентября 2007 года.
- ^ Митчелл, Нил; Флетчер, Шейн (3 мая 2020 г.). «Синтаксис записи точек» . ghc-предложения . Гитхаб . Проверено 30 июня 2020 г.
- ↑ Перейти обратно: Перейти обратно: а б Платформы на gitlab.haskell.org