OberonCore

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

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




Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: Суббота, 23 Июнь, 2018 15:52 

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

Есть в описании языка функция SIZE, возвращающая специфичный для платформы размер типа. Сам я считаю её использование нежелательным. В конце-концов главное её предназначение в работе в связке с SYSTEM, пусть и через посреднические модули. Но выяснилось, что её активно используют в Blackbox для промышленных задач.
Цитата:
Есть какой-то тип - блок протокола, например. Простого протокола, уровня модбаса и т.п.
Код:
TYPE
   Header = RECORD
       ...
   END;
   Frame = RECORD
       ...
   END;
Мне нужно объявить буфер, способный хранить нужный мне размер.
Код:
VAR buf: ARRAY SIZE(Header) + SIZE(Frame) OF BYTE;

В то же время в сообщении о языке говорится:
Цитата:
SIZE не может применяться в константных выражениях, т.к. его значение зависит от фактической реализации компилятора.
Это означает, что поведение в подобном применением SIZE является неопределённым, с соответствующими последствиями для переносимости (не смеяться, КП можно использовать вне ББ).

Схожая проблема есть с функцией SHORT. Её могут использовать для отсечения старших разрядов, что не останавливается ББ, так как по умолчанию нет проверки диапазона.
В описании языка сказано:
Код:
Имя    Тип аргументов   Тип результата   Функция
SHORT(x)  LONGINT         INTEGER      тождество
Что не может быть выполнено при переполнении диапазона, а значит, в таком случае поведение тоже не определено.

Так как Blackbox теперь в руках сообщества, то, наверно, и Компонентный Паскаль тоже. Желательно сделать одно из двух:
1. Привести Blacbox Component Builder в состояние, в котором по умолчанию неопределённое поведение трактуется как ошибка, требующая исправления для работы приложения.
2. Привести формальное сообщение о языке к согласию с практичным применением чтобы, по крайней мере, можно было понять код, не прибегая к экспериментам с компилятором.

С точки зрения переносимости и безопасности лучше первое.


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

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
Comdiv писал(а):
Есть в описании языка функция SIZE
Теперь осталось внятно людЯм объяснить, ЧТО возвращает SIZE...


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

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
В описании сказано, что
Код:
Имя      Тип аргументов   Тип результата   Функция
SIZE(T)   любой тип      INTEGER         количество байт, требуемое для T

Не то, чтобы исчерпывающе, но интуитивно понятно.


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

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
Comdiv писал(а):
В описании сказано, что
Код:
Имя      Тип аргументов   Тип результата   Функция
SIZE(T)   любой тип      INTEGER         количество байт, требуемое для T

Не то, чтобы исчерпывающе, но интуитивно понятно.

ЧТО понятно?
ЧТО за размер возвращается?
Мы ведь уже не в мире вульгарного Си! У нас (как и во всяком языке, куда добавлен ООП) размеры экземпляров могут отличаться от тех, которые можно понять из текста описания их типа или класса...
Никаких бы проблем не возникало, если бы мне было не дозволено на низком уровне (и в обход безопасности типов) копаться в "кишках" представления класса. Но мне (по крайней мере иногда, через через атрибуты и "фокусы") ДОЗВОЛЕНО. А там пойдут вопросы - что за размер? какие смещения и соответствие порядка расположения полей тому, как было описано при декларации?...
И т.д....


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

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

Wlad писал(а):
Мы ведь уже не в мире вульгарного Си! У нас (как и во всяком языке, куда добавлен ООП) размеры экземпляров могут отличаться от тех, которые можно понять из текста описания их типа или класса...
Не знаю о чём речь. В мире "вульгарного Си" размеры экземпляров тоже могут отличаться от тех, которые можно понять из текста описания. Вплоть до растяжимого понятия байта, да и скрытые данные не запрещены.


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

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
Comdiv писал(а):
Не знаю о чём речь. В мире "вульгарного Си" размеры экземпляров тоже могут отличаться от тех, которые можно понять из текста описания. Вплоть до растяжимого понятия байта, да и скрытые поля не запрещены.

Вы говорите о различных настройках выравнивания в "вульгарном" Си. Это - единственное место "магии". Но оно - часть модели/стандарта языка и реализации компиляторов. В Си скрытые поля - лишь заполнители компилятором для выравнивания. Да и очерёдность полей в экземпляре не разнится с описанием их в исходнике.
А вот в Си-шарпе уже так утверждать - чревато.
В языках с поддержкой ООП появляются служебные поля в экземплярах. И - начинаются "нюансы" и "фокусы".
Вопрос остаётся: ЧТО возвращает SIZE? КАКОЙ размер? Нам ЭТОТ размер нужен, или, как в СИ-шарпе нужно специальный метод вызывать, типа GetSize, GetInstanceSize, GetMarshallSize и/или пристально ещё и на атрибутику типа смотреть?

ОБНОВЛЕНИЕ: А вот ещё, например в Scheme или Pharo - вообще на счёт размера экземпляра очень скользко инфу получать... Для меня, например до сих пор (просто тесно не связывался, не "прижимало" ещё) их FFI - магия.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 01 Июль, 2018 15:11 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Wlad писал(а):
Вы говорите о различных настройках выравнивания в "вульгарном" Си. Это - единственное место "магии". Но оно - часть модели/стандарта языка и реализации компиляторов. В Си скрытые поля - лишь заполнители компилятором для выравнивания.
Я говорю о стандарте языка, а не о том, как оно реализовано и оптимистичную опору в программах на особенности реализации. А в стандарте всюду неопределённое поведение с трудно предсказуемыми последствиями для общего случая. Заполнители могут использоваться для чего угодно, например, распространено использование "канареек" для обнаружения нарушения памяти. Это применяется для стека, но для структур тоже не запрещено.

