OberonCore
https://forum.oberoncore.ru/

Процедурная константа
https://forum.oberoncore.ru/viewtopic.php?f=115&t=6255
Страница 1 из 2

Автор:  Rifat [ Вторник, 12 Июнь, 2018 09:23 ]
Заголовок сообщения:  Процедурная константа

Просматривал статью https://cyberleninka.ru/article/v/protsedury-kak-dannye-i-zadacha-obhoda-spiska и там нашел такую фразу про процедурные константы. Про процедурные переменные я слышал, но про процедурные константы встретилось впервые.
Возможны ли в Оберонах процедурные константы? Поддерживаются ли они компиляторами?

Автор:  Rifat [ Вторник, 12 Июнь, 2018 12:27 ]
Заголовок сообщения:  Re: Процедурная константа

Но вопрос не по статье, ссылку на которую я привел. Там под процедурной константой понимается просто имя существующей процедуры.
Вопрос про том, можно ли например описывать константы следующим образом?
Код:
MODULE SomeName;

  CONST
    SomeConst = Module.Func;

END SomeName.

или как вариант внутри процедуры завести константую функцию на вышеопределенную процедуру, например так:
Код:
PROCEDURE Proc1;
BEGIN
END Proc1;

PROCEDURE Proc2;
CONST
   SomeConstant = Proc1;
BEGIN
END Proc2;

Автор:  Comdiv [ Вторник, 12 Июнь, 2018 13:07 ]
Заголовок сообщения:  Re: Процедурная константа

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

Автор:  Rifat [ Вторник, 12 Июнь, 2018 13:49 ]
Заголовок сообщения:  Re: Процедурная константа

Вообще, как мне кажется, константы в Оберонах являются воплощением "динамического программирования". Так как одному и тому же имени можно присвоить, и число, и символ, и строку и указатель (например, NIL). Так что присваивание процедур константам еще бы расширило возможности "динамического программирования", если так можно выразиться.

Автор:  Comdiv [ Вторник, 12 Июнь, 2018 14:24 ]
Заголовок сообщения:  Re: Процедурная константа

Да нет.

Автор:  Rifat [ Вторник, 12 Июнь, 2018 21:25 ]
Заголовок сообщения:  Re: Процедурная константа

Динамическое программирование не совсем правильный термин, имелось в виду динамическая типизация. Понятно, что это не совсем та динамическая типизация, как в динамических языках. Но все же константе можно присвоить разные типы значений, поэтому, как мне кажется, что-то общее тоже есть.

Автор:  Пётр Кушнир [ Вторник, 12 Июнь, 2018 23:31 ]
Заголовок сообщения:  Re: Процедурная константа

Именованную процедуру назвали процедурной константой? Трудности перевода?

Автор:  Comdiv [ Среда, 13 Июнь, 2018 10:24 ]
Заголовок сообщения:  Re: Процедурная константа

Rifat писал(а):
Динамическое программирование не совсем правильный термин, имелось в виду динамическая типизация.
Всё равно не то, потому что это автоматический тривиальный вывод типа.

Автор:  Илья Ермаков [ Среда, 13 Июнь, 2018 17:54 ]
Заголовок сообщения:  Re: Процедурная константа

Константа, ссылающаяся на процедуру своего модуля, во-первых, нарушит принцип однопроходности, во-вторых, не имеет смысла.

Константа, ссылающаяся на процедуру другого модуля, невозможна - т.к. адрес процедуры другого модуля не является известным на этапе компиляции. Для этого уже нужна процедурная переменная.

Так что издержки перевода или фразы в узком контексте.

Автор:  Comdiv [ Среда, 13 Июнь, 2018 23:19 ]
Заголовок сообщения:  Re: Процедурная константа

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

Автор:  Info21 [ Четверг, 14 Июнь, 2018 00:35 ]
Заголовок сообщения:  Re: Процедурная константа

Числовые константы тоже где-то хранятся.

Логически процедуры -- константы.

Автор:  Wlad [ Четверг, 14 Июнь, 2018 01:01 ]
Заголовок сообщения:  Re: Процедурная константа

Info21 писал(а):
Логически процедуры -- константы.

Если имеется в виду адрес процедуры, то - не факт. В разных конфигурациях может быть размещение модулей по разным стартовым адресам.
То есть, при загрузке модуля, он не хранит константу-адрес процедуры, а некую область памяти приходится инициализировать соответствующим значением адреса. А это - уже - не константа, а - переменная.
Если имеется в виду случай представления процедуры как константы в смысле содержания в ней кодов команд и их параметров-аргументов, то - случай - тот же самый. В разные загрузки модуля, где расположено тело этой процедуры, некоторые операнды в полях команд этой процедуры могут изменяться при окончательном связывании.

Автор:  Info21 [ Четверг, 14 Июнь, 2018 22:20 ]
Заголовок сообщения:  Re: Процедурная константа

Надобно различать логические уровни.

