Spec-Zone.ru › Haskell 9

5.10. Бэкенды GHC

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 также должен быть доступен компилятор C Clang.

Примечание

Обратите внимание, что этот выпуск GHC рассчитан на версии LLVM из серии от 13 до 21 (не включая 21).

Чтобы установить LLVM и Clang:

  • Linux: воспользуйтесь инструментом управления пакетами вашей системы.
  • Mac OS X: Clang включён по умолчанию в недавние версии OS X при установленном Xcode (начиная с версии 10.6). LLVM не входит в комплект. Чтобы использовать генератор кода на основе LLVM, установите менеджер пакетов для OS X Homebrew. Также можно скачать двоичные файлы 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 не распространяется в составе bindist GHC и требует ручной сборки. Инструкции по сборке см. на странице сборки бэкенда JavaScript в вики GHC.

GHC с кросс-компиляцией в JavaScript создаёт исполняемый скрипт и каталог с таким же именем, к которому добавлен суффикс .jsexe. Например, компиляция файла с именем Foo.hs создаст исполняемый скрипт Foo и каталог Foo.jsexe. Скрипт — это тонкая оболочка, которая запускает Node.js с полезной нагрузкой скомпилированного кода Haskell. Его можно запускать обычным образом, например, ./Foo, если в вашей среде задан node. Фактическая полезная нагрузка находится в <ModuleName>.jsexe/all.js, например в Foo.jsexe/all.js. Этот файл содержит программу на Haskell, кросс-компилированную в конкретный синтаксис JavaScript, и может быть обёрнут тегом HTML <script>. Описание остальных артефактов сборки см. в разделе вывод компилятора в вики.

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).

© 2002–2007 The University Court of the University of Glasgow. All rights reserved.
Licensed under the Glasgow Haskell Compiler License.
https://downloads.haskell.org/~ghc/9.14.1/docs/users_guide/codegens.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API