OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 17 Июнь, 2025 22:59

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




Начать новую тему Ответить на тему  [ Сообщений: 332 ]  На страницу Пред.  1, 2, 3, 4, 5, 6 ... 17  След.
Автор Сообщение
 Заголовок сообщения: Re: NanoOberon/OberonJIT
СообщениеДобавлено: Понедельник, 08 Июль, 2024 15:45 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1556
Борис Рюмшин писал(а):
arisu писал(а):
кстати. а чем бы компилятор потестировать? неужели опять самому всё писать?

Компилированием другого компилятора... если, конечно, язык совместим вообще. :mrgreen:
гыг. но, во-первых, не совместим. а во-вторых — не готов же ещё. ;-)

мне б классических тестов, которые всем лень делать: простое выражение. сложное выражение. матюкливое выражение. и так далее. вот эту часть написания компилятора я не люблю больше всего. но если я сейчас начну делать генератор тестов… то у меня будет два бесконечных проекта. ;-)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: NanoOberon/OberonJIT
СообщениеДобавлено: Понедельник, 08 Июль, 2024 15:55 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1556
ну, и чтобы два раза не вставать: прибил гвоздями все встроеные процедуры как кейворды. ну, те, которые `MIN()`, `DEC()` и прочие.

в принципе, даже в CP2 они парзятся специальными обработчиками, так что нет никакой причины не сделать их отдельными AST-нодами. ну, кроме потенциальной дурацкой идеи их переопределить — но эта идея определённо дурацкая. ни разу не понадобилось, и только всё запутает.

вообще, может в принципе запретить идентификаторы ВСЕМ_КАПСОМ? единственное, для чего такое может понадобиться — для констант, но и их лучше писать нормально, ящитаю. подумаю.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: NanoOberon/OberonJIT
СообщениеДобавлено: Вторник, 09 Июль, 2024 04:17 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1556
раз наш оберон всё равно уже испорчен ядовитым дыханием мэйнстрима, то можно поддержать слайсинг строк и массивов. правда, в отличие от гошечки — это будет операция копирования (за исключением open array byref parameters, где можно передавать слайс массива просто так — Ультра Паскаль позволяет, например).

но. хочется для слайсов удобный синтаксис, а удобным его сделать не очень выходит.

1. [a:b] (или [a..b], без разницы). здесь очевидно, что слайс должен включать элемент `b`. в итоге невозможно сделать пустой слайс.
2. (a:b) / (a..b). перекрытие вызова функции и так не лучший вариант, вдобавок `a` и `b` в слайс теперь входить не должны.
3. [a:b) / [a..b)— да, математически самый правильный вариант. но я такое писать отказываюсь, а мой редактор отказывается в этом матчить скобочки (и правильно).

в любом случае надо запоминать исключение: или что `[]` не включает последний элемент, или что надо ставить в конце особую скобку.

наверное, всё-таки сделаю `[a:b]`. тогда можно будет заявить, что это не математическая нотация диапазона, а специальная фигня с двоеточием, поэтому идите в куда-нибудь с неправильной скобкой.

и, кстати, добавить ещё пару сигилов, чтобы нормальный оберонщик точно ушёл, плюясь: `[a:#b]` — здесь `b` — длина. и `[a:$]` — а здесь `$` обозначает «LEN(arr)». собственно, доллар — просто алиас, а `#` — именно сигил.

поскольку строки у нас отдельный тип, то конструкция `var$` в языке больше не нужна: массив чаров автоматически преобразуется в строку, если надо. внутре наш `STRING` может и нули содержать, но массив будем традиционно — отсекать по первому нулю.

кстати, для шестнадцатиричных чисел можно использовать форму `$abcd`. я так привык, чо. и это ни с чем не конфликтует. а для char-констант `#<num>`. ну да, покусаные дельфи отаке. а кому сейчас легко?

во всех этих нововведениях я пытаюсь исходить из примерно той же логики, которую использовали омики для Компонентного Паскаля: «будем пуристами, но иногда позволим себе практическое излишество.»

динамические refcounted строки — это таки излишество, но офигеть удобное. да, это можно проэмулить обычными обероновскими записями, и пусть GC собирает лишнее. возможно, я потом так и сделаю. но пока мне кажется, что практическое удобство перевешивает усложнение компилятора и некоторую неоднородность языка.

слайсы — ну, понятно. чисто синтаксический сахар. самое спорное, и скорее дань моим привычкам.

запрет передавать массивы по значению. как по мне — это самый большой источник ошибок и тормозов. единственное полезное применение — это когда строки представлены массивами, чтобы процедура могла переданую строку менять. так у нас для этого теперь есть специальный тип. практически во всех остальных случаях (за очень-очень редким исключением) — массивы надо передавать как IN/VAR/OUT. вот я это и энфорсну.

запрет передавать записи по значению: то же самое, что и с массивами. в смысле — а зачем? всё равно внутри это выглядит как передача адреса копии — ну так и делай где надо копию руками.

присваивание записей. вот тут я пока не решил. это удобно, конечно, но проблемы обрезания в полный рост. подумаю ещё. скорее всего разрешу для записей вообще без экспорта полей (в пределах модуля), и для записей, у которых все поля r/w. потому что один фиг это то, что программер может руками написать, так что пусть автоматизируется.

кстати, из-за ограничений на присваивание и невозможна общая передача записей по значению. и массивов. потому мало ли какая в массиве запись, например. соответственно, если разрешить, то получится, что код то компилится, то не компилится. фу. (да, с присваиванием то же самое, но пусть будет.)

p.s.: присваивание записей через `a := b` мне всё-таки не нравится. скорее всего, это таки будет выглядеть как `COPY(b, a)`. к сожалению, в оберонах принята нотация `source, dest`. отмечу, что я бы предпочёл `dest, source`, но тут уже поздно менять.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: NanoOberon/OberonJIT
СообщениеДобавлено: Вторник, 09 Июль, 2024 04:29 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1556
кстати. поскольку у нас под капотом всё-таки житер, то коммандеры можно просто компилить, исполнять и выкидывать — а не пилить для них отдельный интерпретатор. единственное препятствие — компилятор сейчас при любой ошибке тупо абортится. но это поправимо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: NanoOberon/OberonJIT
СообщениеДобавлено: Вторник, 09 Июль, 2024 05:59 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1556
сделал карты указателей и строк для записей. теперь локальные переменные-записи нормально декрефнутся, если там есть строки.

массивы придётся обрабатывать отдельным built-in'ом, а то код лопнет, гыг.

всё ещё остаюсь сторонником явного создания цепочек с картами стековых указателей для GC. это стоит несколько асм-команд на входе и выходе, зато решает кучу проблем (включая обработку трапов, которой нужен stack unwinding для строк). и сборщик будет полностью precise, даже для колбэков.

сначала сделаю GC на крестах, видимо, чтобы не гадать: это в GC у меня баг, или в компилере/кодогене? ну, и будет пока stop-the-world, а не инкрементальный. потом переделаю (возможно, опцией). отчасти ещё и потому, что я не решил, как генерировать type info — пока просто использую указатели на крестовые объекты. потом надо будет писать вместо этого нормальную раскладку.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: NanoOberon/OberonJIT
СообщениеДобавлено: Среда, 10 Июль, 2024 01:42 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 485
Откуда: KZ
https://github.com/Spivoxity/obc-3/tree/master/test


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: NanoOberon/OberonJIT
СообщениеДобавлено: Среда, 10 Июль, 2024 04:38 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1556
спасибо! постараюсь что-нибудь оттуда украсть. ;-)

и чтобы два раза не. пришлось таки добавить в Nanojit инструкции `adivi` и `amodi`. «асимметричное» (то бишь, обероновское ;-) деление. правда, только в x86 — в остальные лень. добавлю когда рак на горе свистнет.

алсо, писать асм-код задом наперёд всё ещё удивительно.

p.s.: а что, CDQ реально настолько медленная, что mov/sar быстрее? по какой-то причине Nanojit делает расширение знака именно через mov/sar.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: NanoOberon/OberonJIT
СообщениеДобавлено: Воскресенье, 14 Июль, 2024 15:42 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1556
начинаю думать в странные стороны.

ну, во-первых, ударился головой обратно и вспомнил, что type tag в записях не нужны, а нужно fat pointers (и fake fat pointers для передачи записей как VAR).

во-вторых, волевым решением не буду добавлять SHORTINT: нет в нём никакого смысла. x86 всё равно быстрее всего работает с целыми регистрами, так что шорты в выражениях надо в любом случае удлинять до брюк. записи тоже выравниваются по четыре байта, так что никакой там экономии.

вообще, SHORTINT — это пережиток тёмного прошлого, на данном этапе общественного развития бесполезный, и даже вредный.

добавлю в SYSTEM, для untagged records — и хватит.

ещё нужна встроеная функция, которой мне и в CP/UP не хватало: «сделай мне из этого инта SHORTREAL/REAL». не, понятно, что `SHORT(var + 0.0)` это самое и делает, но выглядит оно отвратительно. пока что задействовал касты: `CAST(SHORTREAL)(var)`. но тут как-то… каст — это, в принципе, больше про repaint, а не про type conversion. как минимум у меня в голове так. а делать конструкторы типа `SHORTREAL(var)` не хочу: мне это не нравится. вот не нравится — и всё тут. сразу появляется масса вопросов. например: «а почему я не могу сконструировать запись через `MyRec(val0, val1, …)`? а массив?» выглядит это именно как вызов функции-конструктора, причём прилеплено боком и только для нескольких встроеных типов. некрасиво. с явным кастом хотя бы видно, что это стрёмный хак.

кстати, про инициализацию массивов. больной вопрос, однако. хоть бери и делай классическое `arr := […]`. ну, хотя бы для скалярных типов (строка, кстати, технически тоже теперь скалярный тип, гыг).

алсо, надо делать генерацию нормальных тайпдефов для GC. и ещё, похоже, сделать сериализатор AST. он нужен для инлайнов (есть, например, детектор pure-функций, их вполне можно автоматически инлайнить). а с таким сериализатором и juice можно повторить, хихи. а там таки переписать компилятор уже на этом обероне, и грузить сериализованый AST.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: NanoOberon/OberonJIT
СообщениеДобавлено: Вторник, 16 Июль, 2024 02:57 
Аватара пользователя

Зарегистрирован: Воскресенье, 09 Декабрь, 2018 15:14
Сообщения: 144
Откуда: Equestria
arisu писал(а):
CAST(SHORTREAL)(var)
что-то очень напоминает... %)
Код:
static_cast<float>(var)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: NanoOberon/OberonJIT
СообщениеДобавлено: Вторник, 16 Июль, 2024 07:59 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1556
на самом деле — дишечку, почти дословно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: NanoOberon/OberonJIT
СообщениеДобавлено: Среда, 17 Июль, 2024 22:16 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1556
чудесные блэкауты чудесны. проект на льду, когда возобновится — неизвестно. alas.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: NanoOberon/OberonJIT
СообщениеДобавлено: Четверг, 18 Июль, 2024 02:08 

Зарегистрирован: Пятница, 13 Март, 2015 16:40
Сообщения: 619
Комп - хрен бы с ним, самое страшное в жару - холдильник, который не холодильник \-8< и хавчик протухающий...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: NanoOberon/OberonJIT
СообщениеДобавлено: Четверг, 18 Июль, 2024 08:07 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1556
жрать нечего, так что без разницы. а вот новую технику, если что, я не добуду нигде. плоть не имеет значения, лишь бы Великая Машина была цела и довольна.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: NanoOberon/OberonJIT
СообщениеДобавлено: Суббота, 20 Июль, 2024 16:30 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1556
не думать, к сожалению, не получается, хотя я очень стараюсь.

в общем. я знаю, что всех устраивает, один я не в ногу. а меня не устраивает. не устраивает, что из процедур прямой доступ к глобальным переменным. так быть не должно. я пытался решить похожую проблему с доступом к outer scope в Ультра Паскале, но решение мне там не нравилось. и наконец я придумал. для доступа к глобалу надо писать: `VAR v: GLOBAL;` да, типа-импорт. а к outer scope — `VAR v: UPSCOPE;` (или `VAR v: UPSCOPE(level);`).

и да, я созрел. можно переименовать тему в «Oberon/Ur»? очевидно, что проект перерос стадию «тестовый компилятор для житера», и получился очередной полноценный форк оберона (по заветам Вирта). соответственно, теперь он в Семье, и тоже будет «Ur». (не спрашивайте, «Ur» не значит ничего.)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Суббота, 20 Июль, 2024 17:54 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1556
спасибо за смену названия!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Суббота, 20 Июль, 2024 20:33 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1556
не смотря на (скипнуто три килобайта мата) блэкауты, я чуть-чуть двигаюсь.
Код:
MODULE n0test_rec_mth_ptr_01;

