Компилятор Glasgow Haskell

редактировать

Компилятор Glasgow Haskell
Автор (ы) Кевин Хаммонд
Разработчик (и) The Glasgow Haskell Team
Первоначальный выпускдекабрь 1992 г. (1992-12)
Стабильный выпуск 8.10.2 / 8 августа 2020 г.; 2 месяца назад (2008-08-08)
Репозиторий Измените это на Wikidata
Написано наHaskell и C
Операционная система Linux, OS X 10.7 Lion и новее, iOS, Windows 2000 и новее, FreeBSD, Solaris 10 и выше
Платформа x86, x86-64, ARM
Доступно вАнглийский
Тип Компилятор
Лицензия Новая лицензия BSD
Веб-сайтwww.haskell.org / ghc /

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

Содержание
  • 1 История
  • 2 Архитектура
  • 3 Язык
    • 3.1 Расширения Haskell
    • 3.2 Тип системные расширения
  • 4 Переносимость
  • 5 См. также
  • 6 Ссылки
  • 7 Внешние ссылки
История

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

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

Архитектура

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

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

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

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

Язык

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

Расширения Haskell

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

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

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

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

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

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

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

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

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

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

См. Также
Ссылки
Внешние ссылки
Последняя правка сделана 2021-05-21 10:05:21
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте