Я только начал осваивать BB/CP, и появились вопросы по языку. Простите, если они покажутся дурацкими.

Рассмотрим код:
MODULE TestMod1;

IMPORT StdLog;

PROCEDURE P1(INname: ARRAY OF CHAR);
BEGIN
StdLog.Int(LEN(name)); StdLog.Ln;
END P1;

PROCEDURE Do*;
VAR x: ARRAY 10 OF CHAR;
BEGIN
P1('abc'+'def');

END Do;

END TestMod1.

Согласно п. 9.2 Сообщения о языке:
> -- Цитата:
> There are two kinds of parameters: variable and value parameters.If a formal parameter is a  parameter, the corresponding actual parameter must be a .

Красным в коде выше выделен формальный параметр name, он относится к виду variable parameters (п. 10.1 Сообщения). Синим выделен фактический параметр, который не является (составным) именем переменной и к тому же имеет несовместимый тип (раздел Parameter compatible приложения А Сообщения).

Тогда почему приведенный выше фрагмент вообще компилируется?

Если заменить красное IN на VAR, выдается логичная ошибка: actual VAR-, IN-, or OUT-parameter is not a variable (122).
Если вообще убрать IN (передавать по значению), код также компилируется, объектный файл имеет другой размер: с IN -- 56 байт, без IN -- 128. В дизассемблер пока не смотрел, но уже понятно, что код другой.

В то же время выдача что с IN, что без IN одинаковая.

Заодно возникает следующий вопрос: я видел в коде BB, что строки принимаются в разных случаях и по значению, и как переменные (IN). В чем отличие и как лучше писать?