OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 14 Июнь, 2025 21:44

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




Начать новую тему Ответить на тему  [ Сообщений: 404 ]  На страницу Пред.  1 ... 17, 18, 19, 20, 21  След.
Автор Сообщение
СообщениеДобавлено: Четверг, 08 Май, 2025 17:33 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 238
Откуда: Питер
Ещё раз про inline.

Я обнаружил, что в gcc функции с атрибутами static inline не всегда, собственно, инлайнятся (обнаружил случайно используя функцию alloca, которая чувствительна к инлайну). А если добавить атрибут __attribute__((always_inline)), - то инлайнятся. По этому я предлагаю инлайн процедуры помечать этими атрибутами: static inline __attribute__((always_inline))


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 08 Май, 2025 17:39 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 238
Откуда: Питер
Ещё одна ошибка в oFront+:

Код:
MODULE Test;

CONST
   IntConst = 0C00000FDH;

PROCEDURE Ex;
   VAR
      i:INTEGER;
   BEGIN
      CASE i OF
(*       | 1:; *)
      | IntConst:;
      END;
   END Ex;

END Test.


Этот модуль успешно компилируется. Это нормально - ведь IntConst - это всего лишь целочисленная отрицательная константа, выраженная в 16-ричной записи.
А если раскомментировать строчку в операторе CASE, - то выдаётся ошибка case range too large.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 08 Май, 2025 17:48 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 238
Откуда: Питер
Ещё один вопрос.

При компиляции для 64-битной windows, невозможно выделить больше 2 Гб памяти при помощи оператора NEW, и невозможно объявить переменную с размером больше 2 Гб. Это планируется как-нибудь исправить?

(выделение памяти >2 Гб бывает актуальным и в 32-разрядной версии)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 10 Май, 2025 03:49 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 586
Откуда: Украина, Днепропетровская обл.
GameHunter писал(а):
По этому я предлагаю инлайн процедуры помечать этими атрибутами: static inline __attribute__((always_inline))
Но это же нестандартный атрибут GCC? Мы не можем предполагать, что компилятор всегда GCC. Нам нужна поддержка разных Си-компиляторов.

Однако я могу обернуть inline в макрос __INLINE, и там уже прописывайте чего хотите. Сделать? Но это доп. возможности накуролесить, если прописать в этом макросе что-то криво. Опять же, а static тоже вынести в реализацию этого макроса или дописывать этот атрибут дополнительно? Потому что без static получится совсем другая логика inline, а inline в Си и так довольно уродский.

GameHunter писал(а):
А если раскомментировать строчку в операторе CASE, - то выдаётся ошибка case range too large.
Это не ошибка, а особенность реализации. CASE имеет свои накладные расходы. Я, впрочем, не уверен, что такой разброс скомпилируется на некоторых Оберонах.

IntConst = 0C00000FDH = -1073741571
Т.е. Вы пытаетесь задать диапазон -1073741571..1, и выигрыша здесь от CASE вообще никакого не будет. Смысл CASE — в оптимизации ветвлений при небольших диапазонах. А в данном случае лучше обойтись IF.

Вы знаете как скомпилируется в Ofront'е CASE ch OF 20X..7FX ? Проверьте, будете разочарованы. Если Вам это кажется уродливым, то вспомним сам смысл CASE — оптимизировать переходы в машинном коде при помощи небольшой таблички. А если сделать реализацию CASE через if вместо switch/case, то это будет просто синтаксический сахар и косметика над if, и мы потеряем смысл эффективного CASE.

GameHunter писал(а):
При компиляции для 64-битной windows, невозможно выделить больше 2 Гб памяти при помощи оператора NEW, и невозможно объявить переменную с размером больше 2 Гб. Это планируется как-нибудь исправить?
Не планируется. Так как:

1. При принудительном изменении типа для задания размера памяти (в NEW, а также в индексах массивов) на LONGINT мы потеряем совместимость, потеряем возможность собирать программу с одного исходника для 32 и 64 бит. А на это делается упор. Напоминаю, мы не сможем сочетать индексы INTEGER для малого размера массивов и LONGINT для большого. Нет. Нам вместо этого придётся все индексы перевести на LONGINT, потому что мало ли сколько выделит пользователь через NEW. И так мы серьёзно присадим эффективность работы с массивами, а в случае 32-битных ОС её вообще бессмысленно убьём.

А Вы видите способ увеличить вместимость переменной INTEGER до > MAX(INTEGER) [>2 Гб]?

2. Я делал некоторые зачатки 64-битных индексов, в SYSTEM и OPM даже есть параметр SYSTEM_ARRLEN (OPM.IndexSize), но пришлось здесь отказаться от 64-битности, иначе всё получается слишком уродливо. Много нужно ломать старого кода, понимаете? И не факт, что результат нас порадует.

