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; После нескольких изменений Low.Add и нескольких перекомпиляций Low и Middle становится довольно трудно предсказать, что именно будет выполнено при вызове Top.Add после перезапуска системы и перезагрузки всех модулей. Если инлайн не используется (либо есть запрет на экспорт code-процедур), то Top.Add выполнит самый последний, текущий вариант Low.Add. Если инлайн используется, то текущий вариант Low.Add будет выполнен только при одном условии: если модуль Middle был перекомпилирован позднее Low. Гарантировать это можно только в том случае, если изменение тела code-процедуры изменяет её сигнатуру, что приводило бы к изменению интерфейса и необходимости перекомпилировать Middle.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. Иван Горячев писал(а): Проблема есть. Я бы сказал в случае с инлайнами нарушается сам принцип модульности - часть кода модуля перестаёт ему принадлежать и начинает неконтролируемо распространяться по системе. Отлично сказано.
|
Автор: | 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/ |