Skip to content

QLISP v2.7.4 — память: эвикция пула, cons-блоки, guard глубины

Choose a tag to compare

@FQingLars FQingLars released this 27 Sep 16:16
· 5 commits to main since this release

QLISP 2.7.4 — Release Notes

Тег: v2.7.4 · Платформы: Linux x86_64, Windows x86_64
Бинарники — сборка CI (Linux: GCC/Ninja/OpenBLAS/OpenMP; Windows: MSYS2 MinGW64), коммит 5e054ca ветки main компиляторного репозитория (CI run 36332096385, зелёный). Состав: qlisp (REPL/интерпретатор + JIT), qlisp-lsp, qvalent.

Файл Платформа Состав
qlisp-linux-x86_64 Linux x86_64 REPL/интерпретатор + JIT
qlisp-lsp-linux-x86_64 Linux x86_64 Language Server
qvalent-linux-x86_64 Linux x86_64 пакетный менеджер
qlisp-windows-x86_64.zip Windows x86_64 qlisp.exe, qlisp-lsp.exe, qvalent.exe

SHA256SUMS — контрольные суммы всех файлов.

Что нового — память под давлением

Пул тензоров: эвикция

  • Дефолтный лимит пула буферов 1 ГБ → 256 МБ; при промахе точного размера на 3/4 лимита эвиктируется крупнейшая корзина free-list. Production-check: 120k тензоров разных размеров — плато RSS 1.13 ГБ (при нулевых живых данных) → пик 52 МБ.

ConsCellPool: мелкие блоки

  • Блоки 1 М ячеек (24 МБ) → 64k ячеек (1.5 МБ) — ретеншн пика ограничен, ОС отдаёт блоки естественно. 20k cons setq: пик 34.7 МБ (без регресса против 2.7.3).

Guard глубины рекурсии

  • Лимит 10 000 eval-кадров (~3 400 QLisp-кадров; 8 МБ стек физически падает на ~12 000). Превышение — ловимая ошибка: eval: recursion depth exceeded 10000 (raise the limit with EVAL-MAX-DEPTH).
  • (EVAL-MAX-DEPTH n) поднимает лимит и возвращает старый, (EVAL-MAX-DEPTH) читает; счётчик RAII — после пойманной ошибки eval полностью жив. Windows-бинарник резервирует 8 МБ стека (-Wl,--stack=0x800000); безопасный потолок ручного лимита ~11 000.

Итеративное ядро

  • equal по cdr-цепочкам и stdlib length/reverse/member/last/butlast/nth переписаны итеративно — рекурсивный length сжигал кадр на элемент и упирался бы в guard на списках ~3.5k+.

Попутно исправлено

  • Вложенный while стирал записи loop_setq_ внешних циклов (zombie-nullptr → SIGSEGV); finish_loop_bindings(base) продвигает и обрезает только свои записи.
  • Sandbox alloc-бюджет теперь считает кумулятивно (cells_allocated_total()): не откатывается restore'ом while, циклы ловятся.

Тесты: 67 сюит зелёных; новый tests/memory_pools.qlsp (7). Регресс 75/75.