OberonCore
https://forum.oberoncore.ru/

добавить в oo2c синтаксис КП
https://forum.oberoncore.ru/viewtopic.php?f=30&t=5927
Страница 2 из 3

Автор:  Artyemov [ Понедельник, 08 Октябрь, 2018 17:59 ]
Заголовок сообщения:  Re: добавить в oo2c синтаксис КП

GameHunter писал(а):
Здравствуйте.

Каково на данный момент состояние Ofront+?
Включает ли он в себя все особенности Oberon-2?
Насколько хорошо адаптирован для целевой платформы Win-64 бит?
Есть ли встроенная поддержка комплексных чисел?

С уважением, GH.

Отвечу как недавний пользователь: состояние - прекрасное ;)
Основная ориентация на КП, не на О-2.
Встроенной поддержки комплексных чисел нет, но её разве где-то есть?

Автор:  Oleg N. Cher [ Понедельник, 08 Октябрь, 2018 22:45 ]
Заголовок сообщения:  Re: добавить в oo2c синтаксис КП

GameHunter писал(а):
Каково на данный момент состояние Ofront+?
Состояние уверенно стабильное, рекомендуется использовать последнюю сборку из репозитория.

Хост- и таргет-платформы: Linux x86, x64 и ARM, а также Windows x86 и x64.

GameHunter писал(а):
Включает ли он в себя все особенности Oberon-2?
Да. Полная поддержка Оберона-2 есть ещё в оригинальном Ofront'е. Если что-то не доработано, будет интересно это исправить. Тестируйте, пишите отзывы.

Есть некоторые трудности с динамической модульностью как она понимается в Оберон-парадигме (насколько мне известно, те же трудности есть в XDS или, скажем, POW!). Но можно создавать и использовать динамические библиотеки.

GameHunter писал(а):
Насколько хорошо адаптирован для целевой платформы Win-64 бит?
Я считаю, он вполне стабилен для 64-битных платформ и подходит намного лучше, чем Ofront. Возможности по написанию биндингов расширены, добавлена модель вызова stdcall. Есть биндинги для WinAPI, SDL, SDL 2.

Также реализованы системные типы: ADRINT (целое со знаком размера адреса), INT8, INT16, INT32 и INT64.

GameHunter писал(а):
Есть ли встроенная поддержка комплексных чисел?
Увы. Только библиотечно. Ссылки на реализации таких библиотек я приводил выше в этой теме.

Artyemov писал(а):
Встроенной поддержки комплексных чисел нет, но её разве где-то есть?
В XDS вроде есть, говорят.

Автор:  GameHunter [ Вторник, 09 Октябрь, 2018 12:49 ]
Заголовок сообщения:  Re: добавить в oo2c синтаксис КП

Спасибо.

Автоматическая сборка мусора совместима с многопоточностью?

Автор:  GameHunter [ Вторник, 09 Октябрь, 2018 18:31 ]
Заголовок сообщения:  Re: добавить в oo2c синтаксис КП

Ещё пара вопросов.

Я поигоался с последней версией Ofront+, успешно скомпилировал и запустил "Hello World", используя MinGW-w64, целевая платформа - 64-разрядная Windows.

Вот тестовая программа, которая породила ещё несколько вопросов:
Код:
MODULE Hello;

IMPORT
  C:=Console;

CONST
  len1 = 2*1024-1;
  len2 = 1024;
  len3 = 1024;

(*  TotalLength = len1*len2*len3; *)

TYPE
  Arr = ARRAY len1,len2,len3 OF SHORTCHAR;

VAR
  p:POINTER TO Arr;

BEGIN
  NEW(p);
  C.String("Hello, World!"); C.Ln;
  C.Int(SIZE(SHORTCHAR),0); C.Ln;

  C.Flush();
END Hello.


