Соглашаться со мной вовсе не обязательно ;) Что "лучшая", а точнее, важнейшая, наиболее сильно сказывающаяся оптимизация производится на уровне алгоритмов, я абсолютно согласен (сколько не оптимизируй пузырьковую сортировку, она не станет лучше квиксорта). Однако с остальным поспорю и начну как раз с почти что конца.
Цитата:
Плюс оптимизирующего компилятора в том, что он соблюдёт абсолютно все правила оптимизации, и сделает это безошибочно
Это утверждение, строго говоря, неверно
абсолютно. Например, и у Дельфи, и у Вижуал Си, и у Интел Си есть оптимизация, однако качество её очень различается. Поэтому никак нельзя говорить, что компилятор соблюдает "абсолютно все правила оптимизации" -- он соблюдает лишь те из них, что в него заложили разработчики. Точно так же нельзя утверждать, что он "сделает это безошибочно". Не знаю, кто как, а мне с ошибками в трансляторах сталкиваться приходилось (в Турбо Паскале была какая-то, в разных версиях Майкрософт Си, по современным -- не знаю, но исключать заранее не могу).
Цитата:
Дело в том, что процессорная оптимизация это чисто формальный процесс, и соответственно качество оптимизации напрямую зависит от точности соблюдения этих формальных правил
Опять-таки далеко не всегда это так. Если говорить о "раскладывании" машинных инструкций в потоке команд наиболее оптимальным для данного процессора образом -- да, это процесс чисто формальный, и
хороший компилятор это сделает не хуже программиста -- но, как я уже заметил выше, далеко не каждый компилятор умеет выполнять соответствующую оптимизацию (ну а если говорить точнее, самым оптимальным является интеловский -- есно, для интеловских же процессоров).
Ещё одна вещь, с которой транслятор справится не хуже человека, -- это оптимизация деления на константу (замена операции деления на смесь умножений, вычитаний и сдвигов). Однако и её делают не все трансляторы (борландовские не умеют, мелкомягкие, интеловский и гнусные умеют, насчёт ваткома и других не в курсе).
Наконец, есть и более "хитрые" виды низкоуровневой оптимизации. Возьмём, например, такой оператор:
if a = b then c:= 0 else if a > b then c:= 1 else c:= -1;
Многие ли компиляторы догадаются не странслировать его "в лоб", с помощью команды cmp, двух условных переходов, трёх мовов и двух безусловных переходов? Лично я не знаю, опытов не проводил, знаю лишь, что Дельфи именно так "в лоб" и странслирует, но эффективность компилятора Дельфи общеизвестна (никакая, грубо говоря). Хотя с точки зрения скорости на процессорах, начиная с Пентиума Про (вроде бы), эффективнее будет вообще обойтись без переходов:
cmp ebx, ecx
cmove eax, ConstZero
cmova eax, ConstPlus1
cmovb eax, ConstMinus1
Подобных примеров можно придумать достаточно много, так что согласиться с тем, что "интеллект программиста тут не имеет ни какого значения", не могу никак.