OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 19:51

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Процедурная константа
СообщениеДобавлено: Вторник, 12 Июнь, 2018 09:23 

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Процедурная константа
СообщениеДобавлено: Вторник, 12 Июнь, 2018 12:27 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 987
Откуда: Казань
Но вопрос не по статье, ссылку на которую я привел. Там под процедурной константой понимается просто имя существующей процедуры.
Вопрос про том, можно ли например описывать константы следующим образом?
Код:
MODULE SomeName;

  CONST
    SomeConst = Module.Func;

END SomeName.

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Процедурная константа
СообщениеДобавлено: Вторник, 12 Июнь, 2018 13:07 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Авторское сообщение о языке говорит о константах слишком размыто. Поэтому возможна такая интерпретация, в которой процедурные константы возможны, если в воплощении транслятора адрес процедуры может быть вычислен во время трансляции без необходимости выполнения.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Процедурная константа
СообщениеДобавлено: Вторник, 12 Июнь, 2018 13:49 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 987
Откуда: Казань
Вообще, как мне кажется, константы в Оберонах являются воплощением "динамического программирования". Так как одному и тому же имени можно присвоить, и число, и символ, и строку и указатель (например, NIL). Так что присваивание процедур константам еще бы расширило возможности "динамического программирования", если так можно выразиться.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Процедурная константа
СообщениеДобавлено: Вторник, 12 Июнь, 2018 14:24 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Да нет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Процедурная константа
СообщениеДобавлено: Вторник, 12 Июнь, 2018 21:25 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 987
Откуда: Казань
Динамическое программирование не совсем правильный термин, имелось в виду динамическая типизация. Понятно, что это не совсем та динамическая типизация, как в динамических языках. Но все же константе можно присвоить разные типы значений, поэтому, как мне кажется, что-то общее тоже есть.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Процедурная константа
СообщениеДобавлено: Вторник, 12 Июнь, 2018 23:31 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Именованную процедуру назвали процедурной константой? Трудности перевода?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Процедурная константа
СообщениеДобавлено: Среда, 13 Июнь, 2018 10:24 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Rifat писал(а):
Динамическое программирование не совсем правильный термин, имелось в виду динамическая типизация.
Всё равно не то, потому что это автоматический тривиальный вывод типа.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Процедурная константа
СообщениеДобавлено: Среда, 13 Июнь, 2018 17:54 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Константа, ссылающаяся на процедуру своего модуля, во-первых, нарушит принцип однопроходности, во-вторых, не имеет смысла.

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Процедурная константа
СообщениеДобавлено: Среда, 13 Июнь, 2018 23:19 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Илья Ермаков писал(а):
Константа, ссылающаяся на процедуру другого модуля, невозможна - т.к. адрес процедуры другого модуля не является известным на этапе компиляции.
Сообщение о языке не задаёт ни способ трансляции, ни форму процедурного типа.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Процедурная константа
СообщениеДобавлено: Четверг, 14 Июнь, 2018 00:35 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Числовые константы тоже где-то хранятся.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Процедурная константа
СообщениеДобавлено: Четверг, 14 Июнь, 2018 01:01 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
Info21 писал(а):
Логически процедуры -- константы.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Процедурная константа
СообщениеДобавлено: Четверг, 14 Июнь, 2018 22:20 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Надобно различать логические уровни.

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Процедурная константа
СообщениеДобавлено: Пятница, 15 Июнь, 2018 14:05 

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 717
Откуда: Барнаул
Процедурная константа имеет дело с одной фиксированной сущностью( процедурой ), адрес которой, в общем случае, не имеет значения, как и метод обращения к ней. Любая процедур себе постоянна ( опустим самомодифицирующиеся программы ). И не важно, есть раздельная компиляция или нет, при запуске процедура определяется и остается статичной до выгрузки программы.
Процедурная переменная - динамическая сущность, которая, на протяжении жизненного цикла программы, позволяет обращаться к различным процедурам соответствующей сигнатуры. Процедурная переменная обеспечивает лишь статическую точку входа.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Процедурная константа
СообщениеДобавлено: Суббота, 16 Июнь, 2018 12:05 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Kemet писал(а):
Если хочется контанту процедурного типа, навроде const procedure MyProc = Proc;, то, сначала, нужно ответить на вопрос - зачем.
Если предполагается использовать внешними модулями, то процедурную переменную ставят доступ только для чтения и инициализируют при загрузке модуля. Если для внутреннего использования, то таки опять вопрос - зачем.


Вот да.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Процедурная константа
СообщениеДобавлено: Суббота, 16 Июнь, 2018 12:07 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Comdiv писал(а):
Илья Ермаков писал(а):
Константа, ссылающаяся на процедуру другого модуля, невозможна - т.к. адрес процедуры другого модуля не является известным на этапе компиляции.
Сообщение о языке не задаёт ни способ трансляции, ни форму процедурного типа.


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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Процедурная константа
СообщениеДобавлено: Суббота, 27 Октябрь, 2018 07:54 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1134
Откуда: СССР v2.0 rc 1
В кои-то веки я соглашусь с Кеметом (* уж ни заболел ли я?*)
Константные процедуры смысла не имеют. Да, наверное можно реализовать, но зачем? Что мешает процедуру вызывать по имени? Внутри модуля процедура и так доступна, а из другого модуля -- процедурная переменная объявленная на чтение -- таже самая константа.
Усложнить компилятор можно, но не нужно. И да, адрес внешней переменной в О7 известен на этапе компиляции, в ББ -- на этапе загрузки внешней по отношению к модулю средой. Так что тут адрес ничего не решает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Процедурная константа
СообщениеДобавлено: Понедельник, 29 Октябрь, 2018 10:02 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
Kemet писал(а):
Если хочется контанту процедурного типа, навроде const procedure MyProc = Proc;, то, сначала, нужно ответить на вопрос - зачем.

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Процедурная константа
СообщениеДобавлено: Воскресенье, 04 Ноябрь, 2018 19:40 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Проще реализовать один using для все вариантов сокращения имен.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Процедурная константа
СообщениеДобавлено: Среда, 20 Февраль, 2019 00:30 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
По-моему, всё достаточно просто. Процедурная константа - это такая процедурная переменная, значение которой присваивается компилитором либо рантаймом, и не может быть изменено пользовательским кодом в процессе работы.

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

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB