Евгений Темиргалеев писал(а):
Не согласен. Средство системное и контролируемое (IMPORT SYSTEM)
IMPORT SYSTEM будет в том модуле, который создал процедуру с пометкой [ code ]. А модули, импортировавшие эту процедуру, ничего и не подозревают. В том числе, могут экспортировать дальше, но уже без SYSTEM
Код:
MODULE Low;
IMPORT SYSTEM; (* Напугали. БУ! *)
PROCEDURE [ code ] And* (a, b: INTEGER): INTEGER;
HAX, HAX, HAX;
END Low.
MODULE Middle;
IMPORT Low; (* Уже не так страшно *)
PROCEDURE Add* (a, b: INTEGER): INTEGER;
BEGIN RETURN Low.Add (a, b) (* сюда будет заинлайнено *)
END Add;
END Middle.
MODULE Top;
IMPORT Middle; (* Уже совсем не страшно *)
PROCEDURE Add* (a, b: INTEGER): INTEGER;
BEGIN RETURN Middle.Add (a, b) (* сюда инлайна не будет *)
END Add;
END Top.
После нескольких изменений Low.Add и нескольких перекомпиляций Low и Middle становится довольно трудно предсказать, что именно будет выполнено при вызове Top.Add после перезапуска системы и перезагрузки всех модулей. Если инлайн не используется (либо есть запрет на экспорт code-процедур), то Top.Add выполнит самый последний, текущий вариант Low.Add. Если инлайн используется, то текущий вариант Low.Add будет выполнен только при одном условии: если модуль Middle был перекомпилирован позднее Low. Гарантировать это можно только в том случае, если изменение тела code-процедуры изменяет её сигнатуру, что приводило бы к изменению интерфейса и необходимости перекомпилировать Middle.
Иван Горячев писал(а):
Проблема есть. Я бы сказал в случае с инлайнами нарушается сам принцип модульности - часть кода модуля перестаёт ему принадлежать и начинает неконтролируемо распространяться по системе.
Отлично сказано.