2-space abuse-like lisp for nothing |
[Jun. 10th, 2017|10:03 pm] |
чисто для смеху. ну ладно, для Секретной Цели, но будем считать, что для смеху.
специфика в том, что двигатель заточен на нечто типа гейм-скриптов, которые быстренько выполнились и отвалились. то есть, не шибко большие, и уж точно не очень долго исполняющиеся. поэтому имеет два хранилища: «постоянное» и «временное». все выделения памяти идут во временном, а после выполнения eval() оно нафиг очищается.
ну ладно, не совсем: сначала выполняется хитрая штука, называемая `fixBrokenHearts()` (терминология спизжена просто так). что она делает? очень просто: каждый раз, когда car/cdr из постоянного хранилища присваивается временная ячейка (или символу), модифицированная постоянная ячейка тупо заносится в «список разбитых сердец». список, понятно, простейший односвязный, проверка на дубликаты O(1) (а хуле там поле next проверить? я только про правильный sentinel сначала забыл; бывает).
так вот. потом этот список усердно проходится, и если в постоянной ячейке находится ссылка на временную, то создаётся новая постоянная ячейка, в неё копируется значение временной, и: новая постоянная добавляется в список для обработки прям сейчас (рекурсия без рекурсии и расхода стека, ага), а временная заменяется на разбитое сердце со ссылкой на новую (таким образом корректно обрабатывается ситуация, когда на одну временную ячейку есть много ссылок — очевидным образом).
конечно, в постоянном пространстве постепенно накапливается мусор, но весьма медленно. в том числе за счёт того, что для значений используется nan-boxing, и ячейки имён символов сразу создаются в постоянном пространстве. внешние entities, понятно, имеют поля, значения которых тоже перетаскиваются в постоянное пространство. однако irl они очень редко будут содержать списки, особенно активно меняющиеся. в основном если и есть список, то его раз создают, и потом откусывают головы — или что-то в этом роде.
в общем, когда глобальное хранилище вырастает до неприличных размеров, то возможны occasional GC spikes, конечно. или для патологических случаев, когда идиоты на каждом кадре пердолят в глобалы новые списки (используйте массивы, йопта — они там специально для этого! и эмулируют структуры!) — будут танцы с GC. меня такой расклад устраивает.
конечно, особых оптимизаций по скорости там нет — это специально. ну, может потом схемоподобный байткод сделаю.
потратил на написание всё вчера, если что. |
|
|