Возможно, спорить не буду, не разбираюсь в этом. А все виды циклов и goto, например, тоже свернутся в одно и то же?
Да. Все циклы можно привести к единому виду. Спагети из GOTO тоже трансформируется
хоть и немного сложнее (дублирование веток кода и оптимизация его).
Это то ли у Вирта, то ли у Дейкстры было описание всего этого хозяйства по
трансформации кода (с примерами приведения циклов к единому виду и пр).
На самом деле современные компиляторы используют часть этих техник. Поэтому
сейчас можно увидеть в сообщениях об ошибках чтото типа того, что
- Обнаружен неиспользуемый кусок кода
- Обнаружена переменная которая инициализированна, но не используется
- Не все пути выполнения функции возвращают результат
- и пр.
Ок. Пусть будет printf("%d",i). Тут вся соль в том, чему же будет равно i после всего этого
Если AST распарсеного кода и AST правильного ответа совпадут то неважно
чему оно равно, важно то, что это гарантирует, что алгоритм закодирован
правильно и дает верные результаты. Т.е. нет никакой разницы чему равно
z в выражениях
студента // z := (a + b) - b + b +70 - 35 * 2 - (b + a) * 0
и
правильного // z := a + b;
Оба выражения дадут одинаковый AST, а значит z будет вычеслен одинакого
в обоих случаях
Где то попадалась очень любопытная оптимизация/обфускация циклов от Криса Касперски. Попробую найти.
Вряд ли он придумал что-то новое. Вынос инвариантов за тело цикла и
раскручивание цикла в код С++ компиляторые делают уже очень давно.
А круче Интела при распаралеливании цикла вообще быть нельзя.