OberonCore

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

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




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

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1556
вот ёлы… Nanojit флоаты передаёт на стеке. забавно. при этом в SIMD умеет, но использовать SIMD-регистры даже при FASTCALL не хочет. ну ладно, сделал `VAR`-аргументы. флажком, так удобней. буду неявно передавать как скрытые `VAR`. криво, хаково, но шопаде. придётся отмечать процедуры с такими аргументами как CDECL, а то иначе никак не получить нужные указатели.


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

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1556
запилил в Nanojit инструкцию `pparamp`, которая получает указатель на стековый аргумент. полезное. правда, только для x86 — остальные бэкэнды потом. соответственно, заработала передача флоатов.

про x86_64 — надо читать документ по ABI сначала: там даже cdecl-ы кучу всего в регистрах передают. что делает Nanojit с флоатами — я фиг знает, тоже надо читать код.

а для арма я просто не знаю, как в бэкэнде сделать аналог `LEA`. как-то можно, наверное, надо просто найти как.


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

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

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


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

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


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

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

Вы их лучше прямо в сообщении архивом размещайте, а то я, например, до этого сайта так и не пробился -- он просто не отвечает.


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

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

просто архив на котокоробке уже был для других целей — вот и сюда ссылку кинул.

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


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

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

кстати, подумал, что надо сделать ещё две штуки. во-первых, метод POSTBLIT (идея упёрта у дишечки). вызывается после того, как запись скопировали присваиванием. и вызывать FINALIZE для автоматических записей (то бишь, для созданых на стеке, по выходу из процедуры). наличие этих двух штук позволит потом сэмулировать строки (и любые rc/cow объекты) средствами самого оберона.

да, это добавление параллельного механизма управления жизнью объектов, по сути. но я считаю, что и простое, и полезное. например, можно будет не закрывать те же http-коннекты вручную (или надеятся, что GC когда-нибудь их соберёт), а оборачивать динамический объект в rc-запись. соответственно, когда refcounter станет нулём — вызвать `close()`, почистить указатель — и дальше пусть GC соберёт трупик: уже неважно, когда он это сделает.

а общий FINALIZE позволит — если я с устатку ничего не перепутал — спокойно выделять rc-объекты в куче, если надо. это kinda defeats their purpose, но почему бы и да. только сигнатуру FINALIZE придётся сменить: будет принимать `self` исключительно через `VAR`, а не указателем. потому что позволять re-anchor для нединамических объектов… ну, все поняли.

или таки надо два FINALIZE. или позволять только один из них. в общем, практика подскажет, как удобней.

если этот механизм покажет себя жизнеспособным — то потом портирую в LC.

тут, правда, надо будет делать полноценный stack unwinding по трапу. но в принципе — в BBCB это и так делается для создания postmortem дампа, так что даже не нужно будет дополнительных механизмов в компиляторе. ну, через границы callback'ов фокус может не пройти — и фиг с ним. я стою на той позиции, что как только мы позволяем внешнему неконтролируемому окружению вызывать обероновские процедуры — то все гарантии безопасности автоматически идут по решету.


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

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1556
а, кстати. укушеный сишечкой зачем-то сделал возможность объявлять `POINTER TO POINTER TO POINTER TO…`. тьфу. это ж совершенно бессмысленно.


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

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1556
ещё вспомнил: Nanojit не умеет в правильные DIV и MOD. надо вводить специальные опкоды и допиливать бэкэнды. меня, опять таки, устраивает размен скорости на гарантию эквивалентности `MOD n` и `BITAND (n-1)` если `n` is power-of-two. arm, как полагается, опять в афедроне. надо бы таки встроить эмулятор для тестов (однорога). куэму не вариант, потому что нужен полный тулчейн, а мне лень.


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

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1556
добавил `SET`, а то без него скучно. заодно научил `ORD()` делать из була интегер. из врождённой вредности для `TRUE` результат будет `-1`. `BITS()` тоже понимает булы.

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


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

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1556
а поддержку `VAR` в начале операторных блоков выпилю. и отсюда, и из Ультра Паскаля. это был эксперимент, и эксперимент очевидно неудачный. в итоге я это использовал всего считаное количество раз, и каждый раз это был код, который просто орал: «вынеси меня в отдельную процедуру!» «нет!, — ответствовал я ему. — не вынесу. у меня стальная сила воли, у меня терпения на восьмерых, у меня мозгов… нет у меня мозгов никаких, и не надо их совсем! не вынесу!»

а вот забивание всех локалов нулями на старте процедуры оставлю. потому что это значительно проще, чем корректная диагностика «use before assign».

