185 похожих чатов

Локальные переменные иртерпретаторы же чаще всего в стеке хранят? А

как они работают с замыканиями, просто копируют все переменные в объект замыкания что-ли?

20 ответов

16 просмотров

Так или иначе, утаскивают замыкаемые переменные в кучу. Детали зависят от того, делается ли замыкание по ссылке или по значению.

Если замыкание нисходящее, можно просто сослаться на кадр стека, как в ISO Pascal и Аде

卜根
Если замыкание нисходящее, можно просто сослаться ...

Но тогда надо следить, чтобы эти замыкания не утекали наверх

Антон 🇦🇲
Но тогда надо следить, чтобы эти замыкания не утек...

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

.- Автор вопроса

Ну вот есть у меня что-то вроде Vec<(&str, Value)> и в данный момент интерпретатор столкнулся с замыканием, какие дальнейшие действия приблизительные? Как интерпретатору узнать какие переменные будут захвачены? Разве что смотреть идентификаторы в теле в момент объявления, но выглядит как-то муторно. Или просто скопировать все локальные переменные в этот момент. Язык - небольшое подмножество лиспа

.
Ну вот есть у меня что-то вроде Vec<(&str, Value)>...

Дальнейшие действия — добавить соответствующее поле в структуру замыкания и подставить это поле на место переменной. К концу компиляции тела функции у вас будет собрана вся структура замыкаемых переменных. Тащить весь стековый кадр в кучу — это анахронизм из очень древних Лиспов. Не стоит так делать сейчас.

.- Автор вопроса
Vasiliy Tereshkov
Дальнейшие действия — добавить соответствующее пол...

>> К концу компиляции тела функции Я про интерпрететор изначально спрашивал Лисп интерпретатор это просто символьные выражения по сути. Лямбды прикручены уже сбоку, я пока что думал хранить их в окружении как sexp аргументы . тело. Но как вижу сейчас этого не достаточно, потому что нужно ещё окружение запомнить

.- Автор вопроса
.
Ну вот есть у меня что-то вроде Vec<(&str, Value)>...

@vtereshkov Может нужно рекурсивно просмотреть тело функции и при встрече идентификатора проверять, что его нет в аргументах? Так?

Чаще всего интерпретаторы хранят локальные переменные (точнее, объекты, на которые локальные переменные указывают) на куче, и при этом собирают их GC — чтобы их "замкнуть" достаточно просто сделать ссылки на те же объекты изнутри самого замыкания (которое тоже структура на куче, из которой идут ссылки на функцию и замкнутые переменные).

.- Автор вопроса
Alexander Chichigin
Чаще всего интерпретаторы хранят локальные перемен...

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

.
А как это будет в раст выглядеть? Vec или HashMap ...

> А как это будет в раст выглядеть? Rc<Value> или как-то так. > как определить какие переменные нужно замкнуть К которым идёт обращение в теле функции — те и замыкаем.

.- Автор вопроса

Vec<Rc<Value>> выходит? > К которым идёт обращение в теле функции. Перед тем как добавить "объект функции" с с-выражением, которое является телом пройтись просто по нему и посмотреть какие встречаются идентификаторы?

.
Vec<Rc<Value>> выходит? > К которым идёт обращение...

А Вы свой Lisp не парсите, что ли? Пытаетесь интерпретировать строчка за строчкой? Думаю, с Lisp так не выйдет. В любом случае строить AST и tree-walking interpreter — это минимум. А при наличии AST — какие проблемы по нему пройти лишний раз? Есть подозрение, что таблицу символов можно построить одновременно с самим AST.

.- Автор вопроса
Alexander Chichigin
А Вы свой Lisp не парсите, что ли? Пытаетесь интер...

Парсим конечно. Просто я почему-то думал, что ещё раз пройтись действительно лишнее действие:) > AST tree-walking interpreter минимум. А почему минимум, разве иртерпретаторы комона или схемы, да впринципе лиспов не ограничиваются tree-walking interpreter, там же синтаксис очень простой, я даже слышал мнение, что парсинг можно вообще не отделять никак. > Таблица символов одновременно с AST. Опять же, разве ее используют в подобных интерпретаторах? Мне казалось это гораздо ближе к компиляции

.
Парсим конечно. Просто я почему-то думал, что ещё ...

> А почему минимум, разве иртерпретаторы комона или схемы, да впринципе лиспов не ограничиваются tree-walking interpreter Потому что медленее — только построчная интерпретация. Не ограничиваются, конечно — любой пристойный интерпретатор сначала компилирует в байт-код. Промышленные "интерпретаторы" Common Lisp/Scheme и других — компилируют в машинный код. > Мне казалось это гораздо ближе к компиляции Так называемый "environment", который у Вас (был) Vec<&str, Value> — это то же самое, что таблица символов. Плюс-минус нюансы.

.- Автор вопроса
Alexander Chichigin
> А почему минимум, разве иртерпретаторы комона ил...

Подождите, но разве компиляция в машинный код это не компилятор?

.
Подождите, но разве компиляция в машинный код это ...

Если компиляция в байт-код считается интерпретацией — то почему нет? 😂

.- Автор вопроса
Alexander Chichigin
Если компиляция в байт-код считается интерпретацие...

Ну, не знаю, меня тоже компиляция в байткод как-то смущала в процессе интерпретации

.
Ну, не знаю, меня тоже компиляция в байткод как-то...

это всё условности, главное - результат

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта