Что такое файлы .hi и .o, сгенерированные GHC (в Linux)? - PullRequest
2 голосов
/ 01 июня 2019

Я только начинаю работать с Haskell и функциональным программированием в целом. После компиляции и запуска моей первой программы на Haskell я заметил, что GHC (в Linux) генерирует три отдельных файла из одного исходного файла .hs: файл .hi, файл .o и, наконец, исполняемый файл. Какова цель каждого из этих файлов? Практически, когда файлы .hi и .o фактически используются?

Из моего небольшого опыта работы с C я думаю, что .o - это объектный файл. Поиск в Google показывает, что .hi - это «файл интерфейса».

Ответы [ 2 ]

9 голосов
/ 01 июня 2019

.o в точности совпадает с объектными файлами C; файл .hi является «файлом интерфейса»; он содержит информацию о .o, которая понадобится GHC, если вы скомпилируете другие модули, чтобы иметь возможность ссылаться на этот файл .o (указанная информация не может быть сохранена в стандартном файле .o).

Можно сказать, что файл .hi является эквивалентом заголовочных файлов C (то есть с расширением .h), только они генерируются GHC из исходного источника на Haskell.

Таким образом, .hi используется, когда GHC компилирует другие модули, и .o используется, когда все модули объединяются для создания исполняемого файла.

Вы можете безопасно удалить файлы .hi и .o, как только вы успешно сгенерировали исполняемый файл (или сохраните их, если хотите внести небольшие изменения и быстро перестроить - это сэкономит время на ненужные перекомпиляции).

2 голосов
/ 01 июня 2019

.o файлы действительно являются объектными файлами. В основном куски байт-кода готовы к связыванию.

.hi файлы являются интерфейсными файлами. Короткая версия состоит в том, что они содержат что-то вроде сигнатур скомпилированного типа вместе с информацией, которая позволяет GHC выполнять оптимизацию через границы файлов.


Лично я нахожу, что эти файлы в моем рабочем каталоге достаточно раздражают, и я добавляю -outputdir ../tmp к своему вызову ghc.

...