IMPORT L := Log;

TYPE
  BaseRec = POINTER TO EXTENSIBLE RECORD
    a-: INTEGER;
  END;

  SRec = POINTER TO RECORD (BaseRec)
    s: STRING;
  END;


PROCEDURE (self: BaseRec) Mth0*, NEW;
BEGIN
  L.String("Mth0: a="):Int(self.a):Ln;
  self.a := 666;
END Mth0;


PROCEDURE StrTest0 (s: STRING);
BEGIN
  s := s ~ "Zoo!";
  L.String("STEST: s="):String(s):Ln;
END StrTest0;


VAR
  r: SRec;
BEGIN
  ASSERT(r = NIL);
  NEW(r);
  ASSERT(r # NIL);
  r.a := 69;
  L.String("Main(0): r.a="):Int(r.a):Ln;
  IF r IS BaseRec THEN L.String("YAY!"); ELSE L.String("OOPS :-("); END;
  L.Ln;
  r.s := "Boo!";
  r.Mth0;
  L.String("Main(1): r.a="):Int(r.a):Ln;
  StrTest0("Doo!");
CLOSE
  L.String("EXIT: r.s="):String(r.s):Ln;
  DISPOSE(r);
END n0test_rec_mth_ptr_01.

GC пока нет, поэтому `DISPOSE()`. проверка перекрытий методов не допилена, и VMT ещё не создаётся (хотя индексы для неё считаются).

да, строки рефкаунтятся, мемликов ноль. надеюсь, это не баг. ;-) рефкаунт довольно дешёвый (заинлайнен). можно лучше: инкрефать только если строке что-то присвоили. пока не сделал — все оптимизации потом. сейчас тупо и дёшево, лишь бы заработало. вот когда смогу компилер переписать на O/Ur — тогда и…

p.s.: может, и Nanojit портирую. и обучу делать код в нужное место. чтобы можно было standalone binary собрать, из которого взлетать потом. не знаю пока, но в принципе — возможно. сам Nanojit написан без особых извратов, можно будет чуть ли не механически транслировать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Суббота, 20 Июль, 2024 21:56 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1556
и да: у нас честный машинный код, а не всякое там… ;-)
Код:
PARSING `n0test_rec_mth_ptr_01`...
RESOLVING `n0test_rec_mth_ptr_01`...
  ...`n0test_rec_mth_ptr_01`...
resolving `n0test_rec_mth_ptr_01:Mth0`...
finished resolving `n0test_rec_mth_ptr_01:Mth0`.
resolving `n0test_rec_mth_ptr_01:(OPEN)`...
resolving `n0test_rec_mth_ptr_01:StrTest0`...
  converting `n0test_rec_mth_ptr_01:StrTest0` to CDECL (argument type)
finished resolving `n0test_rec_mth_ptr_01:StrTest0`.
finished resolving `n0test_rec_mth_ptr_01:(OPEN)`.
resolving `n0test_rec_mth_ptr_01:(CLOSE)`...
finished resolving `n0test_rec_mth_ptr_01:(CLOSE)`.
building code for `Mth0` (n0test_rec_mth_ptr_01:Mth0) [FASTCALL].
=== Aggregated assembly output: BEGIN
===
  0x4054fb4                                    [prologue]
  0x4054fb4  55                                push ebp
  0x4054fb5  8b ec                             mov ebp,esp
  0x4054fb7                                    [frag entry]
  0x4054fb7  83 ec 18                          sub esp,24
  0x4054fba  89 5d fc                          mov [ebp-4],ebx  <= spill parami1
  0x4054fbd  89 75 f8                          mov [ebp-8],esi  <= spill parami2
  0x4054fc0  89 7d f4                          mov [ebp-12],edi  <= spill parami3
  0x4054fc3  89 4d f0                          mov [ebp-16],ecx  <= spill parami4
  0x4054fc6  b9 44 f9 d2 04                    mov ecx,80935236
  0x4054fcb  e8 a0 51 07 04                    call Log:String
  0x4054fd0  8b 45 f0                          mov eax,[ebp-16]  <= restore parami4
  0x4054fd3  8b 08                             mov ecx,[eax+0]
  0x4054fd5  e8 76 51 07 04                    call Log:Int
  0x4054fda  e8 c1 51 07 04                    call Log:Ln
  0x4054fdf  8b 4d f0                          mov ecx,[ebp-16]  <= restore parami4
  0x4054fe2  c7 01 9a 02 00 00                 mov [ecx+0],666
  0x4054fe8  8b e5                             mov esp,ebp
  0x4054fea  5d                                pop ebp
  0x4054feb  c3                                ret
===
=== Aggregated assembly output: END
================================================================================

