IN и OUT действительно не были добавлены в язык именно потому, что это вопрос оптимизации, который должен бы решаться на уровне компилятора, а не языка. Правда, я с этим не вполне согласен. Я бы хотел иметь возможность указать IN и OUT не только для того, чтобы дать подсказку компилятору по оптимизации кода, но и для того, чтобы он проверил, действительно ли я не пытаюсь изменить значение IN-параметра или использовать OUT-параметр до инициализации. Ведь случаи могут быть нетривиальными - например, если я передаю IN-параметр в другую процедуру, то компилятор должен это позволить только в том случае, если в той процедуре он тоже будет воспринят как IN или value:## Код:
```
PROCEDURE Out (OUT param: ARRAY OF CHAR);
BEGIN
   (* инициализация param новыми значениями *)
END Out;

PROCEDURE In (IN param: ARRAY OF CHAR);
BEGIN
   Out (param); (* ошибка компиляции: нельзя изменять IN-параметр! *)
END In;
```
Предположим, процедура Out сначала была реализована с IN-параметром, а потом переделана на VAR. Если описанного выше механизма контроля в компиляторе нет, то можно получить побочные эффекты, какие и бывают при переходе с value-параметров на VAR и обратно.