OberonCore
https://forum.oberoncore.ru/

Неполнота в описании SYSTEM.TYP
https://forum.oberoncore.ru/viewtopic.php?f=2&t=6790
Страница 1 из 1

Автор:  adimetrius [ Понедельник, 26 Июль, 2021 16:05 ]
Заголовок сообщения:  Неполнота в описании SYSTEM.TYP

Коллеги, процедура SYSTEM.TYP определена вот так:

Platform-Specific Issues писал(а):
Код:
Name    Argument types   Result type   Description
TYP(v)   record type         INTEGER       type tag of record variable v



Я понимаю это так, что аргументом должно быть значение записного типа.

Однако процедура работает и с именами типов, вот так:
TYPE Type = POINTER TO RECORD ... END;
x := SYSTEM.TYP(Type)

Как мне кажется, в данном случае описание неполно, и может быть дополнено, напр, вот так:
Код:
TYP(T)   type name   INTEGER   type tag of record type T


Что скажете?

Автор:  Илья Ермаков [ Вторник, 27 Июль, 2021 13:29 ]
Заголовок сообщения:  Re: Неполнота в описании SYSTEM.TYP

Поддерживаю.

Только там тогда не name, а type qualident лучше написать.

Автор:  Trurl [ Вторник, 27 Июль, 2021 16:34 ]
Заголовок сообщения:  Re: Неполнота в описании SYSTEM.TYP

Но стаким описанием можно ожидать, что будет работать и SYSTEM.TYP(REAL)

Автор:  Илья Ермаков [ Вторник, 27 Июль, 2021 19:28 ]
Заголовок сообщения:  Re: Неполнота в описании SYSTEM.TYP

record type qualident
(как там для массивов, вопрос? А то non-basic type...)

Автор:  Trurl [ Вторник, 27 Июль, 2021 19:37 ]
Заголовок сообщения:  Re: Неполнота в описании SYSTEM.TYP

Илья Ермаков писал(а):
как там для массивов, вопрос?

Просто массив ошибка, а вот указатель на массив валит компилятор.

Автор:  adimetrius [ Среда, 28 Июль, 2021 08:22 ]
Заголовок сообщения:  Re: Неполнота в описании SYSTEM.TYP

Trurl писал(а):
Но стаким описанием можно ожидать, что будет работать и SYSTEM.TYP(REAL)


Нельзя, потому что уточнено в 4 столбике:

TYP(T) type name INTEGER type tag of record type T

Если написать квалидент - это подразумевает обязательно указание имени модуля, не?

Автор:  Илья Ермаков [ Среда, 28 Июль, 2021 13:23 ]
Заголовок сообщения:  Re: Неполнота в описании SYSTEM.TYP

adimetrius писал(а):

Если написать квалидент - это подразумевает обязательно указание имени модуля, не?


Не, там в грамматике у квалидента [xxxx.]yyyy

Автор:  Trurl [ Среда, 28 Июль, 2021 15:07 ]
Заголовок сообщения:  Re: Неполнота в описании SYSTEM.TYP

adimetrius писал(а):
Нельзя, потому что уточнено в 4 столбике:
TYP(T) type name INTEGER type tag of record type T

Вы ведь хотите прояснить, а получается наоборот.
Второй столбик описывает аргументы, а четвертый - результат. Остается неясным, какой будет результат функции, если T - не record type.
Далее, чем "type name" отличается от аналогичных параметров MIN, MAX, SIZE, ADR, где используется просто "type"?
Наконец, неплохо бы прояснить, что такое "type tag" и чем оно отличается от "address of Descriptor of T", возвращаемого ADR.

И еще. Может, это вовсе не преднамеренное поведение? И надо не описывать, а править компилятор.

Автор:  adimetrius [ Среда, 04 Август, 2021 16:04 ]
Заголовок сообщения:  Re: Неполнота в описании SYSTEM.TYP

Trurl писал(а):
Вы ведь хотите прояснить, а получается наоборот.
Второй столбик описывает аргументы, а четвертый - результат. Остается неясным, какой будет результат функции, если T - не record type.