Обсуждается имя процедуры в языке.
Его можно присвоить процедурной переменной. Но ему присвоить ничего нельзя.

Адрес входа в процедуру -- это концепт машинного языка. Другой уровень.

Автор:  Kemet [ Пятница, 15 Июнь, 2018 14:05 ]
Заголовок сообщения:  Re: Процедурная константа

Процедурная константа имеет дело с одной фиксированной сущностью( процедурой ), адрес которой, в общем случае, не имеет значения, как и метод обращения к ней. Любая процедур себе постоянна ( опустим самомодифицирующиеся программы ). И не важно, есть раздельная компиляция или нет, при запуске процедура определяется и остается статичной до выгрузки программы.
Процедурная переменная - динамическая сущность, которая, на протяжении жизненного цикла программы, позволяет обращаться к различным процедурам соответствующей сигнатуры. Процедурная переменная обеспечивает лишь статическую точку входа.

Если хочется контанту процедурного типа, навроде const procedure MyProc = Proc;, то, сначала, нужно ответить на вопрос - зачем.
Если предполагается использовать внешними модулями, то процедурную переменную ставят доступ только для чтения и инициализируют при загрузке модуля. Если для внутреннего использования, то таки опять вопрос - зачем.

Автор:  Илья Ермаков [ Суббота, 16 Июнь, 2018 12:05 ]
Заголовок сообщения:  Re: Процедурная константа

Kemet писал(а):
Если хочется контанту процедурного типа, навроде const procedure MyProc = Proc;, то, сначала, нужно ответить на вопрос - зачем.
Если предполагается использовать внешними модулями, то процедурную переменную ставят доступ только для чтения и инициализируют при загрузке модуля. Если для внутреннего использования, то таки опять вопрос - зачем.


Вот да.

Автор:  Илья Ермаков [ Суббота, 16 Июнь, 2018 12:07 ]
Заголовок сообщения:  Re: Процедурная константа

Comdiv писал(а):
Илья Ермаков писал(а):
Константа, ссылающаяся на процедуру другого модуля, невозможна - т.к. адрес процедуры другого модуля не является известным на этапе компиляции.
Сообщение о языке не задаёт ни способ трансляции, ни форму процедурного типа.


Ну, правда, мы в ветке Оберон-07.
В стандарте КП указано, что реализация обязана поддерживать динамическую модульность.

Ну а в конкретной реализации КП - в ББ - все константы подставляются на этапе копиляции. Т.е. в рантайме они нигде не хранятся, их нет как сущности. Компилятор взял значение константы из символьного файла одного модуля и подставил в генерируемый машинный код другого непосредственно.
(Ну или для строковых переменных наверняка создал в этом другом модуле однократно хранимую константу).

Автор:  prospero78 [ Суббота, 27 Октябрь, 2018 07:54 ]
Заголовок сообщения:  Re: Процедурная константа

В кои-то веки я соглашусь с Кеметом (* уж ни заболел ли я?*)
Константные процедуры смысла не имеют. Да, наверное можно реализовать, но зачем? Что мешает процедуру вызывать по имени? Внутри модуля процедура и так доступна, а из другого модуля -- процедурная переменная объявленная на чтение -- таже самая константа.
Усложнить компилятор можно, но не нужно. И да, адрес внешней переменной в О7 известен на этапе компиляции, в ББ -- на этапе загрузки внешней по отношению к модулю средой. Так что тут адрес ничего не решает.

Автор:  Trurl [ Понедельник, 29 Октябрь, 2018 10:02 ]
Заголовок сообщения:  Re: Процедурная константа

Kemet писал(а):
Если хочется контанту процедурного типа, навроде const procedure MyProc = Proc;, то, сначала, нужно ответить на вопрос - зачем.

Ну, можно добиться некоторого сокращения кода. Для значений и типов есть варианты
Код:
CONST Value = Module.Value;
TYPE Type = Module.Type

а для процедур
Код:
PROCEDURE Proc(...)
BEGIN
  Module.Proc(...);
END Proc.

Автор:  Валерий Лаптев [ Воскресенье, 04 Ноябрь, 2018 19:40 ]
Заголовок сообщения:  Re: Процедурная константа

Проще реализовать один using для все вариантов сокращения имен.

Автор:  Александр Ильин [ Среда, 20 Февраль, 2019 00:30 ]
Заголовок сообщения:  Re: Процедурная константа

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

Применение - например, синонимы (алиасы) процедур. Пишем код модуля с использованием такого синонима, а потом можем подставлять разные реализации, редактируя только одно объявление. По сравнению с процедурной переменной имеем:
- очевидность того, что значение задаётся единожды и больше не меняется;
- возможность присвоить значение на этапе компиляции;
- возможность сосредоточить параметры модуля в заголовке вместе с другими константами, а не разрываться между шапкой в начале и секцией инициализации в конце файла.

Синонимы могут быть как локальными, так и импортированными из других модулей. При этом импортированные read-only переменные не дают уверенности, что модуль не подменит реализацию в процессе работы.

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