OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 16:34

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




Начать новую тему Ответить на тему  [ Сообщений: 44 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Re: добавить в oo2c синтаксис КП
СообщениеДобавлено: Понедельник, 08 Октябрь, 2018 17:59 

Зарегистрирован: Пятница, 13 Март, 2015 16:40
Сообщения: 597
GameHunter писал(а):
Здравствуйте.

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: добавить в oo2c синтаксис КП
СообщениеДобавлено: Понедельник, 08 Октябрь, 2018 22:45 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 520
Откуда: Украина, Днепропетровская обл.
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 вроде есть, говорят.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: добавить в oo2c синтаксис КП
СообщениеДобавлено: Вторник, 09 Октябрь, 2018 12:49 

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: добавить в oo2c синтаксис КП
СообщениеДобавлено: Вторник, 09 Октябрь, 2018 18:31 

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

Я поигоался с последней версией 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: есть возможность программе узнать размер динамической памяти, выделенной под различные объекты, и их количество?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: добавить в oo2c синтаксис КП
СообщениеДобавлено: Четверг, 11 Октябрь, 2018 00:03 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 520
Откуда: Украина, Днепропетровская обл.
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, которая будет вести свою статистику?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: добавить в oo2c синтаксис КП
СообщениеДобавлено: Воскресенье, 14 Октябрь, 2018 17:20 

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

По поводу больших констант:
Вот такой модуль, как вы и писали, компилируется и работает хорошо:
Код:
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'овский сборщик мусора ч многопоточностью?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: добавить в oo2c синтаксис КП
СообщениеДобавлено: Понедельник, 15 Октябрь, 2018 03:01 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 520
Откуда: Украина, Днепропетровская обл.
GameHunter писал(а):
TotalLength4 = 2*1024*1024*1024;
Это отголоски 32-битного прошлого Ofront'а+. Исправил.

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: добавить в oo2c синтаксис КП
СообщениеДобавлено: Понедельник, 15 Октябрь, 2018 14:26 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 220
Откуда: Питер
В XDS многопоточность поддержиаается.

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: добавить в oo2c синтаксис КП
СообщениеДобавлено: Понедельник, 15 Октябрь, 2018 14:35 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 987
Откуда: Казань
GameHunter писал(а):
Кстати, по идее, поддержку многопоточности несложно организовать. Как я понимаю, автоматическая сборка мусора может вызываться либо в теле процедуры NEW, либо принудительно вызовом процедуры SYSTEM.GC(). Для многопоточности вроде бы достаточно заключить реализации этих процедур в одну и ту же критическую секцию.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: добавить в oo2c синтаксис КП
СообщениеДобавлено: Понедельник, 15 Октябрь, 2018 14:58 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 520
Откуда: Украина, Днепропетровская обл.
Да, надёжная многопоточная сборка мусора это не очень банально.
Если кто-то пожелает посодействовать в реализации, милости прошу.

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

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

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: добавить в oo2c синтаксис КП
СообщениеДобавлено: Понедельник, 15 Октябрь, 2018 23:10 

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: добавить в oo2c синтаксис КП
СообщениеДобавлено: Среда, 17 Октябрь, 2018 02:29 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 520
Откуда: Украина, Днепропетровская обл.
Тоже. В vishap'е практически такой же сборщик мусора.

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: добавить в oo2c синтаксис КП
СообщениеДобавлено: Воскресенье, 21 Октябрь, 2018 00:49 
Аватара пользователя

Зарегистрирован: Среда, 22 Апрель, 2015 23:51
Сообщения: 248
Откуда: г. Рига, Латвийская ССР
Можно сборщик мусора написать свой, если хотите. Или поставить какую-нибудь хитрую систему мутексов при его запуске.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: добавить в oo2c синтаксис КП
СообщениеДобавлено: Воскресенье, 21 Октябрь, 2018 02:01 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 520
Откуда: Украина, Днепропетровская обл.
Просто это лишние усилия, требующие профессионального видения "как это сделать правильно".

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: добавить в oo2c синтаксис КП
СообщениеДобавлено: Пятница, 04 Январь, 2019 15:47 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 220
Откуда: Питер
Вот ещё, кажется, ошибка 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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: добавить в oo2c синтаксис КП
СообщениеДобавлено: Суббота, 05 Январь, 2019 13:41 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 520
Откуда: Украина, Днепропетровская обл.
Исправил. Это наведённая ошибка, связанная с некорректной реализацией деления при делителе MIN(LONGINT), о которой уже писал ComDiv. Кстати, взгляните на правку, может будут какие-то мысли:


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: добавить в oo2c синтаксис КП
СообщениеДобавлено: Понедельник, 07 Январь, 2019 11:14 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 220
Откуда: Питер
Не использую по серьёзному - играюсь помаленьку.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: добавить в oo2c синтаксис КП
СообщениеДобавлено: Вторник, 22 Январь, 2019 18:40 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
kekc_leader писал(а):
Можно сборщик мусора написать свой, если хотите. Или поставить какую-нибудь хитрую систему мутексов при его запуске.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: добавить в oo2c синтаксис КП
СообщениеДобавлено: Среда, 23 Январь, 2019 00:55 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 520
Откуда: Украина, Днепропетровская обл.
Trurl писал(а):
Можно же перетащить из ETH Oberon.
Это шутка такая? ETH Oberon однопоточный с рождения. А ещё я хотел бы увидеть процесс перетаскивания такой штуки как сборщик в другое окружение. Это не банально, как минимум.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: добавить в oo2c синтаксис КП
СообщениеДобавлено: Среда, 23 Январь, 2019 08:09 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
С рождения однопоточный, а в Windows многопоточный.


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

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


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

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


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

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