ещё я подумал — и запрещаю передавать записи и массивы по значению. опять таки: это почти всегда забытый `IN` или `VAR`, и больше ничего. в BBCB повсеместно делают копии строковых массивов, например, совершенно низачем. я вместо этого введу тип `STRING`, как и намеревался. короче: нужна копия — будь любезен руками сделать копию. а для передачи используй `IN` или `VAR` или `OUT`.

с записями ещё один нюанс есть, который мне тоже всегда не нравился: копирование записи вообще занятие малоосмысленное. с одной стороны — это удобно для POD. а с другой — если запись EXTENSIBLE, например? пришёл к нам дальний потомок из-за семи морей, а мы его до уда скопировали и остановились. может и ничего страшного, но это же дикость! варварство! не хочу такую музыку, очень плохая музыка, могло быть лучше это всё.


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

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

вот он я сижу на распутье, щеку рукой подперев, бороду поглаживая. думу мрачную думаю: делать ли enum-ы, или нет?

автонумерацию констант надо делать однозначно: это ничему не вредит. а вот полноценный тип enum…

с одной стороны — это хорошо: ежели мы на вход, значится, просим тип `Action`, и он описан как `Action = INTEGER`, то и залезет к такой девице любой интегер без стыда. а вот ежели это какой-нибудь `Action = ENUMERABLE … END`, то и надо будет явно цела молодца величать: `Action.Meow`. а из других семей молодцев и на порог не пустят. однако ж что ежели надо будет нам добавить `Action.Woof`, да в другом доме? а потом `Action.Bark`, да в третьем, но получив `Action` из нулевого оригинального?

короче, расширение енумов — ненужный геморрой. а без него полезность значительно снижается.

есть, впрочем, ещё один вариант: «enum-ы без значений». для этих целей можно использовать записи без полей, и разрешить такие записи создавать инлайном. короче, что-то типа:
Код:
TYPE
  BaseAction = EXTENSIBLE EMPTY RECORD;
  Action1 = EMPTY RECORD (BaseAction);
  Action2 = EMPTY RECORD (BaseAction);

PROCEDURE DoIt (act: BaseAction);
тут обычный WITH, делов-то.

и вызов:
DoIt(Action1);

запись явно помечена как `EMPTY`, и поэтому можно тупо использовать имя типа как «конструктор». всё равно передаётся в итоге только typeid.

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

прошу отклик зала: это очень уродливо и бесполезно по вашему мнению, или вполне может жить?

p.s.: на самом деле такой хак и в Ультра Паскаль можно затащить, он там ничего не сломает. правда, CP2 очень герметичный компилятор в самом плохом смысле слова, и активно сопротивляется любым изменениям за счёт адовой обфускации кода. но где наша не побеждала…


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

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

в общем, правильно молчите, конечно: всё равно я бы никого слушать не стал. у кого своего компилятора нет — так вы ж в них ничего и не понимаете. а у кого есть — те их сделали неправильно, и тем более нет причин слушать бракоделов.

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


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

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


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

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1556
а. забавное. а вы знаете, что Nanojit — это основа TraceMonkey, а TraceMonkey, в свою очередь, довольно прилично паслось на работах по «трассирующим JIT» из… ETHZ? прикольный круговорот.

p.s.: я, правда, трассировки выкинул и оставил традиционное «житуем целую процедуру».

p.p.s.: а, вру. не в ETHZ. но Вирт там всё равно отметился. через ученика.


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

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


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

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

инвариант: все указатели на структуры строк всегда должны жить во временных переменных.

конкатенация преобразуется в цепочку вызовов `acc := CAT(acc, str)`. в начале `acc` — пустая строка, потом в неё суют остальное.

микрооптимизация: `a := a + str1 + str2` — тут в качестве acc можно использовать `a`, предварительно сделав `ensureUnique(@a)`. но я так пока не делаю.

если процедура возвращает строку — она должна быть с бампнутым рефкаунтером, и результат сразу пишем во временную переменную.

если процедуре передаём строку — процедура должна бампнуть и дебампнуть рефкаунтер сама.

все заюзаные в операторе временные переменные бережно сохраняем в списке, и после генерации кода оператора вызываем для них `decref()`.

метод, как я уже сказал, не лучший — зато простой. что-то похожее CP2 делал с COM-объектами, пока я это не вырезал. врезать, что ли, обратно, только заменить комы на строки? ну дельфостроки удобные же.


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

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


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

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


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

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4722
Откуда: Россия, Орёл
arisu писал(а):
кстати. а чем бы компилятор потестировать? неужели опять самому всё писать?

Компилированием другого компилятора... если, конечно, язык совместим вообще. :mrgreen:


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

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


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

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


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

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