Компилятор Glasgow Haskell - Glasgow Haskell Compiler - Wikipedia
Оригинальный автор (ы) | Кевин Хаммонд |
---|---|
Разработчики) | Команда Glasgow Haskell[1] |
изначальный выпуск | Декабрь 1992 г.[2] |
Стабильный выпуск | 8.10.2 / 8 августа 2020 г.[3] |
Репозиторий | |
Написано в | Haskell и C |
Операционная система | Linux, OS X 10.7 Лев и позже, iOS, Windows 2000 и позже, FreeBSD, Solaris 10 и позже |
Платформа | x86, x86-64, РУКА |
Доступно в | английский |
Тип | Компилятор |
Лицензия | Новая лицензия BSD |
Интернет сайт | www |
В Компилятор Glasgow Haskell (GHC) является Открытый исходный код собственный код компилятор для функциональное программирование язык Haskell.[4] Он предоставляет кроссплатформенную среду для написания и тестирования кода Haskell и поддерживает многочисленные расширения, библиотеки и оптимизации, которые упрощают процесс генерации и выполнения кода. GHC - наиболее часто используемый компилятор Haskell.[5] Ведущие разработчики Саймон Пейтон Джонс и Саймон Марлоу.
История
Первоначально GHC был запущен в 1989 году как прототип, написанный на LML (Ленивый ML) Кевин Хаммонд в Университет Глазго. Позже в том же году прототип был полностью переписан на Haskell, за исключением его парсер Авторы: Корделия Холл, Уилл Партейн и Саймон Пейтон Джонс. Его первая бета-версия была выпущена 1 апреля 1991 года, а в последующих выпусках добавлен анализатор строгости а также языковые расширения, такие как монадический ввод / вывод, изменяемые массивы, распакованные типы данных, модели параллельного и параллельного программирования (например, программная транзакционная память и параллелизм данных ) и профайлер.[2]
Пейтон Джонс, как и Марлоу, позже переехал в Microsoft Research в Кембридж, Англия, где они продолжали нести основную ответственность за разработку GHC. GHC также содержит код от более чем трехсот других участников.[1]С 2009 года взносы третьих сторон в GHC финансируются Industrial Haskell Group.[6]
Архитектура
Сам GHC написано на Haskell,[7] но система времени выполнения для Haskell, необходимого для запуска программ, написан на C и C--.
GHC внешний интерфейс - включение лексер, парсер и типограф - предназначен для сохранения как можно большего количества информации об исходном языке до вывод типа завершена, чтобы предоставить пользователям четкие сообщения об ошибках.[2] После проверки типа код Haskell будет обессахаренный в напечатанный промежуточный язык известный как «Ядро» (на основе Система F, расширенный с позволять
и дело
выражения). Недавно Core был расширен для поддержки обобщенные алгебраические типы данных в его система типов, и теперь основан на расширении системы F, известной как System FC.[8]
В традициях компиляции, ориентированной на тип, упрощатель GHC, или «средний конец», где большая часть оптимизации реализованы в GHC, структурированы как серия от источника к источнику трансформации по основному коду. Анализ и преобразования, выполняемые на этом этапе компиляции, включают анализ спроса (обобщение анализ строгости ), применение определяемых пользователем переписать правила (включая набор правил, включенных в стандартные библиотеки GHC, которые выполняют foldr / build слияние ), разворачивающиеся (называемые "встраивание "в более традиционных компиляторах), пусть плавающий, анализ, определяющий, какие аргументы функции можно распаковать, анализ результатов построенного продукта, специализация из перегружен функции, а также набор более простых локальных преобразований, таких как постоянное сворачивание и бета-уменьшение.[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 включают:
- Распакованные типы и операции. Они представляют примитивные типы данных базового оборудования без косвенного указания указателя на куча или возможность отложенной оценки. Код с большим количеством цифр может быть значительно быстрее при кодировании с использованием этих типов.
- Возможность указать строгая оценка для поля значения, привязки шаблона или типа данных.
- Более удобный синтаксис для работы с модулями, паттернами, составить список, операторы, записи и кортежи.
- Синтаксический сахар для вычислений с стрелки и рекурсивно определенный монадический значения. Обе эти концепции расширяют монадическое делатьОбозначения в стандартном Haskell.
- Значительно более мощная система типов и классов типов, описанная ниже.
- Шаблон Haskell, система для времени компиляции метапрограммирование. Программист может писать выражения, которые производят код Haskell в виде абстрактное синтаксическое дерево. Эти выражения проверяются по типу и вычисляются во время компиляции; сгенерированный код затем включается, как если бы он был написан непосредственно программистом. Вместе с умением отражать Что касается определений, это дает мощный инструмент для дальнейших расширений языка.
- Квази-цитирование, которое позволяет пользователю определять новый конкретный синтаксис для выражений и шаблонов. Квазицитирование полезно, когда метапрограмма, написанная на Haskell, манипулирует кодом, написанным на языке, отличном от Haskell.
- Универсальный классы типов, которые определяют функции исключительно в терминах алгебраической структуры типов, с которыми они работают.
- Параллельное вычисление выражений с использованием нескольких ядер ЦП. Это делает нет требуют явного создания потоков. Распределение работы происходит неявно, на основе аннотаций, предоставленных программистом.
- Компилятор прагмы для направления оптимизаций, таких как встроенное расширение и специализированные функции для определенных типов.
- Настраиваемые правила перезаписи. Программист может предоставить правила, описывающие, как заменить одно выражение эквивалентным, но более эффективно вычисляемым выражением. Они используются в базовых библиотеках структур данных для повышения производительности всего кода уровня приложения.[15]
- Запишите синтаксис точки. Обеспечивает синтаксический сахар для доступа к полям (потенциально вложенной) записи, которая похожа на синтаксис многих других языков программирования.[16]
Расширения системы типов
Выразительная система статических типов - одна из основных определяющих особенностей Haskell. Соответственно, большая часть работы по расширению языка была направлена на типы и типовые классы.
Компилятор Glasgow Haskell поддерживает систему расширенных типов, основанную на теоретической системе F.C.[8] Основные расширения к системе типов включают:
- Произвольный ранг и непредсказуемый полиморфизм. По сути, полиморфная функция или конструктор типа данных может требовать, чтобы один из его аргументов сам был полиморфным.
- Обобщенные алгебраические типы данных. Каждый конструктор полиморфного типа данных может кодировать информацию в результирующий тип. Функция, которая соответствует шаблону для этого типа, может использовать информацию о типе конструктора для выполнения более конкретных операций с данными.
- Экзистенциальные типы. Их можно использовать для "связывания" некоторых данных вместе с операциями над этими данными таким образом, чтобы операции можно было использовать, не раскрывая конкретный тип базовых данных. Такое значение очень похоже на объект как найдено в объектно-ориентированного программирования языков.
- Типы данных, которые фактически не содержат никаких значений. Это может быть полезно для представления данных на уровне типа метапрограммирование.
- Семейства типов: определяемые пользователем функции от типов к типам. В то время как параметрический полиморфизм обеспечивает одинаковую структуру для каждого экземпляра типа, семейства типов обеспечивают для этого случая полиморфизм с реализациями, которые могут различаться в разных экземплярах. Сценарии использования включают оптимизацию контейнеров с учетом содержимого и метапрограммирование на уровне типов.
- Параметры неявной функции с динамическими объем. Они представлены в типах почти так же, как ограничения классов типов.
- Линейные типы (GHC 9.0)
Расширения, относящиеся к типовые классы включают:
- Типовой класс может быть параметризован более чем для одного типа. Таким образом, типовой класс может описывать не только набор типов, но и п-ари связь по типам.
- Функциональные зависимости, которые ограничивают части этого отношения математическими функция по типам. То есть ограничение указывает, что какой-то параметр класса типа полностью определяется после того, как фиксируется какой-то другой набор параметров. Это направляет процесс вывод типа в ситуациях, когда в противном случае возникла бы двусмысленность.
- Существенно смягченные правила относительно допустимой формы экземпляров класса типов. Когда они включены полностью, система классов типов становится Полный по Тьюрингу язык для логическое программирование во время компиляции.
- Семейства типов, как описано выше, также могут быть связаны с классом типов.
- Автоматическая генерация экземпляров классов определенного типа расширена несколькими способами. Новые классы типов для общее программирование поддерживаются общие шаблоны рекурсии. Кроме того, когда новый тип объявлен как изоморфный к существующему типу любой экземпляр класса типа, объявленный для базового типа, может быть преобразован в новый тип «бесплатно».
Портативность
Версии GHC доступны для нескольких платформы, включая Windows и большинство разновидностей Unix (Такие как Linux, FreeBSD, OpenBSD, и macOS ).[17] GHC также был портирован нескольким разным архитектуры процессоров.[17]
Смотрите также
Рекомендации
- ^ а б "Команда GHC". Haskell.org. Получено 1 сентября 2016.
- ^ а б c Худак, П .; Hughes, J .; Peyton Jones, S .; Уодлер, П. (июнь 2007 г.). «История Haskell: лень с классом» (PDF). Proc. Третья конференция ACM SIGPLAN по истории языков программирования (HOPL-III). Получено 1 сентября 2016.
- ^ "Компилятор Glasgow Haskell". Haskell.org. 6 сентября 2020. Получено 6 сентября 2020.
- ^ "Руководство пользователя системы компиляции Glorious Glasgow Haskell". Haskell.org. Получено 27 июля 2014.
- ^ «Состояние результатов опроса Haskell за 2017 год». taylor.fausak.me. 15 ноября 2017 г.. Получено 11 декабря 2017.
- ^ «Промышленная группа Хаскелл». Haskell.org. 2014. Получено 1 сентября 2016.
- ^ "Комментарий GHC: компилятор". Haskell.org. 23 марта 2016 г. Архивировано с оригинал 23 марта 2016 г.. Получено 26 мая 2016.
- ^ а б Sulzmann, M .; Чакраварти, М. М. Т .; Peyton Jones, S .; Доннелли, К. (январь 2007 г.). "Система F с принуждением к равенству типов". Proc. Семинар ACM по типам в языковом дизайне и реализации (TLDI).
- ^ Пейтон Джонс, С. (апрель 1996 г.). «Компиляция Haskell путем трансформации программы: отчет из окопов». Proc. Европейский симпозиум по программированию (ESOP).
- ^ Пейтон Джонс, С. (апрель 1992 г.). «Реализация ленивых функциональных языков на стандартном оборудовании: Spineless Tagless G-machine, версия 2.5». Журнал функционального программирования. 2 (2): 127–202. Дои:10.1017 / S0956796800000319.
- ^ «Язык и библиотеки Haskell 98: обновленный отчет». Haskell.org. Получено 28 января 2007.
- ^ "Отчет о языке Haskell 2010". Haskell.org. Получено 30 августа 2012.
- ^ «Добро пожаловать в Haskell» (Haskell Prime) ». Haskell.org. Получено 26 мая 2016.
- ^ «Возможности языка GHC». Haskell.org. Получено 25 мая 2016.
- ^ Coutts, D .; Лещинский, Р .; Стюарт, Д. (апрель 2007 г.). «Stream Fusion: от списков к потокам - к чему-то вообще». Proc. ACM SIGPLAN Международная конференция по функциональному программированию (ICFP). Архивировано из оригинал 23 сентября 2007 г.
- ^ Митчелл, Нил; Флетчер, Шейн (3 мая 2020 г.). «Записать синтаксис с точкой». ghc-предложения. GitHub. Получено 30 июн 2020.
- ^ а б Платформы на gitlab.haskell.org