OberonCore
https://forum.oberoncore.ru/

inline-процедуры
https://forum.oberoncore.ru/viewtopic.php?f=2&t=1958
Страница 1 из 1

Автор:  Илья Ермаков [ Среда, 14 Октябрь, 2009 20:54 ]
Заголовок сообщения:  inline-процедуры

Выделено. Иницирующее сообщение viewtopic.php?p=36247#p36247
ilovb писал(а):
Кстати процедура Bit в DLL не компонуется почему-то. Нужно в обычную упаковывать...


Кодовые процедуры - это не вызываемые процедуры, на самом деле. А inline (подставляются в место вызова). Со всеми вытекающими.

Автор:  Александр Ильин [ Среда, 14 Октябрь, 2009 20:58 ]
Заголовок сообщения:  Re: Побитовый AND

Илья Ермаков писал(а):
Кодовые процедуры - это не вызываемые процедуры, на самом деле. А inline (подставляются в место вызова). Со всеми вытекающими.
Не означает ли это того, что им нужно запрещать экспортироваться?

Автор:  Илья Ермаков [ Четверг, 15 Октябрь, 2009 00:13 ]
Заголовок сообщения:  Re: Побитовый AND

Нужно-не нужно, кто его знает..

Но подстановку их выполняет компилятор.

Автор:  Александр Ильин [ Четверг, 15 Октябрь, 2009 05:35 ]
Заголовок сообщения:  Re: Побитовый AND

Илья Ермаков писал(а):
Нужно-не нужно, кто его знает..
При изменении реализации такой процедуры другие модули, которые её используют, будут продолжать использовать старую версию, а не новую, поскольку хранят её инлайн в своём коде, а не импортируют динамически при загрузке. Это бы нарушило сильное правило о том, что конструкция вида Module.Procedure всегда вызывает наиболее актуальную версию, т.е. версию на момент последней компиляции Module.

Автор:  Иван Горячев [ Четверг, 15 Октябрь, 2009 06:39 ]
Заголовок сообщения:  Re: Побитовый AND

Александр Ильин писал(а):
Это бы нарушило сильное правило о том, что конструкция вида Module.Procedure всегда вызывает наиболее актуальную версию, т.е. версию на момент последней компиляции Module.

Это правило и так нарушено, поскольку компиляция и загрузка модуля в память - отдельные операции.

Автор:  Александр Ильин [ Четверг, 15 Октябрь, 2009 07:06 ]
Заголовок сообщения:  Re: Побитовый AND

Иван Горячев писал(а):
Это правило и так нарушено, поскольку компиляция и загрузка модуля в память - отдельные операции.
Помогите тогда мне более точно идентифицировать проблему с инлайнами. Что нарушается? Или проблемы нет?

Автор:  Иван Горячев [ Четверг, 15 Октябрь, 2009 09:13 ]
Заголовок сообщения:  Re: Побитовый AND

Александр Ильин писал(а):
Помогите тогда мне более точно идентифицировать проблему с инлайнами. Что нарушается? Или проблемы нет?

Проблема есть. Я бы сказал в случае с инлайнами нарушается сам принцип модульности - часть кода модуля перестаёт ему принадлежать и начинает неконтролируемо распространяться по системе.

Автор:  Евгений Темиргалеев [ Четверг, 15 Октябрь, 2009 09:25 ]
Заголовок сообщения:  Re: inline-процедуры

Не согласен. Средство системное и контролируемое (IMPORT SYSTEM)

Автор:  Александр Ильин [ Четверг, 15 Октябрь, 2009 09:58 ]
Заголовок сообщения:  Re: inline-процедуры

Евгений Темиргалеев писал(а):
Не согласен. Средство системное и контролируемое (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.
Иван Горячев писал(а):
Проблема есть. Я бы сказал в случае с инлайнами нарушается сам принцип модульности - часть кода модуля перестаёт ему принадлежать и начинает неконтролируемо распространяться по системе.
Отлично сказано.

Автор:  Trurl [ Четверг, 15 Октябрь, 2009 10:05 ]
Заголовок сообщения:  Re: Побитовый AND

Александр Ильин писал(а):
Это бы нарушило сильное правило о том, что конструкция вида Module.Procedure всегда вызывает наиболее актуальную версию, т.е. версию на момент последней компиляции Module.

Иван Горячев писал(а):
Это правило и так нарушено, поскольку компиляция и загрузка модуля в память - отдельные операции.

Надо просто переформулировать правило: не "на момент последней компиляции", а "на момент последней загрузки".

Автор:  Евгений Темиргалеев [ Четверг, 15 Октябрь, 2009 12:36 ]
Заголовок сообщения:  Re: inline-процедуры

Александр Ильин писал(а):
Евгений Темиргалеев писал(а):
Не согласен. Средство системное и контролируемое (IMPORT SYSTEM)
IMPORT SYSTEM будет в том модуле, который создал процедуру с пометкой [ code ]. А модули, импортировавшие эту процедуру, ничего и не подозревают. В том числе, могут экспортировать дальше, но уже без SYSTEM
Если программист использует системные средства, он должен знать чего делает. Наиболее вероятно что инлайн процедура будет использоваться своя в целях какой-то серьёзной оптимизации. Или работы с железом.

Если кто-то написал инлайн процедуру для использования третьими лицами, то он скорее всего плохо думал.

А тут уже нужна доработка загрзучика. Чтобы он непонятно чьи IMPORT SYSTEM модули просто так не загружал.

Автор:  Борис Рюмшин [ Четверг, 15 Октябрь, 2009 12:48 ]
Заголовок сообщения:  Re: inline-процедуры

Погодите. Инлайн вполне может быть допустим в рамках одного модуля. А сквозь границы, как сказал Иван, смысла не имеет.

Автор:  Илья Ермаков [ Четверг, 15 Октябрь, 2009 18:03 ]
Заголовок сообщения:  Re: inline-процедуры

Но допустим, однако.

Задумано, видимо, для введения операций типа встроенных в язык. В исключительных случаях системного программирования (какое-нить хитрое разыменование, и т.п.).

Автор:  Сергей Оборотов [ Четверг, 15 Октябрь, 2009 20:55 ]
Заголовок сообщения:  Re: inline-процедуры

Евгений Темиргалеев писал(а):
А тут уже нужна доработка загрузчика. Чтобы он непонятно чьи IMPORT SYSTEM модули просто так не загружал.
И доработка компилятора тоже. Чтобы он понятно чьи модули создавал.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/