В таком виде программа работает как ожидается. Если же
Код:
len1 = 2*1024;
, программа выходит, не говоря ни слова. Очевидно, нельзя выделить монолитный кусок памяти, если его размер >= 2 Гб. (для сравнения, в 64-битном Free Pasca'е такое же ограничение.)
Вопрос 1: нельзя ли это ограничение убрать? (Ну, да это несущественно, ведь можно использовать ARRAY OF POINTER TO ARRAY OF POINTER TO ARRAY OF SHORTCHAR)
Вопрос 2: Наверное, при подобных недопустимых действиях надо выдавать какое-то сообщение?

Вопрос 3:
Теперь попробуем раскомментировать 11-ю строчку программы:
Код:
TotalLength = len1*len2*len3;
. Здесь, если опять-таки TotalLength>MAX(Int32), компилятор Ofront+ выдаёт ошибку product too large, хотя ожидается, что это просто 64-битная константа. У меня не получилось задать 64-битную константу большого размера как я ни пытался. Кстати, в сообщении про Компонентный Паскать говорится, что можно явно указывать 64-битность константы, если в конце добавить "L", например 123L. Но так тоже не получается, даже при трансляции с ключом -C.

Вопрос 4: есть возможность программе узнать размер динамической памяти, выделенной под различные объекты, и их количество?

Автор:  Oleg N. Cher [ Четверг, 11 Октябрь, 2018 00:03 ]
Заголовок сообщения:  Re: добавить в oo2c синтаксис КП

GameHunter писал(а):
Очевидно, нельзя выделить монолитный кусок памяти, если его размер >= 2 Гб. (для сравнения, в 64-битном Free Pasca'е такое же ограничение.)
Вопрос 1: нельзя ли это ограничение убрать? (Ну, да это несущественно, ведь можно использовать ARRAY OF POINTER TO ARRAY OF POINTER TO ARRAY OF SHORTCHAR)
Когда я работал над сборщиком мусора, то постоянно имел в виду кроссплатформенность и совместимость исходника как с 32-битными платформами, так и с 64-битными. На 32-битной платформе выделить память таким огромным куском просто нельзя. Ну может можно 4 Гб, но в Обероне нет беззнаковых типов. Поэтому даже адресный со знаком.

Портируя Ofront, я для своих собственных нужд урезал тип индекса до INTEGER. То есть сейчас любой массив может индексироваться только в пределах 2 Гб. Я решил, что этого будет достаточно. Но Вы можете попробовать поиграться с индексом большим, чем предусмотрено из коробки. Для этого есть две волшебных фичи. Первая в SYSTEM.h:
Код:
typedef int SYSTEM_ARRLEN; // 32 or 64 bits, see also OPM.IndexSize and MaxIndex
Меняете на long long

Вторая в OPM.GetProperties:
Код:
IndexSize := 4;   (* size of the type of array index, see also SYSTEM_ARRLEN *)
MaxIndex := MAX(INTEGER)
Меняете, соответственно, на IndexSize := 8 и MaxIndex := MAX(LONGINT).

И пересобираете Ofront+. Однако я это не тестировал. Но, сами понимаете, раз размер массива лимитировался 32-битным индексом со знаком, то откуда бы взяться массиву большего размера.

GameHunter писал(а):
Если же
Код:
len1 = 2*1024;
, программа выходит, не говоря ни слова. Вопрос 2: Наверное, при подобных недопустимых действиях надо выдавать какое-то сообщение?
Она говорит слово, см. код возврата.
Если импортировать Kernel, то ошибка будет обработана ещё более явно:

1 Terminated by Halt(-25). Memory allocation error.

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

GameHunter писал(а):
Вопрос 3:
Теперь попробуем раскомментировать 11-ю строчку программы:
Код:
TotalLength = len1*len2*len3;
. Здесь, если опять-таки TotalLength>MAX(Int32), компилятор Ofront+ выдаёт ошибку product too large, хотя ожидается, что это просто 64-битная константа.
Что-то у меня не получается воспроизводить указанные Вами ошибки указанным Вами способом. Вот такой код, например, работает:
Код:
  TotalLength = MAX(LONGINT);
...
  C.LongInt(TotalLength,0); C.Ln;

9223372036854775807

Вы точно взяли Ofront+ с репозитория?

GameHunter писал(а):
У меня не получилось задать 64-битную константу большого размера как я ни пытался. Кстати, в сообщении про Компонентный Паскать говорится, что можно явно указывать 64-битность константы, если в конце добавить "L", например 123L. Но так тоже не получается, даже при трансляции с ключом -C.
Всё верно, КП поддержан в Ofront+ ещё не полностью. Именно это ещё не сделано. Но сейчас можно так:
Код:
  TotalLength1 = 0FFFFFFFFFFFFFFFFH;
  TotalLength2 =  8000000000000000H;
  TotalLength3 =  7F00000000000000H;
BEGIN
  C.LongInt(TotalLength1,0); C.Ln;
  C.LongInt(TotalLength2,0); C.Ln;
  C.LongInt(TotalLength3,0); C.Ln;

-1
-9223372036854775808
9151314442816847872

Всё работает, я только что проверил.

GameHunter писал(а):
Вопрос 4: есть возможность программе узнать размер динамической памяти, выделенной под различные объекты, и их количество?
Нужно врезаться в модуль Heap и переписывать сборщик мусора. Может Вам просто лучше написать прослойку между прикладным слоем и GC, которая будет вести свою статистику?

Автор:  GameHunter [ Воскресенье, 14 Октябрь, 2018 17:20 ]
Заголовок сообщения:  Re: добавить в oo2c синтаксис КП

Спасибо.

По поводу больших констант:
Вот такой модуль, как вы и писали, компилируется и работает хорошо:
Код:
MODULE Example;

IMPORT
  C:=Console;

CONST
  TotalLength1 = 0FFFFFFFFFFFFFFFFH;
  TotalLength2 =  8000000000000000H;
  TotalLength3 =  7F00000000000000H;

BEGIN
  C.LongInt(TotalLength1,0); C.Ln;
  C.LongInt(TotalLength2,0); C.Ln;
  C.LongInt(TotalLength3,0); C.Ln;
  C.Flush;
END Example.

, а вот такой выдаёт ошибку "err 204 product too large" в десятой строчке:
Код:
MODULE Example;

IMPORT
  C:=Console;

CONST
  TotalLength1 = 0FFFFFFFFFFFFFFFFH;
  TotalLength2 =  8000000000000000H;
  TotalLength3 =  7F00000000000000H;
  TotalLength4 =  2*1024*1024*1024;

BEGIN
  C.LongInt(TotalLength1,0); C.Ln;
  C.LongInt(TotalLength2,0); C.Ln;
  C.LongInt(TotalLength3,0); C.Ln;
  C.LongInt(TotalLength4,0); C.Ln;
  C.Flush;
END Example.

Использовал последнюю версию Ofront. Могу только предположить, что для математических вычислений констант в Ofront'е используются 32-разрядные числа, доже если сами константы 64-разрядные.

И ещё вопрос (я его уже задавал, но ответа не получил): совместим ли Ofront'овский сборщик мусора ч многопоточностью?

Автор:  Oleg N. Cher [ Понедельник, 15 Октябрь, 2018 03:01 ]
Заголовок сообщения:  Re: добавить в oo2c синтаксис КП

GameHunter писал(а):
TotalLength4 = 2*1024*1024*1024;
Это отголоски 32-битного прошлого Ofront'а+. Исправил.

GameHunter писал(а):
совместим ли Ofront'овский сборщик мусора ч многопоточностью?
Нет.

BlackBox с однопоточным сборщиком как-то умудряется использовать для обработки сообщений второй поток. Надо посмотреть, как там это устроено (наверное второй поток просто не трогает указателей?).

А Вы знаете хотя бы одну реализацию Оберона для Windows или Linux, в которой сборщик бы поддерживал многопоточность?

Автор:  GameHunter [ Понедельник, 15 Октябрь, 2018 14:26 ]
Заголовок сообщения:  Re: добавить в oo2c синтаксис КП

В XDS многопоточность поддержиаается.

Кстати, по идее, поддержку многопоточности несложно организовать. Как я понимаю, автоматическая сборка мусора может вызываться либо в теле процедуры NEW, либо принудительно вызовом процедуры SYSTEM.GC(). Для многопоточности вроде бы достаточно заключить реализации этих процедур в одну и ту же критическую секцию.

Ещё вопрос. Если Ofront+ запускать с параметром -2 либо вообще без параметра, определющего входной язык, то тип CHAR не является предопределённым - есть только SHORTCHAR. Это правильно?

Автор:  Rifat [ Понедельник, 15 Октябрь, 2018 14:35 ]
Заголовок сообщения:  Re: добавить в oo2c синтаксис КП

GameHunter писал(а):
Кстати, по идее, поддержку многопоточности несложно организовать. Как я понимаю, автоматическая сборка мусора может вызываться либо в теле процедуры NEW, либо принудительно вызовом процедуры SYSTEM.GC(). Для многопоточности вроде бы достаточно заключить реализации этих процедур в одну и ту же критическую секцию.

Для многопоточного выделения памяти этого в принципе будет достаточно.
А вот для многопоточной сборку мусора нет. Для этого еще нужно изменить поиск указателей на корневые элементы (нужно бегать по стекам разных потоков; искать указатели в регистрах; ввести модель памяти по аналогии с Java, C#, C++).

Автор:  Oleg N. Cher [ Понедельник, 15 Октябрь, 2018 14:58 ]
Заголовок сообщения:  Re: добавить в oo2c синтаксис КП

Да, надёжная многопоточная сборка мусора это не очень банально.
Если кто-то пожелает посодействовать в реализации, милости прошу.

GameHunter писал(а):
Ещё вопрос. Если Ofront+ запускать с параметром -2 либо вообще без параметра, определющего входной язык, то тип CHAR не является предопределённым - есть только SHORTCHAR. Это правильно?
С опциями 1 и 2 (Оберон и Оберон-2) поддержан CHAR.

С опцией -C (Компонентный Паскаль) работает SHORTCHAR (двухбайтовый CHAR пока не реализован). По умолчанию используется опция -C.

Попробуйте транслировать так:

ofront+ -2 Модуль.Mod

CHAR работает, я только что проверил.

Автор:  GameHunter [ Понедельник, 15 Октябрь, 2018 23:10 ]
Заголовок сообщения:  Re: добавить в oo2c синтаксис КП

Спасибо.

Интересно, а в vishap'е сборщик мусора тоже несовместим с многопоточностью?

Автор:  Oleg N. Cher [ Среда, 17 Октябрь, 2018 02:29 ]
Заголовок сообщения:  Re: добавить в oo2c синтаксис КП

Тоже. В vishap'е практически такой же сборщик мусора.

Я бы назвал vishap недоразвитым Ofront+. И заброшенным.

Так что или 64-битность, или многопоточный сборщик (в XDS).

Автор:  kekc_leader [ Воскресенье, 21 Октябрь, 2018 00:49 ]
Заголовок сообщения:  Re: добавить в oo2c синтаксис КП

Можно сборщик мусора написать свой, если хотите. Или поставить какую-нибудь хитрую систему мутексов при его запуске.

Автор:  Oleg N. Cher [ Воскресенье, 21 Октябрь, 2018 02:01 ]
Заголовок сообщения:  Re: добавить в oo2c синтаксис КП

Просто это лишние усилия, требующие профессионального видения "как это сделать правильно".

GameHunter'у же, как я понял, надо всё готовое "из коробки", просто шобы взять и заработало.

Автор:  GameHunter [ Пятница, 04 Январь, 2019 15:47 ]
Заголовок сообщения:  Re: добавить в oo2c синтаксис КП

Вот ещё, кажется, ошибка Ofront+:

Код:
MODULE TestSize;

CONST
  factor = -32;
  c0 = -32*SIZE(LONGINT);
  c1 = factor*SIZE(LONGINT);

END TestSize.

Здесь Ofront+ выдаёт ошибку на 6-й строчке (объявление c1):
line 6 pos 28 err 204 product too large

Автор:  Oleg N. Cher [ Суббота, 05 Январь, 2019 13:41 ]
Заголовок сообщения:  Re: добавить в oo2c синтаксис КП

Исправил. Это наведённая ошибка, связанная с некорректной реализацией деления при делителе MIN(LONGINT), о которой уже писал ComDiv. Кстати, взгляните на правку, может будут какие-то мысли:


Смотрю, Вы используете Ofront+. Какие впечатления?

Автор:  GameHunter [ Понедельник, 07 Январь, 2019 11:14 ]
Заголовок сообщения:  Re: добавить в oo2c синтаксис КП

Не использую по серьёзному - играюсь помаленьку.

Всё познаётся в сравнении. Кажется, на данный момент ofront+ это единственный транслятор в C с вменяемой документацией, позволяющий в конечном итоге генерировать исполняемые файлы для Win64. Так что сравнивать особенно не с чем.

Автор:  Trurl [ Вторник, 22 Январь, 2019 18:40 ]
Заголовок сообщения:  Re: добавить в oo2c синтаксис КП

kekc_leader писал(а):
Можно сборщик мусора написать свой, если хотите. Или поставить какую-нибудь хитрую систему мутексов при его запуске.

Можно же перетащить из ETH Oberon.

Автор:  Oleg N. Cher [ Среда, 23 Январь, 2019 00:55 ]
Заголовок сообщения:  Re: добавить в oo2c синтаксис КП

Trurl писал(а):
Можно же перетащить из ETH Oberon.
Это шутка такая? ETH Oberon однопоточный с рождения. А ещё я хотел бы увидеть процесс перетаскивания такой штуки как сборщик в другое окружение. Это не банально, как минимум.

Автор:  Trurl [ Среда, 23 Январь, 2019 08:09 ]
Заголовок сообщения:  Re: добавить в oo2c синтаксис КП

С рождения однопоточный, а в Windows многопоточный.

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