OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 02 Февраль, 2023 04:34

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




Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
СообщениеДобавлено: Среда, 07 Сентябрь, 2022 07:22 

Зарегистрирован: Суббота, 30 Июль, 2022 12:02
Сообщения: 41
Здравствуйте. Я программист-любитель. Прочитав доступную здесь и в интернете литературу, я сделал такую краткую сводку особенностей языков Никлауса Вирта. Прошу оценить правильность или ошибочность моих выводов. Я по образованию не программист, поэтому за неправильность терминологии заранее извиняюсь.

Модула-2

Запись:
Не должна быть нулевой (не содержащей полей), поскольку не расширяема. Оператор WITH используется для короткого доступа к полям записи;
Процедура:
Параметр-переменная (с идентификатором VAR) не может быть выражением или константой.
В качестве результата процедуры-функции не могут выступать: запись, массив, поддиапазон, перечисления, множество. Иначе надо использовать процедуру с параметром-переменной (с идентификатором VAR). Поскольку указатель имеет целочисленный тип, он может быть аргументом процедуры и результатом процедуры-функции.

Оберон, Оберон-2

Запись:
Может быть нулевой (не содержать полей), поскольку расширяема и может экспортироваться. Базовой записи можно присвоить значение расширенной, но не наоборот. Указатель расширенной записи может быть присвоен указателю базовой записи и наоборот.

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

Проверка типа оператором IS проверяет, что указатель р указывает на конкретную запись или её расширения, или запись является конкретным типом или его расширениями. Он обеспечивает доступ к полям этого типа записи, включая поля базовой записи, если указанный тип записи является расширением базовой записи.
Локальный охранник (оператор WITH) используется для проверки того, что запись является конкретным типом записи и используется для доступа только к полям этого типа. Если запись является расширением базовой записи, поля базовой записи будут недоступны.
Как правило, проверка типа и локальный охранник используются совместно - проверка типа проверяет базовую запись, а локальный охранник - конкретный тип расширения базовой записи.

Компонентный Паскаль

Запись:
Атрибут ABSTRACT соответствует нулевой записи в Обероне (не содержит полей). Нельзя создать экземпляр такой записи, но можно её расширить и экспортировать.
Атрибут LIMITED соответствует обычной записи в Обероне, которая может расширяться, но не может экспортироваться.
Атрибут EXTENSIBLE соответствует обычной записи в Обероне, которая может расширяться и экспортироваться.
Запись без атрибутов соответствует обычной записи в Обероне, которая может экспортироваться, но не может расширяться.
В качестве базового типа может быть использован указатель.

Процедура:
Идентификатор IN говорит о том, что эта переменная служит только для ввода данных и не может быть изменена в процедуре. Идентификатор IN допускается только для записей и массивов. Константы нельзя помечать идентификатором IN.
Идентификатор OUT говорит о том, что эта переменная служит только для вывода результата и её значение в начале процедуры не определено.
Идентификатор VAR говорит о том, что эта переменная может модифицироваться в процедуре и хранить полученный результат.
Процедуры, cвязанные с типами и возвращающие указатель, могут быть переопределены таким образом, чтобы возвращать указатель на расширенный тип и быть связанной с расширенным типом.
Для процедур, связанных с типами:
Атрибут NEW используется для вновь создаваемых для данной записи процедур (имя процедуры должно быть уникальным для базовой записи и её расширений).
Атрибут ABSTRACT используется для записей с атрибутом ABSTRACT и в расширенной записи перед использованием процедура должна быть переопределена, поскольку в базовой записи процедура пустая.
Атрибут EXTENSIBLE используется для указания, что эта процедура может быть переопределена и используется для записей с атрибутами ABSTRACT или EXTENSIBLE.
Атрибут EMPTY используется для указания, что процедура является пустой. В отличие от процедуры с идентификатором ABSTRACT, при расширении записи с такой процедурой её не надо переопределять (или переопределять в случае необходимости). Она используется для записей с атрибутами ABSTRACT или EXTENSIBLE. Если она не переопределялась, то её вызов не даёт никакого эффекта. Процедуры с атрибутом EMPTY не могут быть процедурами-функциями и не могут иметь OUT параметров.
Отсутствие атрибутов говорит о том, что процедура не может переопределяться и используется в записи без атрибутов.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 07 Сентябрь, 2022 16:34 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 500
Откуда: Украина, Днепропетровская обл.
Отличное резюме по особенностям Виртовских языков.