building code for `StrTest0` (n0test_rec_mth_ptr_01:StrTest0) [CDECL].
=== Aggregated assembly output: BEGIN
===
  0x4054ef5                                    [prologue]
  0x4054ef5  55                                push ebp
  0x4054ef6  8b ec                             mov ebp,esp
  0x4054ef8                                    [frag entry]
  0x4054ef8  83 ec 18                          sub esp,24
  0x4054efb  89 5d fc                          mov [ebp-4],ebx  <= spill parami1
  0x4054efe  89 75 f8                          mov [ebp-8],esi  <= spill parami2
  0x4054f01  89 7d f4                          mov [ebp-12],edi  <= spill parami3
  0x4054f04  8b 4d 08                          mov ecx,[ebp+8]
  0x4054f07  85 c9                             test ecx,ecx
  0x4054f09  74 0e                             je    0x4054f19
  0x4054f0b  8b 01                             mov eax,[ecx+0]
  0x4054f0d  3d 65 fd ff ff                    cmp eax,-667
  0x4054f12  74 05                             je    0x4054f19
  0x4054f14  8d 40 01                          lea eax,[eax+1]
  0x4054f17  89 01                             mov [ecx+0],eax
  0x4054f19                                    [label1]
  0x4054f19  8d 55 08                          lea edx,[ebp+8]
  0x4054f1c  33 c9                             xor ecx,ecx
  0x4054f1e  e8 dd 4b 07 04                    call (DSTR-CAT)
  0x4054f23  8b c8                             mov ecx,eax
  0x4054f25  8d 55 f0                          lea edx,[ebp-16]  <= restore allocp1
  0x4054f28  c7 45 f0 60 f9 d2 04              mov [ebp-16],80935264
  0x4054f2f  e8 cc 4b 07 04                    call (DSTR-CAT)
  0x4054f34  8d 4d 08                          lea ecx,[ebp+8]  <= restore pparami1
  0x4054f37  89 45 f0                          mov [ebp-16],eax
  0x4054f3a  8d 55 f0                          lea edx,[ebp-16]
  0x4054f3d  e8 0e 49 07 04                    call (DSTR-ASS)
  0x4054f42  8d 4d f0                          lea ecx,[ebp-16]  <= restore allocp2
  ------------------------------ # freeing temp string var
  ------------------------------ # decref(dtor) string var
  0x4054f45  8b 55 f0                          mov edx,[ebp-16]
  0x4054f48  85 d2                             test edx,edx
  0x4054f4a  74 17                             je    0x4054f63
  0x4054f4c  8b 02                             mov eax,[edx+0]
  0x4054f4e  3d 65 fd ff ff                    cmp eax,-667
  0x4054f53  74 0e                             je    0x4054f63
  0x4054f55  8d 40 ff                          lea eax,[eax-1]
  0x4054f58  89 02                             mov [edx+0],eax
  0x4054f5a  85 c0                             test eax,eax
  0x4054f5c  75 05                             jne   0x4054f63
  0x4054f5e  e8 bd 45 07 04                    call (DSTR-DEALLOC)
  0x4054f63                                    [label2]
  0x4054f63  b9 78 f9 d2 04                    mov ecx,80935288
  0x4054f68  e8 03 52 07 04                    call Log:String
  0x4054f6d  8d 45 08                          lea eax,[ebp+8]
  0x4054f70  8b 08                             mov ecx,[eax+0]
  0x4054f72  e8 f9 51 07 04                    call Log:String
  0x4054f77  e8 24 52 07 04                    call Log:Ln
  0x4054f7c  8d 4d 08                          lea ecx,[ebp+8]
  ------------------------------ # decref(dtor) string var
  0x4054f7f  8b 11                             mov edx,[ecx+0]
  0x4054f81  85 d2                             test edx,edx
  0x4054f83  74 17                             je    0x4054f9c
  0x4054f85  8b 02                             mov eax,[edx+0]
  0x4054f87  3d 65 fd ff ff                    cmp eax,-667
  0x4054f8c  74 0e                             je    0x4054f9c
  0x4054f8e  8d 40 ff                          lea eax,[eax-1]
  0x4054f91  89 02                             mov [edx+0],eax
  0x4054f93  85 c0                             test eax,eax
  0x4054f95  75 05                             jne   0x4054f9c
  0x4054f97  e8 84 45 07 04                    call (DSTR-DEALLOC)
  0x4054f9c                                    [label3]
  0x4054f9c  8b e5                             mov esp,ebp
  0x4054f9e  5d                                pop ebp
  0x4054f9f  c3                                ret
===
=== Aggregated assembly output: END
================================================================================

building code for `(OPEN)` (n0test_rec_mth_ptr_01:(OPEN)) [FASTCALL].
=== Aggregated assembly output: BEGIN
===
  0x4054dc7                                    [prologue]
  0x4054dc7  55                                push ebp
  0x4054dc8  8b ec                             mov ebp,esp
  0x4054dca                                    [frag entry]
  0x4054dca  83 ec 18                          sub esp,24
  0x4054dcd  89 5d fc                          mov [ebp-4],ebx  <= spill parami1
  0x4054dd0  89 75 f8                          mov [ebp-8],esi  <= spill parami2
  0x4054dd3  89 7d f4                          mov [ebp-12],edi  <= spill parami3
  0x4054dd6  8b 05 40 f9 d2 04                 mov eax,[0x4d2f940]
  0x4054ddc  85 c0                             test eax,eax
  0x4054dde  74 20                             je    0x4054e00
  ------------------------------ # allocating no-dtor temp string var
  0x4054de0  c7 45 f0 94 f9 d2 04              mov [ebp-16],80935316
  0x4054de7  c7 04 24 a4 f9 d2 04              mov [esp+0],80935332
  0x4054dee  ba 22 00 00 00                    mov edx,34
  0x4054df3  b9 10 59 d2 04                    mov ecx,80894224
  0x4054df8  e8 83 48 07 04                    call (ASSERT-FAILURE)
  0x4054dfd  83 ec 04                          sub esp,4
  0x4054e00                                    [label1]
  0x4054e00  b9 d8 8a d2 04                    mov ecx,80906968
  0x4054e05  e8 b6 48 07 04                    call (NEW-REC)
  0x4054e0a  89 05 40 f9 d2 04                 mov [0+80935232],eax
  0x4054e10  8b 05 40 f9 d2 04                 mov eax,[0x4d2f940]
  0x4054e16  85 c0                             test eax,eax
  0x4054e18  75 20                             jne   0x4054e3a
  ------------------------------ # allocating no-dtor temp string var
  0x4054e1a  c7 45 f0 b0 f9 d2 04              mov [ebp-16],80935344
  0x4054e21  c7 04 24 c0 f9 d2 04              mov [esp+0],80935360
  0x4054e28  ba 24 00 00 00                    mov edx,36
  0x4054e2d  b9 10 59 d2 04                    mov ecx,80894224
  0x4054e32  e8 49 48 07 04                    call (ASSERT-FAILURE)
  0x4054e37  83 ec 04                          sub esp,4
  0x4054e3a                                    [label2]
  0x4054e3a  8b 05 40 f9 d2 04                 mov eax,[0x4d2f940]
  0x4054e40  c7 00 45 00 00 00                 mov [eax+0],69
  0x4054e46  b9 cc f9 d2 04                    mov ecx,80935372
  0x4054e4b  e8 20 53 07 04                    call Log:String
  0x4054e50  8b 05 40 f9 d2 04                 mov eax,[0x4d2f940]
  0x4054e56  8b 08                             mov ecx,[eax+0]
  0x4054e58  e8 f3 52 07 04                    call Log:Int
  0x4054e5d  e8 3e 53 07 04                    call Log:Ln
  0x4054e62  8b 0d 40 f9 d2 04                 mov ecx,[0x4d2f940]
  0x4054e68  ba f8 89 d2 04                    mov edx,80906744
  0x4054e6d  e8 6e 4c 07 04                    call (IS-A-PTR)
  0x4054e72  85 c0                             test eax,eax
  0x4054e74  74 0c                             je    0x4054e82
  0x4054e76  b9 ec f9 d2 04                    mov ecx,80935404
  0x4054e7b  e8 f0 52 07 04                    call Log:String
  0x4054e80  eb 0a                             jmp 0x4054e8c
  0x4054e82                                    [label3]
  0x4054e82  b9 04 fa d2 04                    mov ecx,80935428
  0x4054e87  e8 e4 52 07 04                    call Log:String
  0x4054e8c                                    [label4]
  0x4054e8c  e8 0f 53 07 04                    call Log:Ln
  0x4054e91  8d 55 f0                          lea edx,[ebp-16]  <= restore allocp2
  0x4054e94  8b 0d 40 f9 d2 04                 mov ecx,[0x4d2f940]
  0x4054e9a  8d 49 04                          lea ecx,[ecx+4]
  ------------------------------ # allocating no-dtor temp string var
  0x4054e9d  c7 45 f0 20 fa d2 04              mov [ebp-16],80935456
  0x4054ea4  e8 a7 49 07 04                    call (DSTR-ASS)
  0x4054ea9  8b 0d 40 f9 d2 04                 mov ecx,[0x4d2f940]
  0x4054eaf  e8 00 01 00 00                    call n0test_rec_mth_ptr_01:Mth0
  0x4054eb4  b9 38 fa d2 04                    mov ecx,80935480
  0x4054eb9  e8 b2 52 07 04                    call Log:String
  0x4054ebe  8b 05 40 f9 d2 04                 mov eax,[0x4d2f940]
  0x4054ec4  8b 08                             mov ecx,[eax+0]
  0x4054ec6  e8 85 52 07 04                    call Log:Int
  0x4054ecb  e8 d0 52 07 04                    call Log:Ln
  0x4054ed0  c7 04 24 58 fa d2 04              mov [esp+0],80935512
  0x4054ed7  e8 19 00 00 00                    call n0test_rec_mth_ptr_01:StrTest0
  0x4054edc  8b e5                             mov esp,ebp
  0x4054ede  5d                                pop ebp
  0x4054edf  c3                                ret
