OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 23 Январь, 2026 19:13

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




Начать новую тему Ответить на тему  [ Сообщений: 102 ]  На страницу Пред.  1, 2, 3, 4, 5, 6  След.
Автор Сообщение
СообщениеДобавлено: Среда, 15 Октябрь, 2025 17:34 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1627
Каким образом устроена кроссплатформенность GUI приложений?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 15 Октябрь, 2025 21:17 

Зарегистрирован: Вторник, 30 Сентябрь, 2025 21:13
Сообщения: 85
>>>> посоветовать не могу
Это лучшая подсказка. Раз сходу не отвергли, значит можно пробовать. А, что получится … Вдруг повезет.

Хочу вернуться немного назад - к топику с 32-мя битами. Знаю, что Вы очень хорошо разбираетесь в процессорных архитектурах. И, на самом деле есть 32-х разрядная реализация для x86. Но, сделанная настолько криво, что лучше считать, что ее нет.

Почему. Кодогенератору для перевода ‘родных’ risc команд (в базе 256 регистров) требуется хотя бы 16 регистров на целевом процессоре. Не придумал ничего лучше, чем задействовать SSE регистры в дополнении к 8 имеющимся. Плюс ассемблера нет, сразу в машинные инструкции. Дальше можно не продолжать. Вы уже представили, что из этого получилось. Да работает. И да, код огромадный. И да, эффективность ниже плинтуса.

Много позже. После экспериментов с WebAssemble и его стековой архитектурой научился регистровый код переводить в стековый. А теперь не знаю, стоит делать попытку № … раз. Или как решил ранее, даже не смотреть в эту сторону ?


>>>> Коллегу arisu, полагаю, будет не бесполезно потеребить

Возможно. Но у arisu и оппонента Олега, запредельный уровень понимания. И то, что считается ими простым и понятным, для меня может оказаться трудно исполнимой задачей. А готовые решения, не знаю почему, но не использую. Хочется самому написать каждую строчку кода.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 15 Октябрь, 2025 21:23 

Зарегистрирован: Вторник, 30 Сентябрь, 2025 21:13
Сообщения: 85
>>>> Каким образом устроена кроссплатформенность GUI приложений?

Реализована собственная графическая объектная библиотечка SML, с набором кастомных (рисованных самостоятельно) визуальных элементов. Библиотечка платформеннонезависима. Точнее состоит из платформеннонезависимой части. И части зависящей от платформы.

Для каждой платформы, зависящая часть своя. Но все они имеют одинаковый интерфейс. А при сборке готового приложения, меняется только имя зависимого модуля в списке импорта. В зависимой части реализуются специфические для каждой платформы особенности. А именно: взаимодействие с клавиатурой, мышью, вывод на экран, таймеры и файловые операции.

Из особенностей. Графика в Mac OS через фреймворк Cocoa, в Linux на выбор X11, или Wayland и windows родное WinApi. Для web браузеров в wasm приложениях - кастомное рисование с помощью api canvas (реализовано в самописных js библиотечках - аналогах dylib, so или dll).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 16 Октябрь, 2025 18:14 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3840
Очень впечатляет.

Просьба ещё к архиву добавлять номер версии. А то я всё жду апдейты. И на сайте непонятно, когда архив без номера версии, выгрузили вы что-то новое или нет.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 16 Октябрь, 2025 21:48 

Зарегистрирован: Вторник, 30 Сентябрь, 2025 21:13
Сообщения: 85
Иван! Прошу прощения. Исправлюсь. Сейчас на сайте лежит версия от 12.10.2025 14:33. Частично исправлены замечания Artyemov. Убран мусор от отладочный печати. А вот создать каталог, при его отсутствии не успел. Обнаружил глюк в Linux версии для X11.