AlexBogy писал(а):
Идентификатор OUT говорит о том, что эта переменная служит только для вывода результата и её значение в начале процедуры не определено.
Небольшое уточнение: если OUT-параметр является указателем, то в начале процедуры он зануляется, даже если это запись, содержащая поля-указатели, или массив с элементами-указателями.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 07 Сентябрь, 2022 19:34 

Зарегистрирован: Суббота, 30 Июль, 2022 12:02
Сообщения: 41
Спасибо, Олег, за замечание. Это было в сообщении о языке Компонентный Паскаль. Иван Денисов написал ещё, что абстрактные записи могут иметь поля, хотя лично мне непонятно, почему нельзя создавать записи, имеющие поля. Прав ли я по поводу операторов IS и WITH ? Тут я базировался только на примерах из книги Райзера и Вирта.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 08 Сентябрь, 2022 12:30 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 500
Откуда: Украина, Днепропетровская обл.
Вроде бы всё правильно. У меня претензия только к фразе "Если запись является расширением базовой записи, поля базовой записи будут недоступны". Отчего же недоступны? Ведь расширенная запись включает все поля базовой.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 08 Сентябрь, 2022 14:51 

Зарегистрирован: Суббота, 30 Июль, 2022 12:02
Сообщения: 41
Именно так. Я сделал несколько тестов на XDS и BlackBox и у меня сложилась вот такая непротиворечивая картина:

Проверка типа по типу записей осуществляется только в процедуре при передаче записей с идентификатором VAR (или IN для Компонентного Паскаля). Проверка типа по указателю может осуществляться в теле программы без организации процедуры. Локальный охранник (оператор WITH) осуществляет проверку соответствия записи или указателя их статическому типу, зафиксированному при объявлении этих переменных в разделе VAR программы, модуля или процедуры. Проверка типа (оператор IS) осуществляет проверку соответствия записи или указателя их текущему типу, при этом образуя их динамический тип, заменяющий на момент выполнения программы их статический тип, зафиксированный при объявлении этих переменных в разделе VAR программы, модуля или процедуры. Поэтому сначала необходимо с помощью оператора IS проверить текущий тип записи или указателя, а затем с помощью оператора WITH обеспечить доступ к тем полям записи, которые соответствуют её текущему типу.

Спасибо разработчикам XDS за подсказки во время компиляции.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 08 Сентябрь, 2022 15:29 

Зарегистрирован: Суббота, 30 Июль, 2022 12:02
Сообщения: 41
Плюс небольшое дополнение:

Если проверка осуществляется в процедуре, то передача параметра в виде записи или указателя неявно подразумевает оператор IS, поэтому использовать его в процедуре необязательно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 09 Сентябрь, 2022 04:28 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3444
Обычно что-то одно используют, либо IS и потом вручную приводят тип в скобках, раз он уже проверен, либо WITH.

Код:
IF a IS Body THEN a(Body).x := 0 ELSE HALT(0) END;

WITH a: Body DO a.x := 0 ELSE HALT(0) END;


А сначала проверять с помощью IS, а потом ещё приводить с помощью WITH - это двойная работа.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 09 Сентябрь, 2022 11:38 

Зарегистрирован: Суббота, 30 Июль, 2022 12:02
Сообщения: 41
Абсолютно согласен, Иван, в процедуре можно реализовать двояко:
TYPE
bas=POINTER TO EXTENSIBLE RECORD
a:INTEGER;
END;
ras1=POINTER TO RECORD (bas)
b:REAL;
END;
ras2=POINTER TO RECORD (bas)
b:ARRAY 8 OF CHAR;
END;
VAR
p_bas:bas;
p_ras1:ras1;
p_ras2:ras2;

PROCEDURE TestType (p: bas);
BEGIN
p.a:=1;
Log.Int(p.a);
Log.Ln;
IF p IS ras1 THEN
p(ras1).b:=2.2222222;
Log.Real(p(ras1).b);
Log.Ln;
ELSIF p IS ras2 THEN
p(ras2).b:='Hello';
Log.String(p(ras2).b);
Log.Ln;
ELSE
END;
END TestType;

Или так

PROCEDURE TestType (p: bas);
BEGIN
p.a:=1;
Log.Int(p.a);
Log.Ln;
WITH p: ras1 DO
p.b:=2.2222222;
Log.Real(p.b);
Log.Ln; |
p: ras2 DO
p.b:='Hello';
Log.String(p.b);
Log.Ln;
ELSE
END;
END TestType;