===
=== Aggregated assembly output: END
================================================================================

building code for `(CLOSE)` (n0test_rec_mth_ptr_01:(CLOSE)) [FASTCALL].
=== Aggregated assembly output: BEGIN
===
  0x4054d3e                                    [prologue]
  0x4054d3e  55                                push ebp
  0x4054d3f  8b ec                             mov ebp,esp
  0x4054d41                                    [frag entry]
  0x4054d41  83 ec 18                          sub esp,24
  0x4054d44  89 5d fc                          mov [ebp-4],ebx  <= spill parami1
  0x4054d47  89 75 f8                          mov [ebp-8],esi  <= spill parami2
  0x4054d4a  89 7d f4                          mov [ebp-12],edi  <= spill parami3
  0x4054d4d  b9 70 fa d2 04                    mov ecx,80935536
  0x4054d52  e8 19 54 07 04                    call Log:String
  0x4054d57  8b 0d 40 f9 d2 04                 mov ecx,[0x4d2f940]
  0x4054d5d  b8 04 00 00 00                    mov eax,4
  0x4054d62  8b 0c 01                          mov ecx,[ecx+eax*1+0]
  0x4054d65  e8 06 54 07 04                    call Log:String
  0x4054d6a  e8 31 54 07 04                    call Log:Ln
  0x4054d6f  8b 0d 40 f9 d2 04                 mov ecx,[0x4d2f940]
  0x4054d75  8d 49 04                          lea ecx,[ecx+4]
  0x4054d78  33 d2                             xor edx,edx
  0x4054d7a  e8 d1 4a 07 04                    call (DSTR-ASS)
  0x4054d7f  8b 0d 40 f9 d2 04                 mov ecx,[0x4d2f940]
  0x4054d85  8d 49 04                          lea ecx,[ecx+4]
  ------------------------------ # allocating no-dtor temp string var
  0x4054d88  8d 55 f0                          lea edx,[ebp-16]  <= restore allocp1
  0x4054d8b  c7 45 f0 8c fa d2 04              mov [ebp-16],80935564
  0x4054d92  e8 b9 4a 07 04                    call (DSTR-ASS)
  0x4054d97  8b 0d 40 f9 d2 04                 mov ecx,[0x4d2f940]
  0x4054d9d  e8 1e 48 07 04                    call (DISPOSE-REC)
  0x4054da2  c7 05 40 f9 d2 04 00 00 00 00     mov [(null)+80935232],0
  0x4054dac  8b e5                             mov esp,ebp
  0x4054dae  5d                                pop ebp
  0x4054daf  c3                                ret
===
=== Aggregated assembly output: END
================================================================================


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Понедельник, 22 Июль, 2024 10:56 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1556
бесконечные
Код:
  0x4054fba  89 5d fc                          mov [ebp-4],ebx  <= spill parami1
  0x4054fbd  89 75 f8                          mov [ebp-8],esi  <= spill parami2
  0x4054fc0  89 7d f4                          mov [ebp-12],edi  <= spill parami3

это артефакт кодогена для «callee-saved registers». однако жёстко соблюдать x86 ABI смысла никакого нет: оно надо только для колбэков, а всё остальное перетопчется. потому добавил в Nanojit ABI без этих сохранений. код получился покрасивей:
Код:
building code for `Mth0` () [FASTCALL_NO_SAVE].
=== Aggregated assembly output: BEGIN
===
  0x4054fbd                                    [prologue]
  0x4054fbd  55                                push ebp
  0x4054fbe  8b ec                             mov ebp,esp
  0x4054fc0                                    [frag entry]
  0x4054fc0  83 ec 08                          sub esp,8
  0x4054fc3  89 4d fc                          mov [ebp-4],ecx  <= spill parami1
  ------------------------------ # n0test_rec_mth_ptr_01:Mth0
  0x4054fc6  b9 2c fd d2 04                    mov ecx,80936236
  0x4054fcb  e8 70 5f 07 04                    call Log:String
  0x4054fd0  8b 5d fc                          mov ebx,[ebp-4]  <= restore parami1
  0x4054fd3  8b 0b                             mov ecx,[ebx+0]
  0x4054fd5  e8 46 5f 07 04                    call Log:Int
  0x4054fda  e8 91 5f 07 04                    call Log:Ln
  0x4054fdf  8b 4d fc                          mov ecx,[ebp-4]  <= restore parami1
  0x4054fe2  c7 01 9a 02 00 00                 mov [ecx+0],666
  0x4054fe8  8b e5                             mov esp,ebp
  0x4054fea  5d                                pop ebp
  0x4054feb  c3                                ret
===
=== Aggregated assembly output: END
================================================================================

