Суперкомпиляция может рассматриваться как обобщение частичной оценки.Идея частичной оценки заключается в том, что многие части программы могут быть оценены во время компиляции, и так должно быть.Суперкомпиляция расширяет это, оценивая вещи, которые не могут быть полностью выполнены во время компиляции, например, превращение map f (map g xs)
в map (f . g) xs
без чего-либо, кроме определения map
(По крайней мере, я думаю, что я получил правильную частичную оценку - я 'мы только много читали о суперкомпиляции).
Еще один способ взглянуть на него - это сочетание многих других оптимизаций, таких как вырубка лесов, специализация и встраивание.Действуя так, как будто он уже знает входные данные для функций и оценки, он может получить более прямой метод вычисления результата - он может избавиться от промежуточных структур данных, увидев, как они будут использоваться, или он может подключить все возможные значения изатем оберните результат в case
, или сделайте что-нибудь еще с его притворными значениями.
У Макса Болингброка есть ряд полезных статей по этому вопросу - я рекомендую первую, Суперкомпиляция по оценке , как введение.Раздел 2 представляет предмет в качестве примера, а остальное, хотя и немного сложное для понимания, очень информативно описывает процесс.У Нила Митчелла также есть количество хороших презентаций , описывающих его.
Надеюсь, это поможет.