Haskell (с компилятором GHC
) работает на намного быстрее, чем вы ожидаете. При правильном использовании он может приблизиться к языкам низкого уровня. (Любимая вещь для Haskellers - попытаться получить в пределах 5% от C (или даже побить его, но это означает, что вы используете неэффективную программу на C, поскольку GHC компилирует Haskell в C).) Мой вопрос: почему?
Хаскель декларативен и основан на лямбда-исчислении. Архитектура машин явно обязательна, грубо говоря, на основе машин Тьюринга. Действительно, у Haskell даже нет определенного порядка оценки. Кроме того, вместо машинных типов данных вы постоянно создаете алгебраические типы данных.
Самое странное, что это функции высшего порядка. Вы могли бы подумать, что создание функций на лету и их использование приведет к замедлению работы программы. Но использование функций более высокого порядка на самом деле делает Haskell быстрее. Действительно, кажется, что для оптимизации кода на Haskell вам нужно сделать его более элегантным и абстрактным, а не более машиноподобным. Похоже, что ни одна из более продвинутых функций Haskell даже не повлияет на его производительность, если они не улучшат ее.
Извините, если это звучит бессмысленно, но вот мой вопрос: Почему Haskell (скомпилирован с GHC) так быстр, учитывая его абстрактную природу и отличия от физических машин?
Примечание. Причина, по которой я говорю, что C и другие императивные языки чем-то похожи на машины Тьюринга (но не в той степени, в которой Haskell похож на лямбда-исчисление) состоит в том, что в императивном языке у вас есть конечное число состояний (или номер строки) вместе с магнитной лентой (тараном), так что состояние и текущая лента определяют, что делать с лентой. Информацию о переходе от машин Тьюринга к компьютерам см. в статье в Википедии Эквиваленты машин Тьюринга.