Использование ghc -e
в значительной степени эквивалентно вызову ghci
. Я считаю, что GHC runhaskell
компилирует код во временный исполняемый файл перед его запуском, в отличие от интерпретации его как ghc -e
/ ghci
, но я не уверен на 100%.
$ time echo 'Hello, world!'
Hello, world!
real 0m0.021s
user 0m0.000s
sys 0m0.000s
$ time ghc -e 'putStrLn "Hello, world!"'
Hello, world!
real 0m0.401s
user 0m0.031s
sys 0m0.015s
$ echo 'main = putStrLn "Hello, world!"' > hw.hs
$ time runhaskell hw.hs
Hello, world!
real 0m0.335s
user 0m0.015s
sys 0m0.015s
$ time ghc --make hw
[1 of 1] Compiling Main ( hw.hs, hw.o )
Linking hw ...
real 0m0.855s
user 0m0.015s
sys 0m0.015s
$ time ./hw
Hello, world!
real 0m0.037s
user 0m0.015s
sys 0m0.000s
Насколько сложно просто скомпилировать все ваши "скрипты" перед их выполнением?
Редактировать
Ах, обеспечение двоичных файлов для нескольких архитектур действительно является проблемой. Я шел по этой дороге раньше, и это не очень весело ...
К сожалению, я не думаю, что можно улучшить загрузку любого компилятора Haskell. Декларативный характер языка означает, что необходимо сначала прочитать всю программу, даже прежде чем пытаться что-либо проверить, не обращать внимания на выполнение, а затем вы либо столкнетесь с затратами на анализ строгости, либо с ненужной ленью и громом.
Популярные языки сценариев (shell, Perl, Python и т. Д.) И языки на основе ML требуют только одного прохода ... хорошо, ML требует статического прохода проверки типов, а Perl имеет этот забавный 5 проходов схема (две из которых работают в обратном направлении); В любом случае, процедурный подход означает, что компилятору / интерпретатору гораздо проще собрать вместе кусочки программы.
Короче говоря, я не думаю, что возможно стать намного лучше, чем это. Я не проверял, есть ли у Hugs или GHCi более быстрый запуск, но есть разница, отличная от не-Haskell языков.