OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Воскресенье, 03 Ноябрь, 2024 03:46

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




Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
 Заголовок сообщения: Неполнота в описании SYSTEM.TYP
СообщениеДобавлено: Понедельник, 26 Июль, 2021 16:05 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Коллеги, процедура 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


Что скажете?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Неполнота в описании SYSTEM.TYP
СообщениеДобавлено: Вторник, 27 Июль, 2021 13:29 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Поддерживаю.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Неполнота в описании SYSTEM.TYP
СообщениеДобавлено: Вторник, 27 Июль, 2021 16:34 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1430
Но стаким описанием можно ожидать, что будет работать и SYSTEM.TYP(REAL)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Неполнота в описании SYSTEM.TYP
СообщениеДобавлено: Вторник, 27 Июль, 2021 19:28 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
record type qualident
(как там для массивов, вопрос? А то non-basic type...)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Неполнота в описании SYSTEM.TYP
СообщениеДобавлено: Вторник, 27 Июль, 2021 19:37 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1430
Илья Ермаков писал(а):
как там для массивов, вопрос?

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Неполнота в описании SYSTEM.TYP
СообщениеДобавлено: Среда, 28 Июль, 2021 08:22 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Trurl писал(а):
Но стаким описанием можно ожидать, что будет работать и SYSTEM.TYP(REAL)


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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Неполнота в описании SYSTEM.TYP
СообщениеДобавлено: Среда, 28 Июль, 2021 13:23 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
adimetrius писал(а):

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


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Неполнота в описании SYSTEM.TYP
СообщениеДобавлено: Среда, 28 Июль, 2021 15:07 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1430
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.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Неполнота в описании SYSTEM.TYP
СообщениеДобавлено: Среда, 04 Август, 2021 16:04 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
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 на мой взгляд - кандидат на исключение вообще.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Неполнота в описании SYSTEM.TYP
СообщениеДобавлено: Четверг, 05 Август, 2021 10:12 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Получается, что SYSTEM.TYP всегда даёт именно дескриптор записевого типа, при обращении к указательному разыменовывая его до .base[0].

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Неполнота в описании SYSTEM.TYP
СообщениеДобавлено: Четверг, 05 Август, 2021 14:43 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1430
adimetrius писал(а):
То есть SYSTEM.ADR возвращает адрес дескриптора для всех дескриптируемых типов: структурных, указательных и процедурных.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Неполнота в описании SYSTEM.TYP
СообщениеДобавлено: Четверг, 05 Август, 2021 22:59 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
К дескриптируемым типам в ББ относятся записи, массивы, указатели на записи, указатели на массивы, и процедурные типы; я их все перечислил выше.
Илья Ермаков писал(а):
Получается, что 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?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Неполнота в описании SYSTEM.TYP
СообщениеДобавлено: Пятница, 06 Август, 2021 06:07 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1430
adimetrius писал(а):
К дескриптируемым типам в ББ относятся записи, массивы, указатели на записи, указатели на массивы, и процедурные типы; я их все перечислил выше.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Неполнота в описании SYSTEM.TYP
СообщениеДобавлено: Пятница, 06 Август, 2021 06:51 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
Trurl писал(а):
adimetrius писал(а):
К дескриптируемым типам в ББ относятся записи, массивы, указатели на записи, указатели на массивы, и процедурные типы; я их все перечислил выше.

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Неполнота в описании SYSTEM.TYP
СообщениеДобавлено: Суббота, 07 Август, 2021 18:23 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Trurl писал(а):
Я смысла этого понятия не улавливаю. У записей есть дескрипторы, они передаются в качестве параметров. А что такое дескриптор указателя, массива или процедуры?


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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

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


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

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


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

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