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'е такое же ограничение.) Когда я работал над сборщиком мусора, то постоянно имел в виду кроссплатформенность и совместимость исходника как с 32-битными платформами, так и с 64-битными. На 32-битной платформе выделить память таким огромным куском просто нельзя. Ну может можно 4 Гб, но в Обероне нет беззнаковых типов. Поэтому даже адресный со знаком.Вопрос 1: нельзя ли это ограничение убрать? (Ну, да это несущественно, ведь можно использовать ARRAY OF POINTER TO ARRAY OF POINTER TO ARRAY OF SHORTCHAR) Портируя 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 *) Меняете, соответственно, на IndexSize := 8 и MaxIndex := MAX(LONGINT).MaxIndex := MAX(INTEGER) И пересобираете 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/ |