9.5 Пара идей для разработчика стековых машин
==180
Есть две интересные идеи, относящиеся к архитектуре стековых машин, которые не используются пока повсеместно, но выглядят весьма привлекательно для будущих разработок.
9.5.1 Условный возврат из подпрограмм
Одной из конструктивных особенностей, подмеченных Doran ( 1972 ), является ненужность условных переходов в стековой архитектуре: всё, что ей необходимо - условный выход из подпрограмм [* другими словами, при разработке процессора можно выкинуть команду условного перехода и, если получится, уменьшить поле кода операции ] . Рассмотрим оператор «IF» языка высокого уровня. Если не учитывать необязательную ветвь «ELSE», «IF» напоминает участок кода с одним входом и двумя выходами. На входе вычисляется условие. Первый выход выполняется, если условие ложно, и в этом случае никакие действия не выполняются. Второй выход расположен в конце фрагмента после завершения всех операций.
Обычно оператор «IF» реализуется с использованием условного перехода, который выполняется, если условие ложно. Рассмотрим, вместо этого, подпрограмму, содержащую весь код оператора «IF». Точкой входа будет вызов такой подпрограммы. Первым выходом станет условный выход из неё, выполняемый, если условие ложно. Вторым выходом будет безусловный возврат управления.
Описанная схема полностью исключает условные переходы, использующие поле адреса [* бывают ещё команды вида «пропустить следующую инструкцию, если..» ] . Всё, что нужно - директива условного выхода. Данная техника очень хорошо подходит стековым машинам из-за их низких накладных расходов на вызов подпрограмм и выход из них. Она может привести к появлению более эффективных конструкций вычислительного ядра.
9.5.2 Использование стека для хранения кода
Другое интересное предложение по исполнению программ на стековых машинах было сделано Tsukamoto ( 1977 ). Он исследовал сильные и слабые стороны самомодифицирующегося кода. Такой код может быть очень эффективен, но специалисты повсеместно избегают его, потому что он слишком опасен. Самомодифицирующийся код изменяет программу так, что программист не может быть уверен, что конкретная ассемблерная инструкция будет выполняться правильно в течение всего времени работы программы.
Идея позволяет использовать самомодифицирующийся код без указанного недостатка. Tsukamoto предложил использовать стек времени исполнения для хранения изменённых исполняемых сегментов. Код может готовиться приложением в процессе работы, но уже не повреждает программную память. После выполнения код удаляется простой очисткой стека.
==181
Ни одно из предложенных решений в настоящее время массово не используется, но одно из них или оба сразу можно найти в некоторых прикладных программах.
==181