Введение

Компилятор для языка программирования Haskell

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

История

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

Названия ГХК

С первых версий на официальном сайте GHC именовался как The Glasgow Haskell Compiler, в то время как в командной строке исполняемого файла он определялся как The Glorious Glasgow Haskell Compilation System. Это было отражено в документации. Изначально он носил внутреннее название The Glamorous Glasgow Haskell Compiler.

Архитектура

GHC написан на Haskell, но система времени выполнения для Haskell, необходимая для запуска программ, написана на C и C++. Фронт-энд GHC, включающий лексер, парсер и проверщик типов, разработан для сохранения максимально возможного объема информации об исходном языке до завершения вывода типов, с целью предоставления пользователям чётких сообщений об ошибках. В традиции компиляции, управляемой типами, упроститель GHC, или "средний конец", где выполняется большинство оптимизаций, реализованных в GHC, структурирован как последовательность преобразований от источника к источнику над Core-кодом. Анализы и преобразования, выполняемые на этом этапе компилятора, включают анализ спроса (обобщение анализа строгости), применение определяемых пользователем правил переписывания (включая набор правил, входящих в стандартные библиотеки GHC, выполняющих слияние foldr/build), развёртывание (называемое "inlining" в более традиционных компиляторах), перемещение let-выражений, анализ, определяющий, какие аргументы функции могут быть развёрнуты (unboxed), анализ результатов конструкций-произведений, специализация перегруженных функций и набор более простых локальных преобразований, таких как свёртка констант и бета-редукция. Бэк-энд компилятора преобразует Core-код во внутреннее представление C через промежуточный язык STG (сокращение от "Spineless Tagless G-machine"). C-код затем может быть обработан одним из трёх способов: он либо выводится в виде C-кода для компиляции с помощью GCC, либо преобразуется непосредственно в машинный код (традиционная фаза "генерации кода"), либо преобразуется в LLVM IR для компиляции с помощью LLVM. Во всех трёх случаях полученный машинный код в конечном итоге связывается с системой времени выполнения GHC для создания исполняемого файла.

Язык

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

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

Экспрессивная статическая система типов — одна из ключевых характеристик, определяющих Haskell. Соответственно, значительная часть работы по развитию языка была сосредоточена на типах данных и классах типов. Компилятор Glasgow Haskell поддерживает расширенную систему типов, основанную на теоретической системе FC. GHC также был портирован на различные процессорные архитектуры.