Пожалуй, вы меня убедили: раз есть разделение информации по столбикам, надо во 2м указать исчерпывающе и однозначно.

Trurl писал(а):
Далее, чем "type name" отличается от аналогичных параметров MIN, MAX, SIZE, ADR, где используется просто "type"?

Строго говоря, если использовать просто type, то должно работать SYSTEM.TYP(POINTER TO RECORD END). Поэтому я и предложил type name. Но PSI не отличается вообще такой строгостью; пожалуй, можно как в MIN написать: T = [pointer to] record type

Trurl писал(а):
Наконец, неплохо бы прояснить, что такое "type tag" и чем оно отличается от "address of Descriptor of T", возвращаемого ADR.

Отличное замечание! Действительно, Type tag = address of Descriptor of T. Но в PSI это явно не оговаривается, и в описаниях процедур используются эти два отличных термина. Возможно, стоит либо, всамделе, явно прояснить, либо избавиться от одного - наверное, от тэга.

Кроме того, получается, что есть двойственность: SYSTEM.ADR(T) = SYSTEM.TYP(T). Кажется, есть что выкинуть из компилятора. Я не обращал внимания, что есть такая форма ADR.

Trurl писал(а):
И еще. Может, это вовсе не преднамеренное поведение? И надо не описывать, а править компилятор.

Зачем такое дублирование процедур - непонятно. Но вариант SYSTEM.TYP(T) используется в Kernel наряду с SYSTEM.ADR(T) и SYSTEM.TYP(rec).
Так что, может, стоит поправить и компилятор, и PSI.

Кроме того, в PSI написано, что SYSTEM.ADR принимает аргумент T: a record type, однако фактически он принимает и A: an array type, и P: a procedural type. То есть SYSTEM.ADR возвращает адрес дескриптора для всех дескриптируемых типов: структурных, указательных и процедурных.

При этом SYSTEM.TYP принимает только записные и указатели на записные, и не дифференцирует их:
TYPE Rec = RECORD END; PRec = POINTER TO Rec;
SYSTEM.TYP(Rec) = SYSTEM.TYP(PRec)

Получается, единственный случай, когда результаты SYSTEM.TYP и .ADR отличаются - это если T - указатель на безымянный тип:
TYPE T = POINTER TO RECORD END;
SYSTEM.ADR(T) # SYSTEM.TYP(T)

Но это имеет, как кажется, такую ничтожную практическую значимость, что SYSTEM.TYP на мой взгляд - кандидат на исключение вообще.

Автор:  Илья Ермаков [ Четверг, 05 Август, 2021 10:12 ]
Заголовок сообщения:  Re: Неполнота в описании SYSTEM.TYP

Получается, что SYSTEM.TYP всегда даёт именно дескриптор записевого типа, при обращении к указательному разыменовывая его до .base[0].

Если для TYPE T = POINTER TO ARRAY OF RECORD ... END работает взятие SYSTEM.ADR(T^) и оно эквивалентно SYSTEM.TYP, то последний и правда избыточен. А иначе - важен (потому что тогда статически не получить тип именно записи для таких случаев, а на практике нужен именно он постоянно).

Автор:  Trurl [ Четверг, 05 Август, 2021 14:43 ]
Заголовок сообщения:  Re: Неполнота в описании SYSTEM.TYP

adimetrius писал(а):
То есть SYSTEM.ADR возвращает адрес дескриптора для всех дескриптируемых типов: структурных, указательных и процедурных.

А дескриптируемый тип - это тип, для которого SYSTEM.ADR что-то возвращает. :)
Я вообще не представляю, как можно использовать SYSTEM.ADR(T), кроме того случая, когда оно совпадает с SYSTEM.TYP(T).

Автор:  adimetrius [ Четверг, 05 Август, 2021 22:59 ]
Заголовок сообщения:  Re: Неполнота в описании SYSTEM.TYP