Реализовывают сейчас, кстати, тоже сильно по разному и в самом что ни на есть mainstream. Тот функционал, что предоставляется флагами -fsanitize=* в gcc и clang трудно обеспечить без дополнительных данных. А флаг -fsanitize-undefined-trap-on-error делает применение предыдущих флагов пригодным и для конечного продукта, а не только для отладки.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 02 Июль, 2018 01:51 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
Comdiv писал(а):
Я говорю о стандарте языка

Мы - всё не о том.
Необходимо ясное понимание, ЧТО за значения возвращают функции типа SIZE в современных ЯП.
Причём мне это знание нужно не для "внешнего использования" типа выделение нужного размера для коллекции, а - для "копания" в самом объекте на низком уровне. Почему-то эта инфа практически везде или завуалирована в руководствах, или - "размазана" по разным главам в них. А ведь она должна быть вся кучей вывалена (со всеми нюансами и различиями) прямо в месте первого упоминания этой функции или возможности. НЕ НАДО прятать "вычислительный базисный механизм"!


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 02 Июль, 2018 10:26 

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 02 Июль, 2018 23:45 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
Comdiv писал(а):
Можете привести пример, как могла бы выглядеть документация по SIZE?

Зачем же - пример вместо определения?
В Документации по SIZE необходимо указать, ЧТО за значение возвращается функцией в зависимости от разновидности типа объекта, подающегося на её вход.
То есть, будет ли размер, в случае наличия виртуальных функций в классе данного объекта, равен размеру точно такого же описания, но без виртуальных функций?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 02 Июль, 2018 23:54 

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


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

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

Т.е. SIZE - это чисто размер под информационные поля, с учётом выравниваний.

Вариант определения SIZE:
Если считать, что конструкция VAR x: ARRAY n OF Type не имеет собственной метаинформации (а оно так и есть - размеры статически проверяет компилятор), то SIZE = размер в байтах, занимаемый массивом / n.
Хотя тоже через одно место как-то )


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 11 Июль, 2018 00:56 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
Илья Ермаков писал(а):
Вариант определения SIZE:
Если считать, что конструкция VAR x: ARRAY n OF Type не имеет собственной метаинформации (а оно так и есть - размеры статически проверяет компилятор), то SIZE = размер в байтах, занимаемый массивом / n.
Хотя тоже через одно место как-то )

В этом примере SIZE учитывает выравнивание элементов массива?
Если элементы массива содержат "служебные поля по отрицательному смещению", то они входят в размер элемента?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 11 Июль, 2018 18:29 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Wlad писал(а):
Илья Ермаков писал(а):
Вариант определения SIZE:
Если считать, что конструкция VAR x: ARRAY n OF Type не имеет собственной метаинформации (а оно так и есть - размеры статически проверяет компилятор), то SIZE = размер в байтах, занимаемый массивом / n.
Хотя тоже через одно место как-то )

В этом примере SIZE учитывает выравнивание элементов массива?
Если элементы массива содержат "служебные поля по отрицательному смещению", то они входят в размер элемента?


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 18 Июль, 2018 01:22 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
Илья Ермаков писал(а):
Интересный вопрос.
Если говорить конкретно о реализационной семантике ...

Спасибо за ответ, Илья.
Тишина?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 02 Октябрь, 2018 01:00 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1543
Тему не читал, сразу отвечаю. А я правильно понимаю, что MAX(INTEGER) тоже зависит от реализации компилятора? Это же гораздо страшнее, чем SIZE, и низводит ваш распрекрасный КП до уровня вульгарного Си. ЕМНИП в Java всё устроено гораздо лучше в этом отношении - там типы имеют конкретный размер. В лиспе тоже лучше - там целые числа имеют неограниченную точность :mrgreen: Если уж наводить порядок, то надо начать с запрета INTEGER, вместо которого нужно ввести типы конкретной битности. В последних стандартах Си есть некоторые поползновения в этом направлении. Правда, избавиться от UB в арифметике всё равно будет тяжело. И вот вам мой тег BlackBoxComponentBuilder.

Поскольку все мои слова умножаются примерно на 1e-10, я привожу конкретнейший пример. Прибваляю я в КП к INTEGER-у 2 INTEGER 2. Ну или там 65535 + 1. Сколько получится? А хто его знает. Т.е. даже простейший калькулятор на КП написать нельзя, равно как и на Си.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 02 Октябрь, 2018 09:52 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
В нашем прекрасном КП размеры элементарных типов фиксированы в определении языка.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 02 Октябрь, 2018 11:36 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1543
А, нашёл, приложение C. Извините. Пожаловался на себя модератору :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 03 Октябрь, 2018 23:40 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
budden писал(а):
Тему не читал, сразу отвечаю.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 05 Октябрь, 2018 11:19 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Comdiv писал(а):
Так как Blackbox теперь в руках сообщества, то, наверно, и Компонентный Паскаль тоже.
Я думаю что это ошибочное рассуждение.


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

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


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

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


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

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