всё поломал! |
[May. 21st, 2020|11:31 am] |
переделываю scope management в вавумцэ. поскольку в языке строки всегда динамические, и есть динамические массивы, то по выходу из функции локалы с такой фигнёй надо чистить. янис, естественно, это предусмотрел, но методом несколько упрощённым: не парясь скопами просто деструктить всё, что в этом нуждается, перед `return`.
в принципе, решение рабочее, но в нём есть очевидные черви. во-первых, это сильно усложняет повтороное использование стековых слотов: фактически, локал живёт всю функцию, даже если используется один раз где-то глубоко внутри кода. во-вторых, некоторые штуки типа «scripted foreach» (который вызывает для итерации другие методы на вавумцэ) хочет после этого цикла вызвать метод «done» (в том числе и если из цикла вышли по `break`) для всяческой очистки, например. в третьих, мне захотелось привинтить к структурам деструкторы, потому что почему нет. и вот тут схема дала сбой.
проблему со «scripted foreach» я решил адовым хаком с введением особых «финализаторов», ручной регистрацией их в общем контексте кодогена и прочей грязью. при том, что у нас уже есть совершенно очевидный scope list: AST-ноды рекурсивно вызывают кодоген для своих детей же. так что всего и надо — поддерживать аплинк, и у нас есть zero-effort current scope list.
далее в каждую ноду-оператор просто добавляются методы «сгенерить деструкторы» и «сгенерить финализаторы». первая вызывается перед выходом из скопа, вторая после. в большинстве нод эти методы делают ничего, а в некоторых — нужный код. фаза семантического анализа переписывает дерево так, что каждое создание локала делает новый скоп, так что как-то специально трекать локалы не надо, они после такого переписывания отлично ложатся в общую канву. `break`, `continue` и `return` очевидно просто идут по аплинкам, вызывая методы генерации деструкторов и финализаторов. всё, никакого специального менеджмента, и заодно контекст кодогенерации больше не обязан знать о том, как там операторы чем управляют.
в общем, за два дня более-менее переписал, теперь ловлю блох. в частности, дерево именно операторов нифига не было сделано с возможностью влёгкую его переписать, особенно если по пути могут возникнуть новые scopes. пока что думаю, как сделать это покрасивей, и по дороге ловлю баги от ошибок в переписывании, лол.
короче, мы старый мир разрушим, а потом… как-нибудь. но новый дизайн однозначно красивей и логичней, так что оно того стоит. |
|
|
Comments: |
From: | (Anonymous) |
Date: | May 21st, 2020 - 11:45 am |
---|
| | | (Link) |
|
в конструктивном алгоритмическом мире функция это зло. пиши без функций особенно там где нужна производительность во фрейме например
спасибо, твоё мнение охуительно ценно для 3+ мегабайт легаси кода. приходи когда перепишешь его весь правильно.
From: | (Anonymous) |
Date: | May 21st, 2020 - 01:15 pm |
---|
| | | (Link) |
|
как показывает практика, пусе нассать в башку большо ума не надо. больше алгоритмизации, ещё больше. учитывая, что в процессор после всей это тряхомудии улетают конструкции вроде гото1 говорит о многом
убей себя, пожалуйста, ты тупое говно.
From: | (Anonymous) |
Date: | May 21st, 2020 - 07:52 pm |
---|
| | | (Link) |
|
> пиши без функций А как это? Покажи пример.
From: | (Anonymous) |
Date: | May 21st, 2020 - 01:57 pm |
---|
| | | (Link) |
|
убился, спасибо!
From: | (Anonymous) |
Date: | May 24th, 2020 - 03:45 pm |
---|
| | | (Link) |
|
ты на улицу гулять-то ходишь?
(пожимает плечами) что я там не видел? с детства это занятие не люблю. | |