Я работаю над проектом по автоматическому преобразованию пользовательского языка на Java и попросил сделать некоторые основные оптимизации кода во время процесса преобразования. Например, пользовательский код может иметь что-то вроде:Автоматические методы оптимизации кода
if someFunction(a, b) > x:
do something
else:
return someFunction(a, b) + y
в данном случае, SomeFunction вызывается несколько раз с теми же входами, поэтому дополнительные характеристики могут быть получены за счет кэширования значения SomeFunction() и только назвав его один раз. Таким образом, «оптимизированная» версия приведенного выше кода может выглядеть примерно так:
var1 = someFunction(a, b)
if var1 > x:
do something
else:
return var1 + y
В настоящее время это делается вручную в процессе преобразования. Я запускаю программу для преобразования кода на пользовательском языке в Java и затем вручную просматриваю преобразованный код, чтобы увидеть, что можно оптимизировать. Я хочу автоматизировать процесс оптимизации, так как эти проблемы повторяются снова и снова. Люди, которые пишут код на пользовательском языке, не хотят беспокоиться о таких вещах, поэтому я не могу попросить их просто убедиться, что код, который они мне дают, уже оптимизирован.
Какие учебники, документы и т. Д. Подробно описывают, как это делается в современных компиляторах? Я не хочу слишком много изобретать колесо. Заранее спасибо.
Редактировать 1:
Можно предположить, что функция является чистым.
Эта оптимизация будет работать, только если вам гарантировано, что 'someFunction' всегда будет возвращать одно и то же значение для одного и того же входа; есть ли у вас какие-либо гарантии? – fge
Вы должны сделать вывод, что ваша функция чиста (не имеет побочных эффектов). Как легко это сделать, зависит от вашего языка. Для * в основном * функционального языка вывод чистоты тривиален, иначе вы можете иметь только очень консервативные правила вывода. Детали также зависят от вашего промежуточного представления. Если это SSA/ArraySSA (т. Е. Вы удалили все локальные передачи памяти), вы можете пометить функцию как чистую, если она не загружает и не сохраняет и только вызывает другие чистые функции. –
Можно считать, что функция чиста. –