building code for `StrTest0` () [CDECL_NO_SAVE].
=== Aggregated assembly output: BEGIN
===
  0x4054f03                                    [prologue]
  0x4054f03  55                                push ebp
  0x4054f04  8b ec                             mov ebp,esp
  0x4054f06                                    [frag entry]
  0x4054f06  83 ec 08                          sub esp,8
  0x4054f09  8b 75 08                          mov esi,[ebp+8]
  ------------------------------ # n0test_rec_mth_ptr_01:StrTest0
  ------------------------------ # incref(ctor) string var
  0x4054f0c  85 f6                             test esi,esi
  0x4054f0e  74 0f                             je    0x4054f1f
  0x4054f10  8b 1e                             mov ebx,[esi+0]
  0x4054f12  81 fb 65 fd ff ff                 cmp ebx,-667
  0x4054f18  74 05                             je    0x4054f1f
  0x4054f1a  8d 5b 01                          lea ebx,[ebx+1]
  0x4054f1d  89 1e                             mov [esi+0],ebx
  0x4054f1f                                    [label1]
  0x4054f1f  8d 55 08                          lea edx,[ebp+8]
  0x4054f22  33 c9                             xor ecx,ecx
  0x4054f24  e8 57 59 07 04                    call (DSTR-CAT)
  0x4054f29  8b c8                             mov ecx,eax
  ------------------------------ # allocating no-dtor temp string var
  0x4054f2b  8d 55 fc                          lea edx,[ebp-4]  <= restore allocp1
  0x4054f2e  c7 45 fc 48 fd d2 04              mov [ebp-4],80936264
  0x4054f35  e8 46 59 07 04                    call (DSTR-CAT)
  0x4054f3a  8d 4d 08                          lea ecx,[ebp+8]  <= restore pparami1
  0x4054f3d  89 45 fc                          mov [ebp-4],eax
  0x4054f40  8d 55 fc                          lea edx,[ebp-4]
  0x4054f43  e8 d8 56 07 04                    call (DSTR-ASS)
  0x4054f48  8d 4d fc                          lea ecx,[ebp-4]  <= restore allocp2
  ------------------------------ # freeing temp string var
  ------------------------------ # decref(dtor) string var
  0x4054f4b  8b 75 fc                          mov esi,[ebp-4]
  0x4054f4e  85 f6                             test esi,esi
  0x4054f50  74 18                             je    0x4054f6a
  0x4054f52  8b 1e                             mov ebx,[esi+0]
  0x4054f54  81 fb 65 fd ff ff                 cmp ebx,-667
  0x4054f5a  74 0e                             je    0x4054f6a
  0x4054f5c  8d 5b ff                          lea ebx,[ebx-1]
  0x4054f5f  89 1e                             mov [esi+0],ebx
  0x4054f61  85 db                             test ebx,ebx
  0x4054f63  75 05                             jne   0x4054f6a
  0x4054f65  e8 16 54 07 04                    call (DSTR-DEALLOC)
  0x4054f6a                                    [label2]
  0x4054f6a  b9 60 fd d2 04                    mov ecx,80936288
  0x4054f6f  e8 cc 5f 07 04                    call Log:String
  0x4054f74  8d 5d 08                          lea ebx,[ebp+8]
  0x4054f77  8b 0b                             mov ecx,[ebx+0]
  0x4054f79  e8 c2 5f 07 04                    call Log:String
  0x4054f7e  e8 ed 5f 07 04                    call Log:Ln
  0x4054f83  8d 4d 08                          lea ecx,[ebp+8]
  ------------------------------ # decref(dtor) string var
  0x4054f86  8b 31                             mov esi,[ecx+0]
  0x4054f88  85 f6                             test esi,esi
  0x4054f8a  74 18                             je    0x4054fa4
  0x4054f8c  8b 1e                             mov ebx,[esi+0]
  0x4054f8e  81 fb 65 fd ff ff                 cmp ebx,-667
  0x4054f94  74 0e                             je    0x4054fa4
  0x4054f96  8d 5b ff                          lea ebx,[ebx-1]
  0x4054f99  89 1e                             mov [esi+0],ebx
  0x4054f9b  85 db                             test ebx,ebx
  0x4054f9d  75 05                             jne   0x4054fa4
  0x4054f9f  e8 dc 53 07 04                    call (DSTR-DEALLOC)
  0x4054fa4                                    [label3]
  0x4054fa4  8b e5                             mov esp,ebp
  0x4054fa6  5d                                pop ebp
  0x4054fa7  c3                                ret
===
=== Aggregated assembly output: END
================================================================================

