Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

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

Глава 5 из книги "Архитектура приложений с открытым исходным кодом", том 2.

Оригинал: The Glasgow Haskell Compiler
Авторы: Simon Marlow и Simon Peyton-Jones
Дата публикации: 2012 г.
Перевод: Н.Ромоданов
Дата перевода: октябрь 2013 г.

Creative Commons. Перевод был сделан в соответствие с лицензией Creative Commons. С русским вариантом лицензии можно ознакомиться здесь.

Разработка компилятора Glasgow Haskell Compiler (GHC) стартовала в начале 1990-х годов как часть исследовательского проекта, финансируемого правительством Великобритании, с намерением достичь нескольких целей:

  • Создать свободно доступный, надежный и переносимый компилятор для языка Haskell, который должен генерировать высокопроизводительный код;
  • Обеспечить модульную основу, которую могли бы расширять и развивать другие исследователи;
  • Узнать, как ведут себя реальные программы, которые мы можем разрабатывать и создавать с помощью лучших компиляторов.

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

За время своего существования у компилятора GHC в целом было два - три активных разработчика, хотя количество тех, кто добавил свой код в разработку компилятора GHC, исчисляется сотнями. Хотя конечной целью для нас, главных разработчиков компилятора GHC, является проведение исследований, а не создание кода, мы считаем, что разработка компилятора GHC является важным предварительным условием: результаты исследований снова возвращаются в компилятор GHC, так что компилятор GHC затем может использоваться в качестве основы для дальнейшего исследования, которое строится на предыдущих идеях. Более того, важно, чтобы компилятор GHC был изделием промышленного уровня, поскольку тем самым обеспечивается большая правдоподобность результатов проводимых с ним исследований. Таким образом, хотя компилятор GHC переполнен передовыми научными идеями, много усилии затрачивается на то, чтобы его можно было использовать в производственных целях. Между этими двумя, казалось бы, противоречивыми целями, часто возникает некоторая напряженность, но, по большому счету, мы нашли направление, которое является приемлемым как с точки зрения исследований, так и с точки зрения производственных задач.

В этой главе мы хотим дать обзор архитектуры компилятора GHC и сосредоточиться на нескольких ключевых идеях, которые оказались успешными в компиляторе GHC (и на нескольких тех, которые успеха не имели). Надеюсь, что из следующих нескольких страниц вы получите некоторое представление о том, как нам на протяжении более 20 лет удалось сохранить активным большой программный проект, причем он не разрушится под своим собственным весом, что, как правило, происходит в случае, когда команда разработчиков очень маленькая.

5.1. Что такое язык Haskell?

Язык Haskell является функциональным языком программирования, который определен согласно документу, известному как «Haskell Report» («Отчет по языку Haskell»), последней версией которого является документ «Haskell 2010» [Mar10]. Язык Haskell был создан в 1990 году несколькими представителями академического научно-исследовательского сообщества, заинтересованного в функциональных языках, с целью решить проблему отсутствия общего языка, который можно было бы использовать как субъект для своих исследований.

Две особенности языка Haskell выделяют его из множества других языков программирования:

  • Это чисто функциональный (purely functional) язык. То есть, функции не могут иметь побочные эффекты или изменять данные; для заданного набора входных данных (аргументов) функция всегда выдает один и тот же результат. Что касается кода (и, на наш взгляд, создания кода), преимущества этой модели очевидны, но добавление ввода/вывода в чисто функциональную среду потребовало серьезного исследования. К счастью было обнаружено элегантное решение в виде монад (monads), что позволило не только аккуратно интегрировать ввод/вывод в чисто функциональный код, но ввести новые мощные абстракции, которая произвели революцию в кодировании на языке Haskell (что впоследствии также оказало влияние на другие языки).
  • Это язык с отложенными вычислениями (lazy). Это относится к стратегии вычислений в языке: в большинстве языков используются строгие вычисления (strict), когда аргументы функции вычисляются до вызова функции, тогда как в языке Haskell аргументы функции передаются невычисленными (unevaluated) и вычисляются только тогда, когда они потребуются. Что касается программ, то эта особенность языка Haskell также имеет свои преимущества, но прежде всего она служит барьером для предотвращения появления в языке нефункциональных свойств: такие свойства принципиально не могут сочетаться с семантикой отложенных вычислений.

Язык Haskell также является строго типизированным (strongly-typed), хотя он и поддерживает создание производных типов (type inference), что означает, что аннотации типов редко бывают необходимы.

Те, кому интересна подробная история языка Haskell, могут прочитать ее в [HHPW07].


Продолжение статьи: Общий взгляд на проект