GHC поддерживает несколько генераторов кода бэкенда. Это часть компилятора, отвечающая за преобразование последней промежуточной формы представления, используемой GHC (форма под названием Cmm, являющаяся простым языком, похожим на C), в исполняемый код. Ниже описаны поддерживаемые GHC бэкенды.
5.10.1. Генератор кода нативном языке (-fasm)
По умолчанию GHC использует этот бэкенд. Это генератор кода нативном языке, который компилирует Cmm до машинного кода. Это самый быстрый бэкенд и, как правило, генерирует код с хорошей производительностью. Он обеспечивает лучшую поддержку компиляции динамических библиотек. Выберите его с помощью флага -fasm.
5.10.2. Генератор кода LLVM (-fllvm)
Это альтернативный бэкенд, который использует компилятор LLVM для генерации исполняемого кода. Он, как правило, генерирует код с производительностью, сопоставимой с генератором нативного кода, но в некоторых случаях может генерировать значительно более быстрый код. Это особенно верно для кода, работающего с числами и массивами, использующего пакеты, такие как vector. Стоимость – существенное увеличение времени компиляции. Выберите бэкенд LLVM с помощью флага -fllvm.
Для работы генератора кода LLVM необходимо установить и иметь LLVM на вашем PATH. В частности, GHC должен иметь возможность вызывать инструменты opt и llc. Во-вторых, если вы работаете на Mac OS X с LLVM 3.0 или выше, то вам также потребуется доступный на вашей PATH компилятор Clang C.
Примечание
Обратите внимание, что этот релиз GHC ожидает версию LLVM в серии выпусков с 13 по 20 (не включительно).
Для установки LLVM и Clang:
- Linux: Используйте инструмент управления пакетами.
- Mac OS X: Clang по умолчанию включён в последние версии OS X, когда установлен Xcode (с версии 10.6 и новее). LLVM не включён. Чтобы использовать генератор кода на основе LLVM, установите менеджер пакетов Homebrew для OS X. В качестве альтернативы, вы можете загрузить двоичные файлы для LLVM и Clang с этой страницы.
- Windows: Вы должны загрузить двоичные файлы для LLVM и clang с этой страницы.
5.10.3. Генератор кода на C (-fvia-C)
-
-fvia-C -
Использование генератора кода на C. Поддерживается только в нереализованных сборках GHC.
Это самый старый генератор кода в GHC и в настоящее время, как правило, не включён, поскольку был устаревшим около GHC 7.0. Выберите его с флагом -fvia-C.
Генератор кода на C поддерживается только при построении GHC в режиме «нереализованной» сборки, в котором GHC генерирует «портабельный» код C, чтобы облегчить переноску самого GHC на новую платформу. Однако этот режим создаёт значительно более медленный код, поэтому маловероятно, что ваша версия GHC была построена таким образом. Если это так, то генератор нативного кода, вероятно, будет недоступен. Вы можете проверить эту информацию, вызвав ghc --info (см. --info).
5.10.4. Генератор кода JavaScript
Это альтернативный генератор кода, включённый в GHC 9.6 и выше. Он генерирует код на JavaScript, совместимый со спецификацией ECMA-262, и представлен в качестве технического предварительного просмотра. На момент написания он активно разрабатывается, но не подходит для серьёзных проектов и производственных сред. Бэкенд JavaScript не входит в дистрибутив GHC и требует ручного построения. Обратитесь к странице построения бэкенда JavaScript в вики GHC для получения инструкций по сборке.
Компиляция GHC для кросс-компиляции в JavaScript генерирует исполняемый скрипт и каталог с тем же именем, дополненным .jsexe. Например, компиляция файла под названием Foo.hs создаст исполняемый скрипт Foo и каталог Foo.jsexe. Скрипт — это тонкая оболочка, которая вызывает Node.js с содержимым скомпилированного кода Haskell, и он может запускаться обычным способом, например, ./Foo, при условии, что node присутствует в вашей среде. Фактическое содержимое находится в <ModuleName>.jsexe/all.js, например Foo.jsexe/all.js. Этот файл — это скомпилированная в JavaScript программа Haskell в конкретной синтаксической форме и может быть обернута в <script> тег HTML. Для более подробной информации о других выходных файлах сборки, обратитесь к разделу выходные данные компилятора на вики.
5.10.5. Компиляция без регистрации
Термин «незарегистрированная» на самом деле означает «компиляция через обычный C», отключая некоторые платформозависимые приёмы, которые GHC обычно использует, чтобы программы работали быстрее. При компиляции без регистрации GHC просто генерирует файл C, который компилируется с помощью gcc.
При построении GHC в режиме без регистрации доступен только генератор кода на C. Генераторы кода LLVM и нативного кода не могут использоваться в нереализованной сборке.
Компиляция без регистрации может быть полезной при переносе GHC на новую машину, поскольку она сводит необходимые инструменты к gcc, as, и ld и ни к чему больше, и при этом объём платформозависимого кода, который необходимо написать для запуска компиляции без регистрации, обычно невелик.
Компиляцию без регистрации нельзя выбрать во время компиляции; вам нужно скомпилировать GHC с соответствующими настройками. Обратитесь к Руководству по сборке GHC для получения подробностей.
Вы можете проверить, является ли ваш GHC нереализованным, вызвав ghc --print-unregisterised (см. --print-unregisterised) или ghc --info (см. --info).