Представьте себе наивный компилятор типизированного лямбда-исчисления (чтобы исключить довольно болезненную проблему бездействия и неявной рекурсии), которая использует нормализацию (включая замены под lambdas) как «оптимизацию».Пример замены времени компиляции, ухудшающего программу
Для простых программ, когда большинство или все переменные используются только один раз, нормализация приводит к сокращению и ускорению программ.
Для меня это «очевидно», что в целом это не очень хорошая идея. То есть, поскольку нормализация уменьшает совместное использование, есть условия, которые ухудшаются из-за оптимизации. Термин 2 умножений
\x -> let a = x * x in a * a
получает "оптимизировано" в
\x -> (x * x) * (x * x)
с 3 из них.
Как построить пример, который становится хуже? Есть ли термин, который, вероятно, переполнит ОЗУ при нормализации?
Мы работаем в системе типов с сильной нормализацией, поэтому расхождение невозможно, например. в подходящем подмножестве системы F с константами и дельта-правилами.
Или с «свободным» подходом к добавлению констант, таких как mul
, например.
\mul x -> let a = mul x x in mul a a
Таким образом, вместо добавления констант они являются «дополнительными параметрами, предоставляемыми во время выполнения».
Вопрос может казаться принадлежащим SE Computer Science, но IMO это действительно начальный уровень, поэтому я считаю, что здесь более уместно.
[сСт. se] - это сайт для всех видов вопросов, связанных с cs, включая начальные уровни. [cstheory.se] - это место для вопросов на уровне исследований. –