3. В BlackBox также нет возможности выделить такой огромный объём памяти. А кто мешает работать с большими объёмами памяти по частям? Зачем такой огромный непрерывный кусок? Это малоэффективно, так как сильно нагружает память. Лучше работать с таким объёмом кусками, а не непрерывно. Например, через список, каждый элемент которого будет иметь указатель на кусок памяти и ссылку на следующий элемент. Так ОС хотя бы сможет размещать эту память не непрерывно одним куском, а произвольно. Впрочем, я не уверен, что сборщик мусора Ofront/Ofront+ вообще даст использовать такие большие объёмы даже по частям. Это надо кому-то проверить.

4. В Ofront'е+ есть возможность подключить библиотеку или вызвать кусок кода на Си (кодовую вставку), которые организуют работу с огромным массивом [> 2 Гб] в памяти. С учётом того, что задача работать с такими огромными объёмами узко специфична, это не самое плохое решение.

5. Наконец, Вы сами можете сделать свою правку в Ofront+, и если сделаете всё красиво и ничего не сломаете — мы её интегрируем. Очевидно, для 32-бит стоит оставить индексы INTEGER, а для 64-бит сделать их LONGINT.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 10 Май, 2025 06:52 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 586
Откуда: Украина, Днепропетровская обл.
DeepSeek писал(а):
В Си инлайнинг функций, помеченных как inline, действительно является рекомендацией, а не строгим требованием. Компилятор принимает окончательное решение на основе своих эвристик (размер функции, уровень оптимизации и т. д.).

Решение проблемы
always_inline атрибут
Ваше предложение использовать __attribute__((always_inline)) — это правильный способ форсировать инлайнинг в GCC.
Пример:

static inline __attribute__((always_inline)) void foo() {
// ...
}

Опция компиляции -finline-functions (или -O3)
Если вы хотите, чтобы GCC агрессивнее инлайнил функции (даже без always_inline), можно использовать:

gcc -O3 -finline-functions -finline-small-functions -finline-functions-called-once
Но это не гарантирует инлайнинг конкретной функции — только делает его более вероятным.

Попробуйте ещё эти опции. Мне бы не хотелось делать inline макросом, потому что юзер может убрать оттуда static, и всё посыпется.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 10 Май, 2025 20:03 

Зарегистрирован: Суббота, 30 Июль, 2022 12:02
Сообщения: 81
GameHunter писал(а):
Ещё одна ошибка в oFront+:

Код:
MODULE Test;

CONST
   IntConst = 0C00000FDH;

PROCEDURE Ex;
   VAR
      i:INTEGER;
   BEGIN
      CASE i OF
(*       | 1:; *)
      | IntConst:;
      END;
   END Ex;

END Test.


Этот модуль успешно компилируется. Это нормально - ведь IntConst - это всего лишь целочисленная отрицательная константа, выраженная в 16-ричной записи.
А если раскомментировать строчку в операторе CASE, - то выдаётся ошибка case range too large.


Если речь идёт об О7, то этот пример не должен компилироваться, потому что со времен первой редакции О7 нельзя использовать отрицательные целые в качестве меток в CASE:
Цитата:
Case statements specify the selection and execution of a statement sequence according to the
value of an expression. First the case expression is evaluated, then the statement sequence is
executed whose case label list contains the obtained value. The case expression must be of type
INTEGER, and all labels must be non-negative integers.

А если это О2, то ошибка вполне корректная, потому что константа LONGINT, а переменная INTEGER.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 11 Май, 2025 02:57 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 586
Откуда: Украина, Днепропетровская обл.
Когда-нибудь сделаем и рефакторинг реализации CASE. Пока занят другой проблемой.

Думал ещё по поводу сделать __INLINE макросом. В принципе, можно. Но как быть с тем, если компилятор считает, что в данном конкретном случае инлайнинг не нужен, а мы принудительно его форсим? Точно ли это хорошо?

По поводу огромных массивов. Можно запрашивать память под такой массив у ОС при помощи Platform.OSAllocate и работать с ним через SYSTEM.PUT/GET. Будут массивы > 2 Гб. Но вроде как 32-битная винда не даст выделить кусок больше двух Гб. Вклячивать такие огромные объёмы внутрь сборщика мусора нет смысла.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 11 Май, 2025 04:55 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 238
Откуда: Питер
Здравствуйте.

Я использую Компонентный Паскаль. Сорри, что сразу это не отметил.

