OberonCore
https://forum.oberoncore.ru/

Краткая сводка особенностей языков
https://forum.oberoncore.ru/viewtopic.php?f=1&t=6862
Страница 1 из 2

Автор:  AlexBogy [ Среда, 07 Сентябрь, 2022 07:22 ]
Заголовок сообщения:  Краткая сводка особенностей языков

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

Модула-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 параметров.
Отсутствие атрибутов говорит о том, что процедура не может переопределяться и используется в записи без атрибутов.

Автор:  Oleg N. Cher [ Среда, 07 Сентябрь, 2022 16:34 ]
Заголовок сообщения:  Re: Краткая сводка особенностей языков

Отличное резюме по особенностям Виртовских языков.

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

Автор:  AlexBogy [ Среда, 07 Сентябрь, 2022 19:34 ]
Заголовок сообщения:  Re: Краткая сводка особенностей языков

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

Автор:  Oleg N. Cher [ Четверг, 08 Сентябрь, 2022 12:30 ]
Заголовок сообщения:  Re: Краткая сводка особенностей языков

Вроде бы всё правильно. У меня претензия только к фразе "Если запись является расширением базовой записи, поля базовой записи будут недоступны". Отчего же недоступны? Ведь расширенная запись включает все поля базовой.

Автор:  AlexBogy [ Четверг, 08 Сентябрь, 2022 14:51 ]
Заголовок сообщения:  Re: Краткая сводка особенностей языков

Именно так. Я сделал несколько тестов на XDS и BlackBox и у меня сложилась вот такая непротиворечивая картина:

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

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

Автор:  AlexBogy [ Четверг, 08 Сентябрь, 2022 15:29 ]
Заголовок сообщения:  Re: Краткая сводка особенностей языков

Плюс небольшое дополнение:

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

Автор:  Иван Денисов [ Пятница, 09 Сентябрь, 2022 04:28 ]
Заголовок сообщения:  Re: Краткая сводка особенностей языков

Обычно что-то одно используют, либо 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 - это двойная работа.

Автор:  AlexBogy [ Пятница, 09 Сентябрь, 2022 11:38 ]
Заголовок сообщения:  Re: Краткая сводка особенностей языков

Абсолютно согласен, Иван, в процедуре можно реализовать двояко:
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;
Но это дело вкуса.

Автор:  AlexBogy [ Воскресенье, 11 Сентябрь, 2022 09:45 ]
Заголовок сообщения:  Re: Краткая сводка особенностей языков

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

Модула-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 параметров.
Отсутствие атрибутов говорит о том, что процедура не может переопределяться и используется в записи без атрибутов.

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

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

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

Автор:  AlexBogy [ Пятница, 30 Декабрь, 2022 18:54 ]
Заголовок сообщения:  Re: Краткая сводка особенностей языков

Более новая и уточнённая сводка. Выкладываю файлом.

Вложения:
Краткая сводка особенностей языков Никлауса Вирта.pdf [62.78 КБ]
Скачиваний: 151

Автор:  Trurl [ Суббота, 31 Декабрь, 2022 12:32 ]
Заголовок сообщения:  Re: Краткая сводка особенностей языков

AlexBogy писал(а):
Атрибут LIMITED соответствует ненулевой записи в Обероне, которая может расширяться, но не может экспортироваться.

WTF?

Автор:  adimetrius [ Суббота, 31 Декабрь, 2022 12:53 ]
Заголовок сообщения:  Re: Краткая сводка особенностей языков

Мне кажется, про ненулевые записи - неверно. (Если, конечно, под нулевыми вы подразумеваете записи без полей).
TYPE
A = ABSTRACT RECORD END;
L = LIMITED RECORD END;
E = EXTENSIBLE RECORD END;
T = RECORD END;

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

Автор:  AlexBogy [ Суббота, 31 Декабрь, 2022 17:40 ]
Заголовок сообщения:  Re: Краткая сводка особенностей языков

adimetrius писал(а):
Мне кажется, про ненулевые записи - неверно. (Если, конечно, под нулевыми вы подразумеваете записи без полей).
TYPE
A = ABSTRACT RECORD END;
L = LIMITED RECORD END;
E = EXTENSIBLE RECORD END;
T = RECORD END;

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

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

Автор:  AlexBogy [ Суббота, 31 Декабрь, 2022 17:44 ]
Заголовок сообщения:  Re: Краткая сводка особенностей языков

Trurl писал(а):
AlexBogy писал(а):
Атрибут LIMITED соответствует ненулевой записи в Обероне, которая может расширяться, но не может экспортироваться.

WTF?

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

Вложения:
Сводка свойств языков Modula-2, Oberon, Oberon-2, Component Pascal.pdf [79.33 КБ]
Скачиваний: 157

Автор:  AlexBogy [ Воскресенье, 15 Январь, 2023 20:11 ]
Заголовок сообщения:  Re: Краткая сводка особенностей языков

С уточнениями.

Вложения:
Комментарий к файлу: С уточнениями
Сводка свойств языков Modula-2, Oberon, Oberon-2, Component Pascal.pdf [80.53 КБ]
Скачиваний: 162

Автор:  AlexBogy [ Суббота, 25 Февраль, 2023 20:03 ]
Заголовок сообщения:  Re: Краткая сводка особенностей языков

С дополнением.

Вложения:
Сводка свойств языков Modula-2, Oberon, Oberon-2, Component Pascal.pdf [83.61 КБ]
Скачиваний: 143

Автор:  AlexBogy [ Среда, 01 Март, 2023 08:07 ]
Заголовок сообщения:  Re: Краткая сводка особенностей языков

Окончательный вариант. Заранее прошу прощения у программистов за возможное несоблюдение терминов.

Вложения:
Сводка свойств языков Modula-2, Oberon, Oberon-2, Component Pascal.pdf [111.95 КБ]
Скачиваний: 155

Автор:  Artyemov [ Среда, 01 Март, 2023 23:09 ]
Заголовок сообщения:  Re: Краткая сводка особенностей языков

AlexBogy писал(а):
Окончательный вариант...возможное несоблюдение терминов.

А если соблюсти и выдать финальный ;-)

Автор:  AlexBogy [ Четверг, 02 Март, 2023 09:38 ]
Заголовок сообщения:  Re: Краткая сводка особенностей языков

Artyemov писал(а):
AlexBogy писал(а):
Окончательный вариант...возможное несоблюдение терминов.

А если соблюсти и выдать финальный ;-)

Меня поправляли и я учитывал замечания. Если вы укажете конкретные замечания по терминологии, я их обязательно исправлю.

Автор:  AlexBogy [ Пятница, 10 Март, 2023 20:08 ]
Заголовок сообщения:  Re: Краткая сводка особенностей языков

AlexBogy писал(а):
Artyemov писал(а):
AlexBogy писал(а):
Окончательный вариант...возможное несоблюдение терминов.

А если соблюсти и выдать финальный ;-)

Меня поправляли и я учитывал замечания. Если вы укажете конкретные замечания по терминологии, я их обязательно исправлю.


Вложения:
Сводка свойств языков Modula-2, Oberon, Oberon-2, Component Pascal.pdf [102.37 КБ]
Скачиваний: 152

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