Требуется: хорошее определение термина "понижение" в контексте компиляторов

Может ли кто-нибудь указать мне на хорошее определение термина "понижение" в контексте компиляторов?

Из того, что я могу сказать, это перевод операции более высокого уровня в эквивалентную комбинацию операций нижнего уровня, но я не уверен, и я не могу найти ее после нескольких минут поиска в Google. (Существует несколько способов "понижения", например, в GCC или LLVM, но ссылки на определение.)

Ответ 1

р. Доббс только что опубликовал статью Уолтера Брайта (о славе dlang), где он упоминает термин:

Понижение

Одна семантическая техника, которая очевидна в ретроспективе (но, по словам Андрея Александреску, чтобы указать на меня), называется "опусканием". Он состоит из внутреннего переписывания более сложных семантических конструкций с точки зрения более простых. Например, петли while и циклы foreach могут быть переписаны в терминах циклов for. Тогда остальная часть кода должна иметь дело только с циклами for. Это оказалось, чтобы обнаружить пару скрытых ошибок в том, как в то время как циклы были реализованы в D, и так была хорошая победа. Он также использовался для переписывания операторов scope guard в терминах операторов try-finally и т.д. Каждый случай, когда это можно найти в семантической обработке, будет выиграть для реализации.

Если окажется, что на языке есть некоторые специальные правила, которые предотвращают это "понижающее" переписывание, может быть хорошей идеей вернуться и вернуться к языковому дизайну.

В любое время, когда вы можете найти общность в обработке семантических конструкций, это дает возможность уменьшить усилия и ошибки в реализации.

Ответ 2

Я не могу найти хорошую ссылку с определением, но я думаю, что могу привести хороший пример. В LLVM LLVM IR поддерживает несколько размеров целых чисел. Большинство компиляторов C/С++, включая clang, поддерживают длинный длинный и 64-битный тип данных. Многие 32-разрядные процессоры, такие как mips (32 бит), не имеют инструкций, которые могут выполнять, например, 64-битное дополнение или сравнение. LLVM "снизит" эти 64-битные операции до операций, обычно 32 бит, что может сделать процессор.

В случае сравнения int64_t, например, LLVM опустит его на

compare the upper 32 bits with a signed comparison
if they are equal, compare the lower 32 bits with an unsigned comparison

Некоторое опускание может показаться довольно причудливым. Например, на процессоре, который не поддерживает инструкцию умножения, простые умножения могут превращаться в сдвиги и добавлять, тогда как более сложные могут превратиться в вызов библиотеки времени выполнения.