Цитата:
Смысл CASE — в оптимизации ветвлений при небольших диапазонах
Нет! Смысл CASE - в простоте, красивости и надёжности этой языковой конструкции. Именно с языковой точки зрения она лучше, чем последовательность IF-ов. Оптимизация - всего лишь дополнительный бонус, и это задача не моя, пользователя компилятора, а его разработчтка. Если нет оснований для отказа от отрицательных чисел (а оптимизация - недостаточное основание), - не надо от них отказываться. Тем более что потребность такая есть. Тем более это соответствует стандарту КП. Интересно, а какая мотивация у разработчиков O7, что они запретили отрицательные числа в CASE? BlackBox их спокойно принимает.

По поводу inline: это слишком нестандартная фича, делайте как вам удобнее. Просто для некоторых системных вещей удобно быть уверенным в inline-е. Мне нравится идея использовать макрос для инлайна, и отразить это в документации...

По поводу массивов: в BB можно индексировать элементы массива переменными типа LONGINT. По моему это правильно: не надо привязыватья к битности системы без необходимости. Никаких трудностей (для пользователя компилятора) не возникает. В oFront+'е, кстати, тоже можно индексировать элементы массива переменными типа LONGINT, нельзя только объявлять типы большого размера. Жаль.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 12 Май, 2025 04:43 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 586
Откуда: Украина, Днепропетровская обл.
Не кипятитесь так. Это не я сделал такую реализацию CASE в Ofront'е. И мне она самому не слишком нравится, особенно диапазоны.

GameHunter писал(а):
Интересно, а какая мотивация у разработчиков O7, что они запретили отрицательные числа в CASE?
Применяемость О7 только для микроконтроллеров (ума не приложу, почему для микроконтроллеров не нужны отрицательные метки). Упрощение компилятора. Больше вроде причин нет.

GameHunter писал(а):
Просто для некоторых системных вещей удобно быть уверенным в inline-е.
Можно подходить к опции inline как к обязательности, а можно как к рекомендации компилятору. Сложно сказать, что лучше. Компилятору иногда виднее, как оптимальнее сделать.

GameHunter писал(а):
По поводу массивов: в BB можно индексировать элементы массива переменными типа LONGINT. По моему это правильно: не надо привязыватья к битности системы без необходимости. Никаких трудностей (для пользователя компилятора) не возникает.
Трудность в том, что на 32-битной системе нет смысла использовать LONGINT для индексации, потому что это оверпрайс.

GameHunter писал(а):
В oFront+'е, кстати, тоже можно индексировать элементы массива переменными типа LONGINT, нельзя только объявлять типы большого размера. Жаль.
А Вы уверены, что сборщик ББ выделит память под такой огромный массив? А статически можно? Проверьте, пожалуйста, и отпишитесь.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 13 Май, 2025 02:39 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 238
Откуда: Питер
ББ, конечно, не выделит, он же 32-разрядный. (Вообще, для 32-разряжных приложений в 64-битной Windows можно выделить больше 3 Гб, с флагом Large address aware - но это, конечно, полумера, по сравнению с переходом на 64 бит).

Про статистику я не понял вопроса.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 13 Май, 2025 19:27 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 586
Откуда: Украина, Днепропетровская обл.
GameHunter писал(а):
Про статистику я не понял вопроса.
Статически это VAR mas: ARRAY N OF ...
А динамически это NEW(arr, N)

Статически можно описать такой огромный массив?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 13 Май, 2025 22:13 

Зарегистрирован: Суббота, 30 Июль, 2022 12:02
Сообщения: 81
Oleg N. Cher писал(а):
GameHunter писал(а):
Про статистику я не понял вопроса.
Статически это VAR mas: ARRAY N OF ...
А динамически это NEW(arr, N)

Статически можно описать такой огромный массив?

Выше 2 Гбайт нельзя. Сделал такой пример
Код:
MODULE TestTemp;
IMPORT StdLog;
VAR
  m:ARRAY MAX(INTEGER) OF REAL;
PROCEDURE Do*();
BEGIN
  m[MAX(INTEGER)-1]:=111.111;
  StdLog.Real(m[MAX(INTEGER)-1]);
  StdLog.Ln;
END Do;
BEGIN
END TestTemp.

При компиляции выдаёт ошибку structure too large.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 14 Май, 2025 00:27 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 586
Откуда: Украина, Днепропетровская обл.
Проверил в ББ как работает CASE с переменной LONGINT. Оказывается, не работает. Так что, как видите, в ББ тоже не всё идеально с CASE.


