Имейте в виду, что то, что промежуточное представление основано на стеке, не означает, что сгенерированный машинный код основан на стеке. Поскольку код преобразуется из промежуточной формы в машинный код, он в основном перекомпилируется - с учетом локальной оптимизации.
Одна из приятных особенностей использования промежуточного представления на основе стека заключается в том, что вы не привязаны к какой-либо конкретной архитектуре.
Представьте, решили ли они использовать теоретическую систему на основе регистров в качестве промежуточной формы. Сколько регистров они должны выбрать? 8? 16? 64? Если у вашего целевого процессора больше фактических регистров, чем у промежуточной формы, то вы упустили возможные оптимизации. Если у вашей цели меньше фактических регистров, чем у промежуточных, тогда ваши оптимизации контрпродуктивны, потому что эти регистры все равно сбрасываются в память.
Даже на современных процессорах вы получаете большую разницу при компиляции до x86 против x64 - не говоря уже о альтернативных архитектурах (ARM) или будущих архитектурах.
Для чего-то подобного хорошо, что они сохранили его в простейшей форме, а затем полагаются на оптимизацию во время окончательной генерации кода, чтобы сопоставить его с фактическим оборудованием.