crypt of decay - всё поломал! [entries|archive|friends|userinfo]
ketmar

[ userinfo | ljr userinfo ]
[ archive | journal archive ]

всё поломал! [May. 21st, 2020|11:31 am]
Previous Entry Add to Memories Tell A Friend Next Entry
переделываю scope management в вавумцэ. поскольку в языке строки всегда динамические, и есть динамические массивы, то по выходу из функции локалы с такой фигнёй надо чистить. янис, естественно, это предусмотрел, но методом несколько упрощённым: не парясь скопами просто деструктить всё, что в этом нуждается, перед `return`.

в принципе, решение рабочее, но в нём есть очевидные черви. во-первых, это сильно усложняет повтороное использование стековых слотов: фактически, локал живёт всю функцию, даже если используется один раз где-то глубоко внутри кода. во-вторых, некоторые штуки типа «scripted foreach» (который вызывает для итерации другие методы на вавумцэ) хочет после этого цикла вызвать метод «done» (в том числе и если из цикла вышли по `break`) для всяческой очистки, например. в третьих, мне захотелось привинтить к структурам деструкторы, потому что почему нет. и вот тут схема дала сбой.

проблему со «scripted foreach» я решил адовым хаком с введением особых «финализаторов», ручной регистрацией их в общем контексте кодогена и прочей грязью. при том, что у нас уже есть совершенно очевидный scope list: AST-ноды рекурсивно вызывают кодоген для своих детей же. так что всего и надо — поддерживать аплинк, и у нас есть zero-effort current scope list.

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

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

короче, мы старый мир разрушим, а потом… как-нибудь. но новый дизайн однозначно красивей и логичней, так что оно того стоит.
Linkmeow!

Comments:
From:(Anonymous)
Date:May 21st, 2020 - 11:45 am
(Link)
в конструктивном алгоритмическом мире функция это зло.
пиши без функций
особенно там где нужна производительность
во фрейме например
[User Picture]
From:[info]ketmar
Date:May 21st, 2020 - 11:58 am
(Link)
спасибо, твоё мнение охуительно ценно для 3+ мегабайт легаси кода. приходи когда перепишешь его весь правильно.
From:(Anonymous)
Date:May 21st, 2020 - 01:15 pm
(Link)
как показывает практика, пусе нассать в башку большо ума не надо. больше алгоритмизации, ещё больше. учитывая, что в процессор после всей это тряхомудии улетают конструкции вроде гото1 говорит о многом
(Replies frozen) (Parent) (Thread)
[User Picture]
From:[info]ketmar
Date:May 21st, 2020 - 01:29 pm
(Link)
убей себя, пожалуйста, ты тупое говно.
(Replies frozen) (Parent)
From:(Anonymous)
Date:May 21st, 2020 - 07:52 pm
(Link)
> пиши без функций
А как это? Покажи пример.
[User Picture]
From:[info]ketmar
Date:May 21st, 2020 - 08:00 pm
(Link)
это как на бейсике.
From:(Anonymous)
Date:May 21st, 2020 - 01:57 pm
(Link)
убился, спасибо!
From:(Anonymous)
Date:May 24th, 2020 - 03:45 pm
(Link)
ты на улицу гулять-то ходишь?
[User Picture]
From:[info]ketmar
Date:May 24th, 2020 - 04:23 pm
(Link)
(пожимает плечами) что я там не видел? с детства это занятие не люблю.