7.1. Использование GHC
7.1.1. Начало работы: компиляция программ
В этой главе вы найдёте полную справку по синтаксису командной строки GHC, включая более 400 флагов. Это большая и сложная система, и есть много деталей, поэтому может быть сложно понять, как начать работу. С учётом этого, этот вводный раздел предоставляет краткое введение в основное использование GHC для компиляции программы Haskell, прежде чем следующие разделы углубятся в полный синтаксис.
Давайте создадим программу «Hello World», скомпилируем и запустим её. Сначала создайте файл hello.hs содержащий код Haskell:
main = putStrLn "Hello, World!"
Для компиляции программы используйте GHC следующим образом:
$ ghc hello.hs
(где $ представляет собой приглашение: не печатайте его). GHC скомпилирует исходный файл hello.hs, создав объектный файл hello.o и файл интерфейса hello.hi, а затем он свяжет объектный файл с библиотеками, которые поставляются с GHC, для создания исполняемого файла, называемого hello на Unix/Linux/Mac или hello.exe на Windows.
По умолчанию GHC будет очень молчаливым относительно того, что он делает, выводя только сообщения об ошибках. Если вы хотите увидеть более подробную информацию о том, что происходит за кулисами, добавьте -v в командную строку.
Затем мы можем запустить программу так:
$ ./hello Hello World!
Если ваша программа содержит несколько модулей, то вам нужно только указать GHC имя исходного файла, содержащего Main модуль, и GHC проанализирует import объявления, чтобы найти другие модули, которые составляют программу, и найти их исходные файлы. Это означает, что, за исключением Main модуля, каждый исходный файл должен быть назван по имени модуля, который он содержит (с точками, заменёнными разделителями каталогов). Например, модуль Data.Person будет находиться в файле Data/Person.hs на Unix/Linux/Mac или Data\Person.hs на Windows.
7.1.2. Обзор параметров
Поведение GHC контролируется параметрами, которые по историческим причинам иногда также называются флагами или аргументами командной строки. Параметры можно указать тремя способами:
7.1.2.1. Аргументы командной строки
Вызов GHC принимает следующий вид:
ghc [argument...]
Аргументы командной строки являются либо параметрами, либо именами файлов.
Параметры командной строки начинаются с -. Они не могут быть сгруппированы: -vO отличается от -v -O. Параметры не обязательно должны предшествовать именам файлов: например, ghc *.o -o foo. Все параметры обрабатываются, а затем применяются ко всем файлам; вы не можете, например, вызвать ghc -c -O1 Foo.hs -O2 Bar.hs для применения различных уровней оптимизации к файлам Foo.hs и Bar.hs.
Примечание
Обратите внимание, что параметры командной строки зависимы от порядка, причём аргументы вычисляются слева направо. Это может иметь кажущиеся странными последствия при наличии импликации флагов. Например, рассмотрите -fno-specialise и -O1 (что подразумевает -fspecialise). Эти две командные строки означают очень разные вещи:
-fno-specialise -O1
-fspecialise будет включён, так как -fno-specialise переопределяется -O1.
-O1 -fno-specialise
-fspecialise не будет включён, так как -fno-specialise переопределяет -fspecialise подразумеваемое -O1.
7.1.2.2. Параметры командной строки в исходных файлах
Иногда бывает полезно сделать связь между исходным файлом и необходимыми ему параметрами командной строки достаточно тесной. Например, если файл исходного кода Haskell намеренно использует перекрытие имён, его следует скомпилировать с параметром -Wno-name-shadowing. Вместо того, чтобы поддерживать список параметров для каждого файла в Makefile, это можно сделать непосредственно в исходном файле, используя OPTIONS_GHC псевдоним
{-# OPTIONS_GHC -Wno-name-shadowing #-}
module X where
...
OPTIONS_GHC является псевдонимом заголовка файла (см. псевдоним OPTIONS_GHC).
Только динамические флаги могут использоваться в OPTIONS_GHC псевдониме (см. Динамические и параметры режима).
Обратите внимание, что ваша оболочка командной строки не получает доступ к параметрам файла, они просто включаются в массив аргументов командной строки, который компилятор сохраняет во внутренней памяти, поэтому вы будете сильно разочарованы, если попытаетесь использовать glob и т.д. внутри OPTIONS_GHC.
Примечание
Содержимое OPTIONS_GHC добавляется к параметрам командной строки, поэтому параметры, заданные в исходном файле, переопределяют те, которые заданы в командной строке.
Не рекомендуется перемещать всё содержимое ваших файлов Make в исходные файлы, но в некоторых случаях псевдоним OPTIONS_GHC — это Правильная Вещь. (Если вы используете -keep-hc-file и имеете OPTION флаги в вашем модуле, OPTIONS_GHC будут помещены в сгенерированный .hc файл).
7.1.2.3. Установка параметров в GHCi
Параметры также можно изменить внутри GHCi, используя команду :set.
7.1.3. Динамические и параметры режима
Каждый параметр командной строки GHC классифицируется как динамический или режимный:
Режим: режим может использоваться только в командной строке. Вы можете передать только один флаг режима. Например, --make или -E. Доступные режимы перечислены в Режимы работы.
Динамический: динамический флаг может использоваться в командной строке, в псевдониме OPTIONS_GHC в исходном файле или настраиваться с помощью :set в GHCi.
В таблицах справок по флагам (Справочник по флагам) указывается состояние каждого флага.
7.1.4. Значимые расширения файлов
Имена файлов со «значимыми» расширениями (например, .lhs или .o) вызывают выполнение «правильной» операции над этими файлами.
-
.hs -
Модуль Haskell.
-
.lhs -
Модуль «литературного Haskell».
-
.hspp -
Файл, созданный препроцессором.
-
.hi -
Файл интерфейса Haskell, вероятно, сгенерированный компилятором.
-
.hie -
Расширенный файл интерфейса Haskell, созданный компилятором Haskell.
-
.hc -
Промежуточный файл C, созданный компилятором Haskell.
-
.c -
Файл C, не созданный компилятором Haskell.
-
.ll -
Файл исходного кода языка LLVM-intermediate, обычно созданный компилятором.
-
.bc -
Файл bitcode языка LLVM-intermediate, обычно созданный компилятором.
-
.s -
Файл исходного кода ассемблера, обычно созданный компилятором.
-
.o -
Объектный файл, созданный ассемблером.
Файлы с другими расширениями (или без расширений) передаются напрямую компоновщику.
7.1.5. Режимы работы
Поведение GHC в первую очередь контролируется флагом режима. Может быть задан только один из этих флагов, но он не обязательно должен быть первым параметром в командной строке. Например,
$ ghc Main.hs --make -o my-application
Если флаг режима отсутствует, то GHC перейдёт в режим --make (Использование ghc --make), если указаны какие-либо исходные файлы Haskell, или же он свяжет указанные в командной строке объекты, чтобы создать исполняемый файл.
Доступные флаги режима:
-
--interactive -
Интерактивный режим, также доступный как ghci. Интерактивный режим более подробно описан в Использование GHCi.
-
--make -
В этом режиме GHC автоматически построит многомодульную программу Haskell, определив зависимости самостоятельно. Если у вас простая программа Haskell, это, вероятно, будет гораздо проще и быстрее, чем использование make. Режим «make» описан в Использование ghc --make.
Этот режим является по умолчанию, если указаны какие-либо исходные файлы Haskell, и в этом случае параметр
--makeможно опустить.
-
-e ⟨expr⟩ -
Режим вычисления выражений. Это очень похоже на интерактивный режим, за исключением того, что существует единственное выражение для вычисления (⟨expr⟩), которое задаётся в командной строке. Более подробную информацию см. в разделе Режим вычисления выражений.
-
-E -
Остановка после предварительной обработки (файл
.hspp)
-
-C -
Остановка после генерации C (файл
.hc)
-
-S -
Остановка после генерации ассемблерного кода (файл
.s)
-
-c -
Остановка после генерации объектного (
.o) файлаЭто традиционный режим пакетного компилятора, в котором GHC может компилировать исходные файлы по одному или связывать объекты в исполняемый файл. См. Режим пакетного компилятора.
-
-M -
Режим генерации зависимостей. В этом режиме GHC может генерировать информацию о зависимостях, подходящую для использования в
Makefile. См. Генерация зависимостей.
-
--frontend ⟨module⟩ -
Запуск GHC с указанным плагином передней части. Подробности см. в Плагины передней части.
-
--mk-dll -
Режим создания DLL (только Windows). См. Создание DLL.
-
--help -
-? -
Выводит длинное сообщение об использовании в стандартный вывод и затем завершает работу.
-
--show-iface ⟨file⟩ -
Считывает интерфейс из ⟨file⟩ и выводит его в текстовом формате в
stdout. Напримерghc --show-iface M.hi.
-
--supported-extensions -
--supported-languages -
Выводит поддерживаемые языковые расширения.
-
--show-options -
Выводит поддерживаемые параметры командной строки. Этот флаг можно использовать для автозаполнения в оболочке.
-
--info -
Выводит информацию о компиляторе.
-
--version -
-V -
Выводит строку, включающую номер версии GHC.
-
--numeric-version -
Выводит только числовой номер версии GHC.
-
--print-libdir -
Выводит путь к каталогу библиотек GHC. Это верхняя часть дерева каталогов, содержащих библиотеки GHC, интерфейсы и файлы включения (обычно что-то вроде
/usr/local/lib/ghc-5.04в Unix). Это значение$libdirв файле конфигурации пакета (см. Пакеты).
7.1.5.1. Использование ghc --make
В этом режиме GHC построит многомодульную программу Haskell, следуя зависимостям из одного или нескольких корневых модулей (обычно просто Main). Например, если ваш Main модуль находится в файле Main.hs, вы можете скомпилировать и связать программу так:
ghc --make Main.hs
Фактически, GHC автоматически переходит в режим make, если на командной строке есть файлы Haskell-исходников и не указан другой режим, поэтому в этом случае мы можем просто ввести
ghc Main.hs
Можно указать любое количество имён файлов или модулей; GHC выяснит все модули в программе, следуя импортам из этих начальных модулей. Затем он попытается скомпилировать каждый модуль, который устарел, и, наконец, если есть модуль Main, программа также будет связана в исполняемый файл.
Основные преимущества использования ghc --make по сравнению с традиционными Makefile заключаются в следующем:
- GHC не нужно перезапускать для каждой компиляции, что означает, что он может кешировать информацию между компиляциями. Компиляция многомодульной программы с помощью
ghc --makeможет быть в два раза быстрее, чем запускghcпо отдельности для каждого исходного файла. - Вам не нужно писать
Makefile. - GHC каждый раз пересчитывает зависимости, когда он вызывается, поэтому зависимости никогда не расходятся с исходным кодом.
- Используя флаг
-j[⟨n⟩], вы можете компилировать модули параллельно. Укажите-j ⟨n⟩для компиляции ⟨n⟩ задач параллельно. Если ⟨n⟩ опущено, то оно по умолчанию равно количеству процессоров.
Любой из параметров командной строки, описанных в остальной части этой главы, может быть использован с --make, но обратите внимание, что любые параметры, которые вы указываете в командной строке, будут применяться ко всем компилируемым исходным файлам, поэтому если вы хотите, чтобы какие-либо параметры применялись только к одному исходному файлу, вам нужно использовать предикаты OPTIONS_GHC (см. Параметры командной строки в исходных файлах).
Если программе необходимо связаться с дополнительными объектами (например, некоторым вспомогательным кодом C), то объектные файлы можно указать в командной строке, и GHC включит их при компоновке исполняемого файла.
Для обратной совместимости со скриптами make, при использовании в сочетании с -c, этап компоновки опускается (также как и --make -no-link).
Обратите внимание, что GHC может следовать зависимостям только если доступен исходный файл, поэтому если ваша программа включает модуль, для которого нет исходного файла, даже если у вас есть объектный и интерфейсный файлы для модуля, GHC выдаст ошибку. Исключением из этого правила являются модули пакетов, которые могут или не могут иметь исходные файлы.
Исходные файлы программы необязательно должны находиться в одном каталоге; параметр -i можно использовать для добавления каталогов в путь поиска (см. Путь поиска).
-
-j[⟨n⟩] -
Выполнять компиляцию параллельно, где возможно. GHC будет использовать до ⟨N⟩ потоков во время компиляции. Если N опущено, по умолчанию используется количество процессоров. Обратите внимание, что компиляция модуля может не начаться, пока не будут построены его зависимости.
7.1.5.2. Режим вычисления выражений
Этот режим очень похож на интерактивный, за исключением того, что существует одно выражение для вычисления, которое указывается в командной строке в качестве аргумента к параметру -e:
ghc -e expr
На командной строке могут быть указаны файлы Haskell-исходников, которые будут загружаться точно так же, как и в интерактивном режиме. Выражение вычисляется в контексте загруженных модулей.
Например, чтобы загрузить и запустить программу Haskell, содержащую модуль Main, мы можем сказать:
ghc -e Main.main Main.hs
или мы можем использовать этот режим для вычисления выражений в контексте Prelude:
$ ghc -e "interact (unlines.map reverse.lines)" hello olleh
7.1.5.3. Режим пакетного компилятора
В режиме пакетной компиляции GHC скомпилирует один или несколько исходных файлов, заданных в командной строке.
Первая фаза выполнения определяется суффиксом каждого входного файла, а последняя фаза определяется флагом. Если соответствующий флаг отсутствует, то выполняется весь процесс до компоновки. Эта таблица обобщает:
Этап системы компиляции | Суффикс, указывающий «начать здесь» | Флаг, указывающий «остановиться после» | (суффикс) выходного файла |
|---|---|---|---|
предварительный процессор литералов |
|
| |
предварительный процессор C (опционально) |
|
|
|
компилятор Haskell |
|
|
|
компилятор C (опционально) |
|
|
|
ассемблер |
|
|
|
компоновщик | ⟨другое⟩ |
|
Таким образом, обычный вызов будет:
ghc -c Foo.hs
для компиляции файла Haskell-исходника Foo.hs в объектный файл Foo.o.
Примечание
То, что создаёт сам компилятор Haskell, зависит от используемого генератора кода для бэкенда. Подробнее см. Бэкенды GHC.
Примечание
Предварительная обработка является необязательной, флаг -cpp включает её. Подробнее см. Параметры, влияющие на предварительный процессор C.
Примечание
Параметр -E выполняет только этапы предварительной обработки компилятора, выводя результат в файл.
Примечание
Параметр -C доступен только при сборке GHC в режиме без регистрации. Подробнее см. Компиляция без регистрации.
7.1.5.3.1. Переопределение поведения по умолчанию для файла
Как описано выше, способ обработки файла GHC зависит от его суффикса. Это поведение можно переопределить с помощью опции -x ⟨suffix⟩:
-
-x ⟨suffix⟩ -
Приводит к тому, что все файлы, следующие за этой опцией в командной строке, обрабатываются так, как будто у них есть суффикс ⟨suffix⟩. Например, чтобы скомпилировать модуль Haskell в файле
M.my-hs, используйтеghc -c -x hs M.my-hs.
7.1.6. Опции подробности
См. также режимы --help, --version, --numeric-version, и --print-libdir в Режимы работы.
-
-v -
Опция
-vделает GHC подробным: он сообщает свой номер версии и показывает (в stderr) точный способ вызова каждой фазы системы компиляции. Кроме того, он передает флаг-vбольшинству фаз; каждая фаза сообщает свой номер версии (и, возможно, другую информацию).Пожалуйста, пожалуйста, используйте опцию
-vпри сообщении об ошибках! Знание того, что вы запустили нужные части в нужном порядке, всегда является первой проверкой, которую мы хотим выполнить.
-
-v⟨n⟩ -
Для большего контроля над подробностью вывода компилятора, флаг
-vпринимает необязательный числовой аргумент. Указание-vсамо по себе эквивалентно-v3, а другие уровни имеют следующие значения:-
-v0 -
Отключить все неважные сообщения (это значение по умолчанию).
-
-v1 -
Минимальная подробность: вывести одну строку за компиляцию (это значение по умолчанию, когда
--makeили--interactiveвключены). -
-v2 -
Вывести имя каждой фазы компиляции по мере ее выполнения. (эквивалентно
-dshow-passes). -
-v3 -
То же, что и
-v2, за исключением того, что дополнительно печатается полная командная строка (если применимо) для каждой фазы компиляции. -
-v4 -
То же, что и
-v3, за исключением того, что дополнительно печатается промежуточное представление программы после каждой фазы компиляции (исключая предварительно обработанные файлы и файлы C/ассемблера).
-
-
-fprint-potential-instances -
Когда GHC не может найти экземпляр класса, он отображает короткий список известных ему экземпляров. С этим флагом он выводит все известные ему экземпляры.
-
-fhide-source-paths -
Начиная с минимальной подробности (
-v1, см.-v), GHC отображает имя, путь к исходному файлу и путь к целевому файлу каждого скомпилированного модуля. Этот флаг можно использовать для уменьшения вывода GHC, скрывая пути к исходным и целевым файлам.
Следующие флаги управляют способом отображения GHC типов в сообщениях об ошибках и в GHCi:
-
-fprint-unicode-syntax -
При включенном флаге GHC выводит сигнатуры типов, используя символы Unicode из расширения
UnicodeSyntax. Например,ghci> :set -fprint-unicode-syntax ghci> :t +v (>>) (>>) ∷ Monad m ⇒ ∀ a b. m a → m b → m b
-
-fprint-explicit-foralls -
Использование
-fprint-explicit-forallsзаставляет GHC выводить явноеforallквантификацию на верхнем уровне типа; обычно это подавляется. Например, в GHCi:ghci> let f x = x ghci> :t f f :: a -> a ghci> :set -fprint-explicit-foralls ghci> :t f f :: forall a. a -> a
Однако, независимо от установки флага, квантификаторы выводятся в следующих случаях:
-
Для вложенного
foralls, например:ghci> :t GHC.ST.runST GHC.ST.runST :: (forall s. GHC.ST.ST s a) -> a
-
Если какой-либо из квантифицированных переменных типов имеет вид, содержащий переменную вида, например:
ghci> :i Data.Type.Equality.sym Data.Type.Equality.sym :: forall k (a :: k) (b :: k). (a Data.Type.Equality.:~: b) -> b Data.Type.Equality.:~: a -- Defined in Data.Type.Equality
Этот флаг также включает вывод выведенных переменных типа в фигурных скобках. См. Выведенные и заданные переменные типа.
-
-
-fprint-explicit-kinds -
Использование
-fprint-explicit-kindsзаставляет GHC выводить аргументы вида в типах, которые обычно подавляются. Это может быть важно, когда вы используете полиморфизм видов. Например:ghci> :set -XPolyKinds ghci> data T a (b :: l) = MkT ghci> :t MkT MkT :: forall k l (a :: k) (b :: l). T a b ghci> :set -fprint-explicit-kinds ghci> :t MkT MkT :: forall k l (a :: k) (b :: l). T @{k} @l a b ghci> :set -XNoPolyKinds ghci> :t MkT MkT :: T @{*} @* a bВ выходных данных выше обратите внимание, что
Tимеет две переменные вида (kиl) и две переменные типа (aиb). Обратите внимание, чтоkявляется выведенной переменной, аlявляется заданной переменной (см. Выведенные и заданные переменные типа), поэтому они отображаются с помощью немного другой синтаксической конструкции в типеT @{k} @l a b. Применениеl(с@l) является стандартным синтаксисом для видимого применения типа (см. Видимое применение типа). Однако применениеk(с@{k}) использует гипотетический синтаксис для видимого применения типа выведенной переменной типа. Этот синтаксис в настоящее время не доступен программисту, но он всё же отображается, когда включён-fprint-explicit-kinds.
-
-fprint-explicit-coercions -
Использование
-fprint-explicit-coercionsзаставляет GHC выводить приведения типов. При попытке доказать равенство типов разных видов, GHC использует приведения типов на уровне типов. Пользователям редко нужно видеть их, так как они предназначены для внутренней работы.
-
-fprint-axiom-incomps -
Использование
-fprint-axiom-incompsсообщает GHC выводить несовместимости между уравнениями закрытых семейств типов, когда они выводятся командой:infoили--show-iface ⟨file⟩.ghci> :i Data.Type.Equality.== type family (==) (a :: k) (b :: k) :: Bool where (==) (f a) (g b) = (f == g) && (a == b) (==) a a = 'True (==) _1 _2 = 'False ghci> :set -fprint-axiom-incomps ghci> :i Data.Type.Equality.== type family (==) (a :: k) (b :: k) :: Bool where {- #0 -} (==) (f a) (g b) = (f == g) && (a == b) {- #1 -} (==) a a = 'True -- incompatible with: #0 {- #2 -} (==) _1 _2 = 'False -- incompatible with: #1, #0Уравнения нумеруются, начиная с 0, а комментарий после каждого уравнения ссылается на все предыдущие уравнения, с которыми оно несовместимо.
-
-fprint-equality-relations -
Использование
-fprint-equality-relationsзаставляет GHC различать отношения равенства при выводе. Например,~— это однородное поднятое равенство (виды его аргументов одинаковы), в то время как~~— это разнородное поднятое равенство (виды его аргументов могут быть разными), и~#— это разнородное неподнятое равенство, внутреннее отношение равенства, используемое в решении GHC. В целом, пользователи не должны беспокоиться о тонкостях;~— это то, что вам, вероятно, нужно. Без-fprint-equality-relations, GHC выводит все эти значения как~. См. также Ограничения равенства.
-
-fprint-expanded-synonyms -
При включенном флаге GHC также выводит типы, расширенные синонимами типов, в сообщениях об ошибках типа. Например, с этими синонимами типов:
type Foo = Int type Bar = Bool type MyBarST s = ST s Bar
Это сообщение об ошибке:
Couldn't match type 'Int' with 'Bool' Expected type: ST s Foo Actual type: MyBarST s
Преобразуется в это:
Couldn't match type 'Int' with 'Bool' Expected type: ST s Foo Actual type: MyBarST s Type synonyms expanded: Expected type: ST s Int Actual type: ST s Bool
-
-fprint-typechecker-elaboration -
При включенном флаге GHC также выводит дополнительную информацию от типизатора в предупреждениях. Например:
main :: IO () main = do return $ let a = "hello" in a return ()
Это сообщение о предупреждении:
A do-notation statement discarded a result of type ‘[Char]’ Suppress this warning by saying ‘_ <- ($) return let a = "hello" in a’ or by using the flag -fno-warn-unused-do-bind
Преобразуется в это:
A do-notation statement discarded a result of type ‘[Char]’ Suppress this warning by saying ‘_ <- ($) return let AbsBinds [] [] {Exports: [a <= a <>] Exported types: a :: [Char] [LclId, Str=DmdType] Binds: a = "hello"} in a’ or by using the flag -fno-warn-unused-do-bind
-
-fdefer-diagnostics -
Заставляет GHC группировать диагностические сообщения по степени серьезности и выводить их после других сообщений при построении многомодульной программы Haskell. Этот флаг может сделать диагностические сообщения более заметными при совместном использовании с
--makeи-j[⟨n⟩]. В противном случае, найти соответствующие ошибки или пропустить предупреждения, когда они перемешаны с многими другими сообщениями, может быть сложно.
-
-fdiagnostics-color=⟨always|auto|never⟩ -
Приводит к отображению сообщений об ошибках GHC с цветами. Для этого терминал должен поддерживать ANSI-коды цвета, в противном случае текст отобразится искажённо. Значение по умолчанию —
auto, что означает, что GHC попытается определить, поддерживает ли терминал цвета, и выбрать соответствующий вариант.Точная цветовая схема контролируется переменной среды
GHC_COLORS(илиGHC_COLOURS). Она может быть установлена в виде списка значений, разделенных двоеточием, парkey=value. Вот значения по умолчанию:header=:message=1:warning=1;35:error=1;31:fatal=1;31:margin=1;34
Каждое значение должно быть подстрокой SGR (Select Graphic Rendition). Форматирование каждого элемента может наследоваться от родительских элементов. Например, если
headerоставлено пустым, оно будет унаследовать форматирование отmessage. В противном случае, еслиheaderустановлено в1(жирный шрифт), оно будет полужирным, но при этом унаследует цвет отmessage.В настоящее время, в основном сообщении, действует следующее дерево наследования:
-
message-
headerwarningerrorfatal
-
В диагностике с символом «^» в настоящее время нет никакого наследования между
margin,warning,error, иfatal.Переменная среды также может быть установлена в магические значения
neverилиalways, что эквивалентно установке соответствующего флага-fdiagnostics-color, но с более низким приоритетом. -
-
-fdiagnostics-show-caret -
Управляет отображением строки исходного кода, где была обнаружена ошибка. Это также влияет на связанный символ «^», указывающий на проблемный участок кода. Флаг включён по умолчанию.
-
-ferror-spans -
Приводит к тому, что GHC выводит полный диапазон исходного кода синтаксической сущности, относящейся к сообщению об ошибке. Обычно GHC выводит только местоположение начала синтаксической сущности.
Например:
test.hs:3:6: parse error on input `where'
преобразуется в:
test296.hs:3:6-10: parse error on input `where'
И также возможны многострочные диапазоны:
test.hs:(5,4)-(6,7): Conflicting definitions for `a' Bound at: test.hs:5:4 test.hs:6:7 In the binding group for: a, b, aОбратите внимание, что нумерация строк начинается с единицы, а нумерация столбцов — с нуля. Такое решение было принято для соответствия существующей практике (то есть, так делает Emacs).
-
-fkeep-going -
- Since
-
8.10.1
Приводит к продолжению компиляции, если в модуле есть ошибка. Любые обратные зависимости удаляются немедленно, и вся компиляция по-прежнему отмечается как ошибка. Этот параметр не влияет, если используется параллельная компиляция (
-j[⟨n⟩]).
-
-freverse-errors -
Приводит к выводу ошибок в обратном порядке номеров строк, так что ошибки и предупреждения, возникающие позже в файле, отображаются первыми.
-
-H ⟨size⟩ -
Устанавливает минимальный размер кучи в ⟨size⟩. Этот параметр эквивалентен
+RTS -Hsize, см. параметры RTS для управления сборщиком мусора.
-
-Rghc-timing -
Выводит краткое сводное описание статистики времени выполнения для запуска GHC. Этот параметр эквивалентен
+RTS -tstderr, см. параметры RTS для управления сборщиком мусора.
7.1.7. Параметры, специфичные для платформы
Некоторые параметры имеют смысл только для определённых целевых платформ.
-
-msse2 -
(только x86, добавлено в GHC 7.0.1) Использует регистры и набор инструкций SSE2 для выполнения операций с плавающей точкой при использовании генератора кода для нативного кода. Это даёт существенное улучшение производительности для операций с плавающей точкой, но полученный скомпилированный код будет работать только на процессорах, поддерживающих SSE2 (Intel Pentium 4 и более поздние, или AMD Athlon 64 и более поздние). Backend LLVM также будет использовать SSE2, если ваш процессор его поддерживает, но обнаруживает это автоматически, поэтому флаг не требуется.
SSE2 используется безусловно на платформах x86-64.
-
-msse4.2 -
(только x86, добавлено в GHC 7.4.1) Использует набор инструкций SSE4.2 для реализации некоторых операций с плавающей точкой и операций по битам при использовании генератора кода для нативного кода. Полученный скомпилированный код будет работать только на процессорах, поддерживающих SSE4.2 (Intel Core i7 и более поздние). Backend LLVM также будет использовать SSE4.2, если ваш процессор его поддерживает, но обнаруживает это автоматически, поэтому флаг не требуется.
-
-mbmi2 -
(только x86, добавлено в GHC 7.4.1) Использует набор инструкций BMI2 для реализации некоторых операций по битам при использовании генератора кода для нативного кода. Полученный скомпилированный код будет работать только на процессорах, поддерживающих BMI2 (Intel Haswell и более новые, AMD Excavator, Zen и более новые).
7.1.8. Разные флаги
Некоторые флаги имеют смысл только для определённого случая использования.
-
-ghcversion-file ⟨path to ghcversion.h⟩ -
При использовании GHC для компиляции файлов C, GHC добавляет пути к включению пакетов и включает
ghcversion.hнапрямую. Компилятор будет искать путь к файлуghcversion.hпакетаrtsв базе данных пакетов. В некоторых случаях база данных пакетов компилятора не содержит пакетrts, или нужно указать конкретныйghcversions.hдля включения. Этот параметр можно использовать для указания пути к файлуghcversions.hдля включения. Это в первую очередь предназначено для использования системой сборки GHC.
7.1.8.1. Другие переменные среды
GHC также может быть настроен с помощью переменных среды. В настоящее время единственная поддерживаемая переменная — GHC_NO_UNICODE, которая, при установке, отключает вывод Unicode независимо от настроек локали. GHC_NO_UNICODE может быть установлена на любое значение (даже пустая строка) для активации этого поведения.
© 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/8.10.2/docs/html/users_guide/using.html