Вложения:
Case.png
Case.png [ 11.61 КБ | Просмотров: 1954 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 22 Май, 2025 13:26 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1466
Откуда: Киев
AlexBogy писал(а):
со времен первой редакции О7 нельзя использовать отрицательные целые в качестве меток в CASE

Предложение составлено так, что вводит в заблуждение. Всё, что сказано про целочисленные метки:
Цитата:
If the case expression is of type INTEGER or CHAR, all labels must be integers or single-character strings, respectively.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 23 Май, 2025 12:55 

Зарегистрирован: Суббота, 30 Июль, 2022 12:02
Сообщения: 81
Comdiv писал(а):
AlexBogy писал(а):
со времен первой редакции О7 нельзя использовать отрицательные целые в качестве меток в CASE

Предложение составлено так, что вводит в заблуждение. Всё, что сказано про целочисленные метки:
Цитата:
If the case expression is of type INTEGER or CHAR, all labels must be integers or single-character strings, respectively.

Цитата из перевода описания О7 на сайте wiki.oberon.org
Цитата:
Настоящий документ описывает язык, определенный в 1988/90 в редакции 2007 / 2016 годов.

Поэтому утверждать, что описание 2016 года не учитывает описание 2007 года, я бы не стал.
И кстати, в описании языка от 2016 года ничего не говорится об области видимости вложенных процедур, это есть в отдельном файле. Поэтому в данном случае, поскольку новое описание языка Виртом окончательно сформулировано не было, опираться только на описание текущей редакции некорректно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 23 Май, 2025 22:14 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4722
Откуда: Россия, Орёл
AlexBogy писал(а):
Поэтому в данном случае, поскольку новое описание языка Виртом окончательно сформулировано не было, опираться только на описание текущей редакции некорректно.

Корректно и было сформулировано. Вот действующее описание языка.
https://people.inf.ethz.ch/wirth/Oberon ... Report.pdf
Другого нет, считайте это стандартом.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 24 Май, 2025 12:34 

Зарегистрирован: Суббота, 30 Июль, 2022 12:02
Сообщения: 81
Борис Рюмшин писал(а):
AlexBogy писал(а):
Поэтому в данном случае, поскольку новое описание языка Виртом окончательно сформулировано не было, опираться только на описание текущей редакции некорректно.

Корректно и было сформулировано. Вот действующее описание языка.
https://people.inf.ethz.ch/wirth/Oberon ... Report.pdf
Другого нет, считайте это стандартом.

В указанном вами документе нет фразы, которая есть в документе:
Код:
Oberon-07 (Revised Oberon) (Oberon at a glance) NW 20.11.2013
No access to variables in outer procedures

Тем не менее, все реализации О7 её поддерживают. Значит, все эти реализации не соответствуют описанию языка 2016 года?
Далее, возвращаясь к CASE. Описание языка гласит:
Цитата:
The type T of the case expression (case variable) may also be a record or pointer type. Then the
case labels must be extensions of T, and in the statements Si labelled by Ti, the case variable is
considered as of type Ti.

Но выше, в разделе 6.3, даётся описание расширения типов:
Цитата:
Definition: A type T extends a type T0, if it equals T0, or if it directly extends an extension of T0.
Conversely, a type T0 is a base type of T, if it equals T, or if it is the direct base type of a base type
of T.

Вопрос для реализации - должны ли метки в CASE содержать базовый тип, который является расширением самого себы, согласно определению, а также расширения расширений базового типа?
И для меток: как для целых, так и для типов записи - ориентироваться на текст или на примеры?
И наконец, повторю свой исходный вопрос:
Надо ли при анализе описания языка учитывать фразу, вынесенную во введение:
Цитата:
This document describes the language defined in 1988/90 as revised in 2007 / 2016.

Ведь зачем-то же 2007 год был упомянут, не так ли?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 24 Май, 2025 23:07 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4722
Откуда: Россия, Орёл
Хорошо, что анализируете вопрос.
Думаю, стоит посмотреть, как первоисточник, виртовский компилятор. Правда CASE у него не реализован до конца.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 25 Май, 2025 20:19 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1466
Откуда: Киев
AlexBogy писал(а):
В указанном вами документе нет фразы, которая есть в документе:
Код:
Oberon-07 (Revised Oberon) (Oberon at a glance) NW 20.11.2013
No access to variables in outer procedures

Снова слова подобраны так, что вводят в заблуждение. Вот, что сказано в указанном документе:
Цитата:
In addition to its formal parameters and locally declared objects, the objects declared globally are also visible in the procedure.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 28 Май, 2025 12:39 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 238
Откуда: Питер
Ещё одна ошибка в oFront+'е (компонентный паскаль).

Код:
MODULE Test;

IMPORT
   Console, Kernel;

PROCEDURE LongLongNameDo0123456789 * ();
   BEGIN
      Console.String('A sample string'); Console.Ln(); Console.Flush();
   END LongLongNameDo0123456789;

BEGIN
   LongLongNameDo0123456789();
END Test.


Эта программа останавливается на каком-то ASSERT(..) при выполнении, а если имя процедуры сократить на 1 символ, всё работает корректно.

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


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

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


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

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


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

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