Просто мне второй способ более понятен из-за того, что вместо p(ras1).b:=2.2222222; можно писать p.b:=2.2222222;
Но это дело вкуса.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 11 Сентябрь, 2022 09:45 

Зарегистрирован: Суббота, 30 Июль, 2022 12:02
Сообщения: 41
С учётом замечаний Ивана Денисова и Олега Чередниченко (за что им большое спасибо) в итоге краткая сводка выглядит следующим образом:

Модула-2

Запись:
Не должна быть нулевой (не содержащей полей), поскольку не расширяема. Оператор WITH используется для короткого доступа к полям записи;
Процедура:
Параметр-переменная (с идентификатором VAR) не может быть выражением или константой.
В качестве результата процедуры-функции не могут выступать: запись, массив, поддиапазон, перечисления, множество. Иначе надо использовать процедуру с параметром-переменной (с идентификатором VAR). Поскольку указатель имеет целочисленный тип, он может быть аргументом процедуры и результатом процедуры-функции.

Оберон, Оберон-2

Запись:
Может быть нулевой (не содержащей полей), поскольку расширяема и может экспортироваться. Базовой записи можно присвоить значение расширенной записи, но не наоборот. Указателю базовой записи можно присвоить значение указателя расширенной записи и наоборот.

Процедура:
Если объявление процедуры содержит параметр-приёмник, процедура рассматривается как связанная с типом. Связь выражается типом приёмника в заголовке объявления процедуры. Приёмник может быть или записью в виде параметра-переменной (с идентификатором VAR), или указателем в виде параметра-значения.
Если процедура связана с базовой записью, то она неявно связана с любым расширением базовой записи. Однако другая процедура с тем же самым именем, что и исходная, которая явно связана с расширением базовой записи, перекрывает исходную процедуру и рассматривается как её переопределение. Формальные параметры обеих процедур должны совпадать. Если к вызову переопределённой процедуры добавить ^, то вызывается исходная процедура. Вызвать исходную процедуру можно только из переопределённой.
Проверка типа осуществляется только для конкретных типов записи или указателя и их прямых расширений. Проверка типа по типу записей осуществляется только в процедуре при передаче записей с идентификатором VAR (или IN для Компонентного Паскаля). Проверка типа по указателю может осуществляться как в теле программы, так и в отдельной процедуре. Локальный охранник (оператор WITH) осуществляет проверку соответствия записи или указателя их статическому типу, зафиксированному при объявлении этих переменных в разделе VAR программы, модуля или процедуры. Проверка типа (оператор IS) осуществляет проверку соответствия записи или указателя их текущему типу, при этом образуя их динамический тип, заменяющий на момент выполнения программы их статический тип, зафиксированный при объявлении этих переменных в разделе VAR программы, модуля или процедуры. Поэтому сначала необходимо с помощью оператора IS проверить текущий тип записи или указателя, а затем с помощью оператора WITH обеспечить доступ к тем полям записи, которые соответствуют её текущему типу. Если проверка осуществляется в процедуре, то передача параметра в виде записи или указателя неявно подразумевает оператор IS, поэтому использовать его в процедуре необязательно.

Компонентный Паскаль

Запись:
В качестве базового типа может быть использован указатель.
Атрибут ABSTRACT соответствует нулевой или ненулевой записи в Обероне. Нельзя создать экземпляр такой записи, но можно её расширить и экспортировать.
Атрибут LIMITED соответствует ненулевой записи в Обероне, которая может расширяться, но не может экспортироваться.
Атрибут EXTENSIBLE соответствует ненулевой записи в Обероне, которая может расширяться и экспортироваться.
Запись без атрибутов соответствует ненулевой записи в Обероне, которая может экспортироваться, но не может расширяться.

Процедура:
Идентификатор IN говорит о том, что эта переменная служит только для ввода данных и не может быть изменена в процедуре. Идентификатор IN допускается только для записей и массивов. Константы нельзя помечать идентификатором IN.
Идентификатор OUT говорит о том, что эта переменная служит только для вывода результата и её значение в начале процедуры не определено. Все переменные с этим идентификатором, содержащие указатели и процедурные типы, инициализируют их значением NIL.
Идентификатор VAR говорит о том, что эта переменная может модифицироваться в процедуре и хранить полученный результат.