Таймеры. В Wayland варианте используются posix таймеры. Для X11 оказалось, что не все сборки Linux такие множественные таймеры поддерживают. Решил использовать обычный таймер (на сигналах). И на его основе написать менеджер, превращая в псевдо множественный. Сделал. Но по непонятной причине единственный таймер, работающий в одном потоке блокирует сам себя ??? Поставил критическую секцию на мьютексе. Частично помогло - мигающий курсор и подсказки друг друга больше не блокируют. Теперь deadlock с таймером возникает при изменении размера приложения за нативную рамку мышкой ??? После кучи экспериментов в очередной раз все сломал. За это у меня отобрали ноутбук, и отправили куда подальше, почти до конца октября. Хорошо планшет оставили.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 10 Ноябрь, 2025 11:45 

Зарегистрирован: Вторник, 30 Сентябрь, 2025 21:13
Сообщения: 85
Ormcode - кросс компилятор языка программирования Oberon-2M ORM для Linux X11. Компилирует и собирает исполняемые файлы для Windows, Mac OS, Linux и WebAssembly в нативный код Amd64, Arm64, Risc-v и Wasm.

Последняя сборка ormcode для Windows и сборки редактора для всех платформ от 10.11.2025 на странице сайта https://ormcode.ru/isit4.html

Ormcode - кросс компилятор языка программирования Oberon-2M ORM для Mac OS. Компилирует и собирает сам себя. На Mac OS под Windows. На Windows под Mac OS. Наоборот тоже работает. Если, есть необходимость положу архив здесь же.

Вложение:
z02.png
z02.png [ 488.87 КБ | Просмотров: 2647 ]


ps1: Ormccode компилятор тестировал на четырех версиях Linux. На западных Armbian, Linux Mint, Kali Linux - работает. На отечественной AltLinux - работает частично, так как AltLinux придерживается старого стандарта, в котором pthread_mutexattr_???? находятся не в Libc библиотеке (переделать интерфейсы для полной поддержки не сложно). Linux-ы запускал с флешки как есть ‘из коробки’ в live режиме.

ps2: С таймерами до конца не разобрался, проблема сидит глубже, в сигналах и правильном их применении. Перечитал сотни страниц тематической ма… литературы и только еще больше запутался. Разбираюсь дальше.


Вложения:
ormclin.rar [1.46 МБ]
Скачиваний: 61
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 13 Ноябрь, 2025 11:13 
Аватара пользователя

Зарегистрирован: Воскресенье, 09 Декабрь, 2018 15:14
Сообщения: 148
Откуда: Equestria
Зачем таймеры?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 14 Ноябрь, 2025 00:44 

Зарегистрирован: Вторник, 30 Сентябрь, 2025 21:13
Сообщения: 85
>>>> Зачем таймеры?
Для GUI. Мигающий курсор, всплывающие подсказки, анимация.

>>>> На AltLinux - работает частично
Перенес интерфейс функций pthread_mutexattr_??? из libc.so в libpthread.so. Теперь и на AltLinux динамическая JIT компиляция и сборка тоже работает.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 23 Ноябрь, 2025 21:50 
Аватара пользователя

Зарегистрирован: Воскресенье, 09 Декабрь, 2018 15:14
Сообщения: 148
Откуда: Equestria
Михаил писал(а):
Для GUI. Мигающий курсор, всплывающие подсказки, анимация.
Для этого сигналы не нужны и даже вредны.
timer_create() + SIGEV_NONE или clock_gettime() или даже time() будет достаточно в общем цикле программы/треда.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 01 Декабрь, 2025 22:17 

Зарегистрирован: Вторник, 30 Сентябрь, 2025 21:13
Сообщения: 85
Ormcode для Linux X11 X86-64. Сборка от 30.11.2025. По подсказке SovietPony переписал таймеры, для запуска на произвольной Linux.


Вложения:
z03.png
z03.png [ 115.76 КБ | Просмотров: 1654 ]
ormclin.zip [1.75 МБ]
Скачиваний: 36
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 18 Декабрь, 2025 01:29 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3840
Попробовал линукс-версию на Linux Mint 21.2.
Буквы печатаются не те, что на клавишах клавиатуры.
От переключения раскладки не зависит результат печати.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 23 Декабрь, 2025 14:43 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3840
Опробовал версию, где исправлен ввод

У меня часто падет вот с таким сообщением:
Код:
dia@laptop:~/desktop/ORMCLIN$ ./xcode.elf
 gbp = 42AB4000
 sym = 42AB56F0
 str = 42AB65E0
 got = 42AB7FF0
 arg = 00000001
 par = 5DBE2278
./xcode.elf
 exit = B089D5F0
 puts = B08D8E50
[xcb] Unknown sequence number while processing queue
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
[xcb] Aborting, sorry about that.
xcode.elf: ../../src/xcb_io.c:278: poll_for_event: Assertion `!xcb_xlib_threads_sequence_lost' failed.
Аварийный останов (образ памяти сброшен на диск)


Еще заметил, что так как на Linux названия директорий зависят от регистра, то для модулей aorm, название AORM уже не подходит, может все директории сделаете в нижнем регистре, раз названия модулей не капсом?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 23 Декабрь, 2025 17:01 

Зарегистрирован: Вторник, 30 Сентябрь, 2025 21:13
Сообщения: 85
>>> Буквы печатаются не те, что на клавишах клавиатуры.
Первое: Переписал обработку клавиатурных сообщений. Очень помог Сергей Оборотов. Второе: отсутствовала поддержка дополнительной цифровой панели на клавиатуре. Добавил.

>>>> У меня часто падет вот с таким сообщением:
Спасибо, буду разбираться. И скорее всего порт для X11 перепишу на xcb+xkb. XLib- обертка над xcb. А xkb поддерживает UTF-8.

>>>> может все директории сделаете в нижнем регистре
Попробую, или везде CAPS поставлю, так наверное правильнее не думать о регистре директории.

Исправленный вариант:


Вложения:
ormclin.rar [1.34 МБ]
Скачиваний: 21
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 29 Декабрь, 2025 16:00 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1673
зачем вообще для таймеров какой-то системный API? у нас есть fd, на котором мы сидим select'ом (или poll'ом, неважно). перебрать внутренний список объектов, которым нужна активация, вычислить максимальный таймаут. если таймаут в итоге ёк — ура, таймер хит. если не ёк — повторяем. испокон веков так делалось.

алсо. использование риск-кода как IR — не лучая идея. тогда уже имеет смысл допилить до полноценного SSA (или SoN). это не так больно и страшно, как кажется: просто регистров станет бесконечно много, и надо будет расставить фиты, основываясь на CFG (а с SoN — ещё интересней). почти бесплатно получим неплохой машинонезависимый оптимизатор зато. на стадии деструкции можно использовать простейший обратный линейный аллокатор регистров: будет больно, но не очень. зато один проход. генерировать бэкэнды с таким раскладом вообще можно основываясь на абстрактном описании CPU. главное — не пугаться: это всё compiler 101. ну, может 102.

когда-нибудь звёзды сойдутся, и я сделаю SoN-компилятор. наверное. интересная технология. может даже обойдусь в нём без AST: техниески всё нужное в IR-нодах уже есть. это очень простая техника, буквально с несколькими важными частями, которые надо Один Раз Грок, и даёт на выходе вполне неплохой код, при этом быстро. под «неплохим» я имею в виду все ожидаемые прелести современного компилятора, включая loop invariant motion, уничтожение лишних nil и range checks, и прочая. кому интересно — советую почитать бумажки Клифа Клика. увлекательно. там бесплатный тортик^w VRP дают!


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 30 Декабрь, 2025 14:02 

Зарегистрирован: Вторник, 30 Сентябрь, 2025 21:13
Сообщения: 85
Ormcode первый опыт написания компилятора. Делался с одной целью - обработка (сортировка, упаковка) больших массивов в памяти. Требовалась простота и скорость обработки. Отсюда и самые простые, местами примитивные решения. Выбрано минимально возможное подмножество Oberon-2. В жертву принесена раздельная компиляция, ограничена длина индефикаторов. Ещё из неприятного, 64 - максимальное количество методов, включая наследников. Для системных задач хватает с большим запасом, а как в других реальных задачах не думал (((.

Ещё с деревьями взаимная не любовь. Везде, где возможно менял на списки, а списки везде, где возможно на линейные массивы. Долой деревья и списки. Да здравствуют линейные массивы ???. Зато простота и скорость. Константы, списки импорта, таблицы методов жестко зашиты в исполняемый код ))).


Таймеры. В одной из ранних реализаций так и делал - раз во сколько то пробегал по очереди ожидания. Затем немного усложнил. Время следующего срабатывания стал править на основе очереди ожидания. И вот этот вариант постоянно глючил. Единственно не использовал fd. Linux не ‘родная’ для меня система. Сработал стереотип, что файлы это нечто лежащее на диске и крайне ненадежное.


В защиту risc. Во первых Ваша цитата от 20 августа 23 года, 23 страница. Немного выдернута из контекста, но смысл вроде верный:

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

А по существу как минимум три пункта.

Первый. Все sym файлы, уже содержат позиционно независимый код - PIC, так как ссылки разрешаются на этапе компиляции. Загрузчик для разрешения ссылок не требуется.

Второе. Для JIT осталось только перекодировка 32 битных orm инструкций в соответствующие инструкции целевого процессора. Очень просто (скорее примитивно). JIT превратился в простой конвертор и состоит из одного большого CASE - даже оптимизаций никаких не делал. Скорость потрясающая, доли процента от времени загрузки.

Третье. Универсальные ассемблерные вставки, не зависящие от целевой архитектуры процессора. Что важно для приведения ABI в системных вызовах со стороны OS и обработке трапов на разных платформах.


Про SSA опять же узнал из Ваших топиков. Пока не очень представляю, что это такое. Буду разбираться. Понял одно. Стоит написать один и уже не остановиться. Надо подтягивать теоретическую базу ))).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 30 Декабрь, 2025 20:44 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1673
сначала полезное:

про SSA: одна из лучших книг по теме. к сожалению, не закончена и никогда не будет, но что поделать. (я взял первое попавшееся зеркало, в принципе — поиск по Inria SSA book). вот готовые pdf.

SoN — это Sea of Nodes. искать по Cliff Click, Sea of Nodes. обязательно найдётся тезис и куча более мелких бумажек-разъяснений. очень интересная идея: IR-ноды плавают в «первичном бульоне» без определённого порядка, связаные только зависимостями данных. в список для кодогена выстраиваются на одном из последних этапов. позволяет обойтись без CFG, упрощает DFA, имеет VRP в виде type lattices. (да, специально. прошу прощения. рассчитываю на любопытство, которое толкнёт искать расшифровки этих матов.) придумано не сильно позже SSA, но со свистом пролетело мимо academia: это вам не межделмаш, кто такой ваще этот Клиф Клик?

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

а теперь можно и водой заняться. %-)
Михаил писал(а):
Ormcode первый опыт написания компилятора.
о-о-о. welcome to the club. если понравилось — есть опасность получить бесполезное, но очень увлекательное хобби. я так и влип.

Михаил писал(а):
Ещё из неприятного, 64 - максимальное количество методов, включая наследников.
а зачем ограничивать размер VMT? вот глубину наследования — это понятно, чтобы проверка типа в рантайме за O(1). но VMT-то зачем? (я не издеваюсь и не иронизирую, если что. просто тон такой, заранее прошу прощения.)

Михаил писал(а):
Ещё с деревьями взаимная не любовь.
как перестать беспокоиться и полюбить балансированые двоичные деревья. %-)

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

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

Михаил писал(а):
Время следующего срабатывания стал править на основе очереди ожидания. И вот этот вариант постоянно глючил. Единственно не использовал fd. Linux не ‘родная’ для меня система. Сработал стереотип, что файлы это нечто лежащее на диске и крайне ненадежное.
юникс же. «всё на свете файл». ну, то есть, всё, что можно — имеет fd. и в большинстве случаев на это можно натравить select. а, кстати, как раз на файлы и нельзя: бесполезно. казалось бы: для файлового дескриптора самое то делать асинхронный ввод-вывод, ожидая окончания операции через select… а вот шиш.

у X11 же можно получить сокетный fd, и спокойно ожидать на нём событий. а потом звать xlib, пусть что-то с этим сделает. очень удобно, всегда так пишу.

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

btw: не рекомендую заморачиваться с xcb. ну какой смысл работать с иксовым протоколом на уровне протокола? xlib, конечно, не лучший интерфейс — но вполне удовлетворительный. только не надо всё размазывать по потокам.

Михаил писал(а):
В защиту risc. Во первых Ваша цитата от 20 августа 23 года, 23 страница. Немного выдернута из контекста, но смысл вроде верный:
вот в этом и проблема с блогозапиями (потому что там, по сути, блог): без расшифровки не всегда понятно, что автор имел в виду. там было несколько идей в одной, на самом деле: «абстрактрый риск с преобразованием его кода обратно в SSA для JIT», «абстрактный риск с бесконечными регистрами (почти SSA)» и «абстрактный риск и виртуальная машина, а JIT когда-нибудь потом».

есть простой способ решения проблемы с выделением регистров: backward linear scan. этап первый: код для рисков с фиксированым количеством регистров переписываем в SSA. это тривиально делается в один проход. с фита-нодами не паримся, просто расставляем метки для переходов. этап второй: идём по коду начиная с последней инструкции, назначая регистры в процессе. это можно (и нужно) совместить непосредственно с кодогенерацией. получается так: когда инструкции нужны операнды — мы смотрим, из каких команд они пришли (это всегда однозначно, указатели можно проставить в процессе создания SSA), выделяем свободные регистры, прописываем в инструкции-источники указание: «результат положи конкретно в этот регистр!» таким образом когда мы доходим до какой-то инструкции, то мы уже знаем, что в какие регистры положить. если регистров не хватает — делаем spill. в общем, это надо один раз нарисовать на нескольких примерах — и в голове щёлкнет Озарение. код получается довольно приличный, процесс очень быстрый и однопроходный. NanoJIT в Oberon/Ur делает именно так.

ах, да. метки — это implicit phi nodes. когда встречаем метку — то простейшим вариантом будет просто спильнуть все регистры. если хочется чуть лучше — можно мержить регистровые картинки.

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

Михаил писал(а):
Все sym файлы, уже содержат позиционно независимый код - PIC, так как ссылки разрешаются на этапе компиляции. Загрузчик для разрешения ссылок не требуется.
не понял. требуется как минимум для правки call destinations при обращении к процедурам в других модулях.
(p.s.: «В жертву принесена раздельная компиляция». упс. это я как-то пропустил.)

Михаил писал(а):
JIT превратился в простой конвертор и состоит из одного большого CASE - даже оптимизаций никаких не делал. Скорость потрясающая, доли процента от времени загрузки.
нормальный подход. осталось сделать IR на базе SSA и линейный аллокатор регистров. %-)

Михаил писал(а):
Понял одно. Стоит написать один и уже не остановиться.
ага. у меня та ж фигня. %-)

p.p.s: «Время следующего срабатывания стал править на основе очереди ожидания.» — не надо в таймере хранить таймаут (если я верно понял). надо хранить как раз время срабатывания, в системных тиках, например. тогда ничего править вообще не надо, надо только пробежаться по списку таймеров. у кого время срабатывания <= текущему значению системных тиков — стреляем. из остального выбираем минимальное значение — и вот нам готовый минимально возможный таймаут.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 30 Декабрь, 2025 21:14 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1673
и ещё дополнение: SSE рулит. можно смело считать, что у всех давно есть SSE 4.2. халявные регистры, угу. можно добавить встроеные типы VEC3 и VEC4, например. и специализированые процедуры для обработки массивов, которые компилятор будет в SSE петь. и можно без стеснения расширить язык, добавив FOREACH для массивов, например: Вирт говорил, что оберон не догма, а образ мышления. %-) и универсальный итератор Парнаса — который у меня так руки и не дошли всунуть именно в оберон, хотя в другие компиляторы сразу. всё красивый синтаксис не придумывается, зараза.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 01 Январь, 2026 15:55 

Зарегистрирован: Вторник, 30 Сентябрь, 2025 21:13
Сообщения: 85
>>>> сначала полезное:
Спасибо большое. Скачал. Будет чем заняться на праздничные выходные ))).

>>>> как перестать беспокоиться и полюбить балансированые двоичные деревья.
Вау, это надо видеть всем ))).

>>>> а зачем ограничивать размер VMT? вот глубину наследования — это понятно
Все для PIC. За один проход проставить все смещения и избежать релокации. А вот ограничений по глубине наследования нет.

>>>> p.s.: «В жертву принесена раздельная компиляция». упс. это я как-то пропустил.)
Исключительно ради однопроходности компилятора и динамической загрузки модулей

>>>> искренне советую жёстко прибить всю работу с оконной системой к одному потоку, и всё-всё делать только в нём.
>>>> btw: не рекомендую заморачиваться с xcb. ну какой смысл работать с иксовым протоколом на уровне протокола?

Поздно, остапа . . . понесло (((. И xcb не совсем протокол. Обертки над протоколом. В тестовом режиме: окошко, рисование в нем, перехват сообщений, свои мышиные курсоры. Не разобрался пока только с clipboard. По ощущениям код получается более простой (логичный скорее) и более короткий чем с xlib. Если все получиться, буду настоятельно рекомендовать в место xlib. И с многопоточностью пишут - проблем нет. Плюс очень хорошая документация.

>>>> есть простой способ решения проблемы с выделением регистров:

Вот как раз с регистрами проблем нет (или мне кажется, что нет). Они у меня ‘умные’ - каждый регистр знает свое место - знает какая переменная в нем храниться, какой у него тип. Повторная загрузка упразднена (неважно локальная или глобальная переменная). И с переменными циклов тоже хорошо, они у меня в регистрах.

>>>> >>>> Все sym файлы, уже содержат позиционно независимый код - PIC
>>>> не понял. требуется как минимум для правки call destinations при обращении к процедурам в других модулях.

С чего бы это, внутри модуля смещения от PC, а внешний вызовы (из другого модуля) смещение от BP модуля. При динамической загрузке вполне достаточно.

>>>> осталось сделать IR на базе SSA и линейный аллокатор регистров. %-)
Угу, теперь пока не разберусь, спать не смогу (((. Спасибо Вам ))).

>>>> и вот нам готовый минимально возможный таймаут.
Попробую. Попытка № пусть будет 99. Достали меня уже если честно эти таймеры. Не выходит каменный цветок.

>>>> и ещё дополнение: SSE рулит. можно смело считать, что у всех давно есть
>>>> SSE 4.2. халявные регистры, угу. можно добавить встроеные типы VEC3 и VEC4

Вот, вот- это ближайший приоритет для расширения компилятора. Одна из целей, ради чего все затевалось. Единственная пока тормозилка - привести параллельную обработку данных simd для разных платформ к общему знаменателю.

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

Ха, Вы думаете не пытался. Три года пытался . . . (((. А нормальная мета в полном объеме сидит в orm sym файлах. И динамическая загрузка - первое что реализовал в компиляторе. Да нет ‘живых’ документов. Есть только коммандер, но и цели такой не было. Раздельную компиляцию - тоже знаю как сделать. Сергей Оборотов подсказал. Тогда и ограничение с VTM автоматом снимется. Но такое решение требует от компилятора второго прохода, а как в одном проходе сделать ??? Мучаюсь (((.

SSA - прежде всего оптимизация. И пока ssa не умею. То … Вы только не кидайтесь зелеными помидорами - они не вкусные (красные можно) ))).

Оптимизация. Что, зачем. По сути четыре вида: инлайн подстановка, вынос инвариантов, вычисление константных выражений, распределение регистров.

Константные выражения в исполняемом файле . . . - просто смешно.

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

Распределение регистров - есть ‘умные’ регистры, 20 строк. И почти тоже самое.

Вопрос. 8 миллионов строк - gcc, 9 миллионов строк clang. Стоит оно того ???.

И да, есть переписка с DeepSeek (несколько десятков страниц). Он со мной не согласен, если что, но и убедить не смог ))).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 01 Январь, 2026 17:33 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1673
Михаил писал(а):
Все для PIC. За один проход проставить все смещения и избежать релокации. А вот ограничений по глубине наследования нет.
тогда у вас проверки типа `IS` и WITH-сторожа работают за O(n), а не за O(1), получается. ну, или нужно добавлять проверку на размер таблицы сначала. практика же показывает, что ограничение на 15 наследников достаточно; если не хватает — то надо срочно переписывать код. и тогда `IS` — это просто один cmp по заранее известному смещению.

Михаил писал(а):
Исключительно ради однопроходности компилятора и динамической загрузки модулей
а зачем однопроходность? даже CP2 не однопроходный, и OP2 (на котором CP2 базируется) тоже. одно из преимуществ многопроходности — избавляемся от forward-объявлений. терпеть их не могу.

Михаил писал(а):
И xcb не совсем протокол. Обертки над протоколом.
xcb — это настолько прямая трансляция иксового протокола в код, что оно даже генерируется по формальному описанию протокола. xlib же почти всё это прячет. настолько, что в гайке, кажется, когда-то делали приколюху: переписали xlib на работу с апи гайки — и куча иксового софта волшебно заработала. с xcb такая приколюха не получится: придётся эмулировать весь икс-сервер.

Михаил писал(а):
Не разобрался пока только с clipboard.
а это отдельный протокол поверх иксового. корректная его реализация довольно сложна, и весит порядочно. к тому же этот протокол ещё и асинхронный. я в LC кое-как реализовал, но почему оно иногда ещё и работает — не знаю.

Михаил писал(а):
Если все получиться, буду настоятельно рекомендовать в место xlib.
пожалуйста, не надо. просто поверьте на слово пока. ;-)

Михаил писал(а):
И с многопоточностью пишут - проблем нет.
проблемы с многопоточностью начинаются ровно в тот момент, когда появляются потоки исполнения. и не заканчиваются никогда. threads are evil. do not use threads.

Михаил писал(а):
Плюс очень хорошая документация.
у xlib тоже. иначе я бы не смог ней пользоваться, потому что код у неё ужасен. ;-)

Михаил писал(а):
Попробую. Попытка № пусть будет 99. Достали меня уже если честно эти таймеры. Не выходит каменный цветок.
потому что подход неверный, полагаю. их надо интегрировать с event loop, а event loop делать как у иксов, а не как у шынды. у шынды в этом плане плохо абсолютно всё.

Михаил писал(а):
Но такое решение требует от компилятора второго прохода, а как в одном проходе сделать ??? Мучаюсь (((.
не мучайтесь, просто позвольте себе сделать нормальное AST. плюньте на однопроходность, оно того не стоит.

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

Михаил писал(а):
И пока ssa не умею. То … Вы только не кидайтесь зелеными помидорами - они не вкусные (красные можно) ))).
а чего кидаться-то? никто не рождается зная сразу всё. не знать чего-то — не порок, чего тут стесняться. умная книжка вас научит, не переживайте. ;-)

в идеале, конечно, было бы ещё неплохо проштудировать Драконью Книгу, там много вкусного.

Михаил писал(а):
Константные выражения в исполняемом файле . . . - просто смешно.
тем не менее, турбо паскаль честно компилировал выражение `4 * 3` в рантаймовое умножение. и ничего — покупали же.

Михаил писал(а):
Инлайн подстановка, вынос инвариантов - от кривых ручек индийских программистов не защитит не один оптимизирующий компилятор. А так то - это просто прямая обязанасть программиста в узких местах сделать ручками.
инлайнер очень полезен: он позволяет не делать портянки кодокаши, а спокойно разделять код на процедуры, которые могут быть размером в одну-две строки — и не переживать по поводу накладных расходов на вызов. плюс — partial evaluation: это очень мощная штука, которой gcc меня уделал всухую.

loop invariant motion и loop strength reduction нужны примерно по тем же причинам. особенно если компилятор делает другие оптимизации: в итоге оптимизаций и инлайнинга в циклах как раз может появиться код, который неплохо оттуда убрать. для той же цели полезно иметь value range propagation.

впрочем, я в Oberon/Ur всего этого не сделал, и ничего: спокойно написал видеоигоря, работает, играется.

Михаил писал(а):
Вопрос. 8 миллионов строк - gcc, 9 миллионов строк clang. Стоит оно того ???.
это проекты совсем другого уровня. и, кстати, весьма переусложнённые без нужды. а вот есть, например, qbe — маленький и сердитый. а ещё есть libfirm — тоже хорошая штучка. qbe вообще можно стырить тупо механически переписав код на оберон (правда, там нет кодогена под x86, но добавить не проблема).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 02 Январь, 2026 16:45 

Зарегистрирован: Вторник, 30 Сентябрь, 2025 21:13
Сообщения: 85
>>>> у вас проверки типа `IS` и WITH-сторожа работают за O(n), а не за O(1)
>>>> одно из преимуществ многопроходности — избавляемся от forward-объявлений. терпеть их не могу.

Ой, может что-то неправильно сделал. Оператор IS - слева экземпляр объекта, содержит динамический tag type, справа статический tag type объекта, вычисляемый на этапе компиляции, одно cmp и все ???.

WITH - исключил. Forward, тоже не люблю, исключил в своем подмножестве.

>>>> xcb — это настолько прямая трансляция иксового протокола в код, что оно даже генерируется по формальному описанию протокола.

Xcb, libx ещё ничего. Вот wayland. Наступил на все грабли, на некоторые не по одному разу. После реализации, ни одного печатного слова сказать не могу (остались только непечатные).

>>>> проблемы с многопоточностью начинаются ровно в тот момент, когда появляются потоки исполнения. и не заканчиваются никогда. threads are evil. do not use threads.

Подпишусь под каждым словом, и не спешу добавлять к себе. Набил не одну шишку. В одном эксперименте даже написал менеджер потоков с вытесняющей многозадачностью. Но в целом авторы сильно сгущают краски. Потоки можно и нужно использовать, в подходящих задачах и полностью отдавая отчет, зачем и почему. Обязательно понимать разницу между потоком и процессом. Иначе, может случиться, там где потоки ускоряют, процессы будут сильно замедлять. Или там, где потоки приведут к неминуемую краху, процессы обеспечат 100 процентную надежность.

>>>> в идеале, конечно, было бы ещё неплохо проштудировать Драконью Книгу, там много вкусного.

Знаю такую. Она меня пугает. Тензорный (функциональный) анализ, по сравнению с ней кажутся легким чтением.

>>>> спокойно написал видеоигоря, работает, играется.

Вот это, за гранью моего понимания (((. Как Вы все успеваете ))).


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

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


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

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


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

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