4

Я работаю над проектом по автоматическому преобразованию пользовательского языка на 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:

Можно предположить, что функция является чистым.

+5

Эта оптимизация будет работать, только если вам гарантировано, что 'someFunction' всегда будет возвращать одно и то же значение для одного и того же входа; есть ли у вас какие-либо гарантии? – fge

+0

Вы должны сделать вывод, что ваша функция чиста (не имеет побочных эффектов). Как легко это сделать, зависит от вашего языка. Для * в основном * функционального языка вывод чистоты тривиален, иначе вы можете иметь только очень консервативные правила вывода. Детали также зависят от вашего промежуточного представления. Если это SSA/ArraySSA (т. Е. Вы удалили все локальные передачи памяти), вы можете пометить функцию как чистую, если она не загружает и не сохраняет и только вызывает другие чистые функции. –

+0

Можно считать, что функция чиста. –

ответ

1

Это называется Common subexpression elimination.

Как правило, для выполнения анализа потока данных обычно требуется реализовать полный компилятор. Алгоритм приведен в Dragon Book, «6.1.2 Метод значений для построения DAG» (для локальной CSE как минимум).

+0

Это не совсем обычное исключение подвыражения, потому что вызов функции может иметь побочные эффекты и, следовательно, может быть невозможно устранить его. – templatetypedef

+3

Он заявил, что функции, которые он хочет оценить, являются чистыми – Cine

 Смежные вопросы

  • Нет связанных вопросов^_^