Для процедур, связанных с типами:
Процедуры, возвращающие указатель, могут быть переопределены таким образом, чтобы возвращать указатель на расширенный тип и быть связанной с расширенным типом.
Атрибут NEW используется для вновь создаваемых для данной записи процедур (имя процедуры должно быть уникальным для базовой записи и её расширений).
Атрибут ABSTRACT используется для записей с атрибутом ABSTRACT и в расширенной записи перед использованием процедура должна быть переопределена, поскольку в базовой записи процедура пустая.
Атрибут EXTENSIBLE используется для указания, что эта процедура может быть переопределена и используется для записей с атрибутами ABSTRACT или EXTENSIBLE.
Атрибут EMPTY используется для указания, что процедура является пустой. В отличие от процедуры с идентификатором ABSTRACT, при расширении записи с такой процедурой её не надо переопределять (или переопределять в случае необходимости). Она используется для записей с атрибутами ABSTRACT или EXTENSIBLE. Если она не переопределялась, то её вызов не даёт никакого эффекта. Процедуры с атрибутом EMPTY не могут быть процедурами-функциями и не могут иметь OUT параметров.
Отсутствие атрибутов говорит о том, что процедура не может переопределяться и используется в записи без атрибутов.

Экспорт переменных и записей

Экспортируемая переменная становится глобальной в модулях, которые её экспортируют, и в модуле, который её экспортирует.
Если экспортируемая (большая) запись в качестве одного из полей содержит другую (малую) запись, то для доступа к переменным этого поля в импортирующем модуле достаточно в экспортирующем модуле экспортировать только переменные малой записи, при этом в импортирующем модуле нельзя создавать переменные типа малой записи. Если в импортирующем модуле необходимо создавать переменные типа малой записи, необходимо экспортировать и малую запись.
Экспорт только для чтения используется только для переменных.

Буду рад, если это облегчит новичкам понимание особенностей языков уважаемого мной Никлауса Вирта.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 30 Декабрь, 2022 18:54 

Зарегистрирован: Суббота, 30 Июль, 2022 12:02
Сообщения: 41
Более новая и уточнённая сводка. Выкладываю файлом.


Вложения:
Краткая сводка особенностей языков Никлауса Вирта.pdf [62.78 КБ]
Скачиваний: 21
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 31 Декабрь, 2022 12:32 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
AlexBogy писал(а):
Атрибут LIMITED соответствует ненулевой записи в Обероне, которая может расширяться, но не может экспортироваться.

WTF?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 31 Декабрь, 2022 12:53 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 635
Мне кажется, про ненулевые записи - неверно. (Если, конечно, под нулевыми вы подразумеваете записи без полей).
TYPE
A = ABSTRACT RECORD END;
L = LIMITED RECORD END;
E = EXTENSIBLE RECORD END;
T = RECORD END;

Все это корректные высказывания КП.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 31 Декабрь, 2022 17:40 

Зарегистрирован: Суббота, 30 Июль, 2022 12:02
Сообщения: 41
adimetrius писал(а):
Мне кажется, про ненулевые записи - неверно. (Если, конечно, под нулевыми вы подразумеваете записи без полей).
TYPE
A = ABSTRACT RECORD END;
L = LIMITED RECORD END;
E = EXTENSIBLE RECORD END;
T = RECORD END;

Все это корректные высказывания КП.

Вы правы, под нулевой записью я имею в виду отсутствие полей. Но это не самый удачный оборот, который я употребил, я его удалю.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 31 Декабрь, 2022 17:44 

Зарегистрирован: Суббота, 30 Июль, 2022 12:02
Сообщения: 41
Trurl писал(а):
AlexBogy писал(а):
Атрибут LIMITED соответствует ненулевой записи в Обероне, которая может расширяться, но не может экспортироваться.

WTF?

Неправильная фраза. Исправлю.


Вложения:
Сводка свойств языков Modula-2, Oberon, Oberon-2, Component Pascal.pdf [79.33 КБ]
Скачиваний: 16
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 15 Январь, 2023 20:11 

Зарегистрирован: Суббота, 30 Июль, 2022 12:02
Сообщения: 41
С уточнениями.


Вложения:
Комментарий к файлу: С уточнениями
Сводка свойств языков Modula-2, Oberon, Oberon-2, Component Pascal.pdf [80.53 КБ]
Скачиваний: 21
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

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


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

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


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

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