К дескриптируемым типам в ББ относятся записи, массивы, указатели на записи, указатели на массивы, и процедурные типы; я их все перечислил выше.
Илья Ермаков писал(а):
Получается, что SYSTEM.TYP всегда даёт именно дескриптор записевого типа, при обращении к указательному разыменовывая его до .base[0].

Если для TYPE T = POINTER TO ARRAY OF RECORD ... END работает взятие SYSTEM.ADR(T^) и оно эквивалентно SYSTEM.TYP, то последний и правда избыточен. А иначе - важен (потому что тогда статически не получить тип именно записи для таких случаев, а на практике нужен именно он постоянно).

Поправлю: .base[.level]

Обе процедуры работают с именами типов => анонимный тип невозможно им передать. Запись T^ формально некорректна (разыменование неприменимо к именам типов), хотя мы, человеки, легко догадываемся, что имеется в виду. Для записи в приведенном вами примере не подойдет ни .ADR, ни .TYP.

А вот такой текст приводит к аварии в компиляторе - как раз там, где ожидается имя базового типа, а, поскольку тип безымянный, приходится разыменовывать NIL.
TYPE T = POINTER TO ARRAY OF RECORD END;
tag := SYSTEM.TYP(T);

В случае TYPE T = POINTER TO RECORD END компилятор принудительно назначает безымянному типу RECORD END имя, если не ошибаюсь T^, поэтому там, где имя базового типа ожидается, оно находится, и аварии не происходит.

Если я вас правильно понял, именно для случая указателя на безымянную запись, вы полагаете, стоит иметь SYSTEM.TYP?

Автор:  Trurl [ Пятница, 06 Август, 2021 06:07 ]
Заголовок сообщения:  Re: Неполнота в описании SYSTEM.TYP

adimetrius писал(а):
К дескриптируемым типам в ББ относятся записи, массивы, указатели на записи, указатели на массивы, и процедурные типы; я их все перечислил выше.

Я смысла этого понятия не улавливаю. У записей есть дескрипторы, они передаются в качестве параметров. А что такое дескриптор указателя, массива или процедуры?

Автор:  Wlad [ Пятница, 06 Август, 2021 06:51 ]
Заголовок сообщения:  Re: Неполнота в описании SYSTEM.TYP

Trurl писал(а):
adimetrius писал(а):
К дескриптируемым типам в ББ относятся записи, массивы, указатели на записи, указатели на массивы, и процедурные типы; я их все перечислил выше.

Я смысла этого понятия не улавливаю. У записей есть дескрипторы, они передаются в качестве параметров. А что такое дескриптор указателя, массива или процедуры?

Скорее всего имеется в виду некая область памяти (указатель или ссылка на оную) с описанием дополнительных свойств и ограничений данных объектов. Некоторым образом, это - часть инфраструктуры функционирования некоего rtti, который не только часть ран-тайма, но и часть набора артефактов времени компиляции.(как у Михаэля Франца).
Прошу учесть, что я не говорю сейчас о конкретике частностей реализации в конкретном языке.
В любом случае есть типовые и неизбежные подходы, решения и средства которые мы вынуждены или обязаны организовывать и применять в реализации языка и его рантайма, чтобы организовывать контексты выполнения и иметь возможность получать доступ к свойствам объектов программы.
Меня просто беспокоит возможность риска ухода в глубину обсуждения частностей и нюансов конкретики именно определённой реализации и ПОСТУЛИРОВАНИЯ именно конкретных решений, без понимания возможности рассмотрения изменения этих решения, с учётом опыта эксплуатации и смены видения на эффективность, логичность, расширяемость и удобство использования таких средств и инфраструктуры.
Фухххх....

Автор:  Илья Ермаков [ Суббота, 07 Август, 2021 18:23 ]
Заголовок сообщения:  Re: Неполнота в описании SYSTEM.TYP

Trurl писал(а):
Я смысла этого понятия не улавливаю. У записей есть дескрипторы, они передаются в качестве параметров. А что такое дескриптор указателя, массива или процедуры?


Ну так в ББ Kernel.Type есть и для массива, и для процедуры.
Для динамического массива он также лежит по -4 от базового адреса объекта в куче.

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