При программировании в Haskell (и особенно при решении проблем Project Euler, где субоптимальные решения имеют тенденцию подчеркивать потребности в ЦП или памяти), я часто озадачиваюсь, почему программа ведет себя так, как она есть. Я просматриваю профили, стараюсь ввести некоторую строгость, выбираю другую структуру данных... но в основном это нащупывает в темноте, потому что мне не хватает хорошей интуиции.
Кроме того, хотя я знаю, как Lisp, Prolog и императивные языки, как правило, реализуются, я понятия не имею о реализации ленивого языка. Мне тоже немного любопытно.
Следовательно, я хотел бы узнать больше о всей цепочке от источника программы до модели исполнения.
Что мне интересно:
-
какие типичные оптимизации применяются?
-
Каков порядок выполнения, когда есть несколько кандидатов для оценки (хотя я знаю, что он управляется из необходимых выходов, все же могут быть большие различия в производительности между первой оценкой A, а затем B или сначала оценкой B что вам вообще не нужен A)
-
как изображены thunks?
-
Как используются стек и куча?
-
что такое CAF? (профилирование иногда указывает на то, что точка доступа есть, но я не знаю)