building code for `(OPEN)` () [FASTCALL].
=== Aggregated assembly output: BEGIN
===
  0x4054dca                                    [prologue]
  0x4054dca  55                                push ebp
  0x4054dcb  8b ec                             mov ebp,esp
  0x4054dcd                                    [frag entry]
  0x4054dcd  83 ec 18                          sub esp,24
  0x4054dd0  89 5d fc                          mov [ebp-4],ebx  <= spill parami1
  0x4054dd3  89 75 f8                          mov [ebp-8],esi  <= spill parami2
  0x4054dd6  89 7d f4                          mov [ebp-12],edi  <= spill parami3
  ------------------------------ # n0test_rec_mth_ptr_01:(OPEN)
  0x4054dd9  8b 1d 28 fd d2 04                 mov ebx,[0x4d2fd28]
  0x4054ddf  85 db                             test ebx,ebx
  0x4054de1  74 20                             je    0x4054e03
  ------------------------------ # allocating no-dtor temp string var
  0x4054de3  c7 45 f0 7c fd d2 04              mov [ebp-16],80936316
  0x4054dea  c7 04 24 8c fd d2 04              mov [esp+0],80936332
  0x4054df1  ba 22 00 00 00                    mov edx,34
  0x4054df6  b9 c0 5b d2 04                    mov ecx,80894912
  0x4054dfb  e8 20 56 07 04                    call (ASSERT-FAILURE)
  0x4054e00  83 ec 04                          sub esp,4
  0x4054e03                                    [label1]
  0x4054e03  b9 f8 8a d2 04                    mov ecx,80907000
  0x4054e08  e8 73 56 07 04                    call (NEW-REC)
  0x4054e0d  89 05 28 fd d2 04                 mov [0+80936232],eax
  0x4054e13  8b 1d 28 fd d2 04                 mov ebx,[0x4d2fd28]
  0x4054e19  85 db                             test ebx,ebx
  0x4054e1b  75 20                             jne   0x4054e3d
  ------------------------------ # allocating no-dtor temp string var
  0x4054e1d  c7 45 f0 98 fd d2 04              mov [ebp-16],80936344
  0x4054e24  c7 04 24 a8 fd d2 04              mov [esp+0],80936360
  0x4054e2b  ba 24 00 00 00                    mov edx,36
  0x4054e30  b9 c0 5b d2 04                    mov ecx,80894912
  0x4054e35  e8 e6 55 07 04                    call (ASSERT-FAILURE)
  0x4054e3a  83 ec 04                          sub esp,4
  0x4054e3d                                    [label2]
  0x4054e3d  8b 1d 28 fd d2 04                 mov ebx,[0x4d2fd28]
  0x4054e43  c7 03 45 00 00 00                 mov [ebx+0],69
  0x4054e49  b9 b4 fd d2 04                    mov ecx,80936372
  0x4054e4e  e8 ed 60 07 04                    call Log:String
  0x4054e53  8b 1d 28 fd d2 04                 mov ebx,[0x4d2fd28]
  0x4054e59  8b 0b                             mov ecx,[ebx+0]
  0x4054e5b  e8 c0 60 07 04                    call Log:Int
  0x4054e60  e8 0b 61 07 04                    call Log:Ln
  0x4054e65  8b 0d 28 fd d2 04                 mov ecx,[0x4d2fd28]
  0x4054e6b  ba 08 8a d2 04                    mov edx,80906760
  0x4054e70  e8 eb 59 07 04                    call (IS-A-PTR)
  0x4054e75  85 c0                             test eax,eax
  0x4054e77  74 0c                             je    0x4054e85
  0x4054e79  b9 d4 fd d2 04                    mov ecx,80936404
  0x4054e7e  e8 bd 60 07 04                    call Log:String
  0x4054e83  eb 0a                             jmp 0x4054e8f
  0x4054e85                                    [label3]
  0x4054e85  b9 ec fd d2 04                    mov ecx,80936428
  0x4054e8a  e8 b1 60 07 04                    call Log:String
  0x4054e8f                                    [label4]
  0x4054e8f  e8 dc 60 07 04                    call Log:Ln
  0x4054e94  8d 55 f0                          lea edx,[ebp-16]  <= restore allocp2
  0x4054e97  8b 0d 28 fd d2 04                 mov ecx,[0x4d2fd28]
  0x4054e9d  8d 49 04                          lea ecx,[ecx+4]
  ------------------------------ # allocating no-dtor temp string var
  0x4054ea0  c7 45 f0 08 fe d2 04              mov [ebp-16],80936456
  0x4054ea7  e8 74 57 07 04                    call (DSTR-ASS)
  0x4054eac  8b 0d 28 fd d2 04                 mov ecx,[0x4d2fd28]
  0x4054eb2  e8 06 01 00 00                    call n0test_rec_mth_ptr_01:Mth0
  0x4054eb7  b9 20 fe d2 04                    mov ecx,80936480
  0x4054ebc  e8 7f 60 07 04                    call Log:String
  0x4054ec1  8b 1d 28 fd d2 04                 mov ebx,[0x4d2fd28]
  0x4054ec7  8b 0b                             mov ecx,[ebx+0]
  0x4054ec9  e8 52 60 07 04                    call Log:Int
  0x4054ece  e8 9d 60 07 04                    call Log:Ln
  0x4054ed3  c7 04 24 40 fe d2 04              mov [esp+0],80936512
  0x4054eda  e8 24 00 00 00                    call n0test_rec_mth_ptr_01:StrTest0
  0x4054edf  8b 7d f4                          mov edi,[ebp-12]  <= restore parami3
  0x4054ee2  8b 75 f8                          mov esi,[ebp-8]  <= restore parami2
  0x4054ee5  8b 5d fc                          mov ebx,[ebp-4]  <= restore parami1
  0x4054ee8  8b e5                             mov esp,ebp
  0x4054eea  5d                                pop ebp
  0x4054eeb  c3                                ret
===
=== Aggregated assembly output: END
================================================================================

building code for `(CLOSE)` () [FASTCALL].
=== Aggregated assembly output: BEGIN
===
  0x4054d42                                    [prologue]
  0x4054d42  55                                push ebp
  0x4054d43  8b ec                             mov ebp,esp
  0x4054d45                                    [frag entry]
  0x4054d45  83 ec 18                          sub esp,24
  0x4054d48  89 5d fc                          mov [ebp-4],ebx  <= spill parami1
  0x4054d4b  89 75 f8                          mov [ebp-8],esi  <= spill parami2
  0x4054d4e  89 7d f4                          mov [ebp-12],edi  <= spill parami3
  ------------------------------ # n0test_rec_mth_ptr_01:(CLOSE)
  0x4054d51  b9 58 fe d2 04                    mov ecx,80936536
  0x4054d56  e8 e5 61 07 04                    call Log:String
  0x4054d5b  8b 0d 28 fd d2 04                 mov ecx,[0x4d2fd28]
  0x4054d61  b8 04 00 00 00                    mov eax,4
  0x4054d66  8b 0c 01                          mov ecx,[ecx+eax*1+0]
  0x4054d69  e8 d2 61 07 04                    call Log:String
  0x4054d6e  e8 fd 61 07 04                    call Log:Ln
  0x4054d73  8b 0d 28 fd d2 04                 mov ecx,[0x4d2fd28]
  0x4054d79  8d 49 04                          lea ecx,[ecx+4]
  0x4054d7c  33 d2                             xor edx,edx
  0x4054d7e  e8 9d 58 07 04                    call (DSTR-ASS)
  0x4054d83  8b 0d 28 fd d2 04                 mov ecx,[0x4d2fd28]
  0x4054d89  8d 49 04                          lea ecx,[ecx+4]
  ------------------------------ # allocating no-dtor temp string var
  0x4054d8c  8d 55 f0                          lea edx,[ebp-16]  <= restore allocp1
  0x4054d8f  c7 45 f0 74 fe d2 04              mov [ebp-16],80936564
  0x4054d96  e8 85 58 07 04                    call (DSTR-ASS)
  0x4054d9b  8b 0d 28 fd d2 04                 mov ecx,[0x4d2fd28]
  0x4054da1  e8 fa 57 07 04                    call (DISPOSE-REC)
  0x4054da6  c7 05 28 fd d2 04 00 00 00 00     mov [(null)+80936232],0
  0x4054db0  8b e5                             mov esp,ebp
  0x4054db2  5d                                pop ebp
  0x4054db3  c3                                ret
===
=== Aggregated assembly output: END
================================================================================

правда, Nanojit теперь стал активно использовать ESI. не то чтобы это имело значение, но надо посмотреть, можно ли нано сказать, чтобы ESI/EDI трогал в последнюю очередь. чисто для красоты, тащемта.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Вторник, 23 Июль, 2024 02:38 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1556
как выяснилось, ESI/EDI он и так трогает последними. просто очень обрадовался, что регистров много.

тем временем после волшебного пинка поняша (спасибо!) было принято волевое решение: массивы бывают или полностью статические, или полностью динамические. никаких там `ARRAY OF ARRAY 10 OF ARRAY`. иба ваистену. и мы теперь можем вот в так:
Код:
MODULE n0test_dynarr_02;

IMPORT L := Log;


PROCEDURE DumpArr (IN a: ARRAY OF ARRAY OF INTEGER);
VAR
  i0, i1: INTEGER;
BEGIN
  L.String("0dim="):Int(LEN(a, 0)):Ln;
  L.String("1dim="):Int(LEN(a, 1)):Ln;
  L.String("[0,0]="):Int(a[0, 0]):Ln;
  i0 := 0; i1 := 0;
  WHILE i1 < LEN(a, 1) DO
    L.String("loop: a["):Int(i0):String(","):Int(i1):
      String("]="):Int(a[i0, i1]):Ln;
    INC(i1);
  ELSIF i0 + 1 < LEN(a, 0) DO
    INC(i0); i1 := 0;
  END WHILE;
END DumpArr;


VAR
  a: ARRAY 4, 2 OF INTEGER;
BEGIN
  a[0, 0] := 69;
  a[0, 1] := 666;
  a[1, 1] := 669;
  L.String("a[0, 0]="):Int(a[0, 0]):Ln;
  L.String("a[0, 1]="):Int(a[0, 1]):Ln;
  L.String("a[1, 0]="):Int(a[1, 0]):Ln;
  L.String("a[1, 1]="):Int(a[1, 1]):Ln;
  DumpArr(a);
END n0test_dynarr_02.

да, `IN` обязателен. или `VAR`, или `OUT`.

в общем, ещё чуть-чуть совсем (начать и кончить) — и можно будет пресловутый тестовый код погонять.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Среда, 24 Июль, 2024 15:01 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1556
постепенно набиваем тестов, гыг.
Код:
TESTING: n0test_00.mod
TESTING: n0test_00_base.mod
TESTING: n0test_and_00.mod
TESTING: n0test_arr_00.mod
TESTING: n0test_arr_01.mod
TESTING: n0test_arr_02.mod
TESTING: n0test_assert_00.mod
TESTING: n0test_assert_01.mod
TESTING: n0test_assert_02.mod
TESTING: n0test_div_mod_00.mod
TESTING: n0test_div_mod_01.mod
TESTING: n0test_dynarr_00.mod
TESTING: n0test_dynarr_01.mod
TESTING: n0test_dynarr_02.mod
TESTING: n0test_dynarr_03.mod
TESTING: n0test_dynarr_04.mod
TESTING: n0test_log_00.mod
TESTING: n0test_rec_inh_00.mod
TESTING: n0test_rec_mth_00.mod
TESTING: n0test_rec_mth_01.mod
TESTING: n0test_rec_mth_ptr_01.mod
TESTING: n0test_rec_mth_ptr_02.mod
TESTING: n0test_rec_pass_00.mod
TESTING: n0test_recurse_00.mod
TESTING: n0test_set_in_00.mod
TESTING: n0test_str_00.mod
TESTING: n0test_str_01.mod
TESTING: n0test_str_02.mod
TESTING: n0test_str_03.mod
TESTING: n0test_str_04.mod
TESTING: n0test_str_05.mod
TESTING: n0test_str_06.mod
TESTING: n0test_str_char_00.mod
TESTING: n0test_str_idx_00.mod
TESTING: z_bug_000.mod

алсо, сделал импорт модулей как в oo2c: `IMPORT Dir0:Dir1:ModName;`. ящиковское разделение по верхним буквам как-то не радует, в oo2c определённо лучше это всё. и да: Kernel будет `System:Kernel`, а всякие там `Log`, `Strings` — будут в `Core`.

и наконец-то избавился от большой родимой бородавки: `TypeDefProc` хранило не только тип процедуры, но и тело, код, всё вот это вот. что, очевидно, неправильно, потому что определения глобалов и локалов — в AST. так что процедуры теперь тоже в AST — `NodeProcDef`.

массивы вроде как работают. теперь надо запилить указатели на (открытые) массивы и NEW/DISPOSE для них. на этом база будет завершена, и можно будет начать пилить GC.

на самом деле для GC надо будет переделывать локалы. сейчас локалы выделяются кучей `allocp()` (выделение места на стеке). надо их все объединить в один большой `allocp()`. это затем, чтобы можно было в компайл-тайме сформировать «карту локалов» (где указатели, где строки). эти карты на входе будут регистрироваться в Kernel, а на выходе дерегистрироваться. соответственно, по ним будет работать и GC (вместо прямого скана стека), и stack unwinding на трапах. да, GC будет полностью precise, крутой. цена — небольшой оверхэд на входе и выходе (буквально несколько асм-инструкций).

тащемта, если регистрировать себя будет любая процедура, то это ещё и удобная структура для бэктрэйсов. ключиком сделаю, наверное: полные бэктрэйсы, или порезаные.

если бы не идиотические «блэкауты» — в принципе, всё бы заняло около недели, а не месяца. вполне нормально для компилера с использованием готового кодогена.

да, поддержка x86_64 планируется. потом. потому что надо ставить систему в виртуалке и всё такое вот (и чинить поломатый 64-бит кодоген).

ARM (32 бита) тоже есть, но для него тоже надо и ставить, и чинить. не знаю: может быть. мне, в общем-то, оно нафиг не упёрлось.

порт BBCB тоже планируется, но очень-очень потом. зато у этой фигни есть шанс стать первым портом ящика на x86_64, пусть и несколько через анус. надо будет ещё научить компилер напрямую читать ящиковские ODC — для удобства.

сырцы компилера, наверное, не дам (а потому что у меня приступ мизантропии). вот если ящик запустится — то бинарь может и да (и сырцы порта ящика, скорее всего). в любом случае — это будет уже не Компонентный Паскаль, а BBCB for Oberon/Ur.


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

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


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

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


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

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