Веб-версияОткрыть в Telegram

ВеткаБеда подкралась откуда не ждали :)

3 сообщения · –
R
Беда подкралась откуда не ждали :) Итак, у меня есть несколько стеков: - data - return - возможно locals - catch/throw - ... Форт-система кооперативная многозадачная, с переключением в NEXT Memory Regions под стеки выделяются динамически так как fibers появляются и исчезают в процессе работы системы. Освобожденные регионы переиспользуются. Я бы хотел при переключении наблюдать состояния стеков. Когда я вижу что стек близок к исчерпанию, я бы хотел переносить стек в более большой Memory Region. Но (как минимум) data и return стеки могут хранить указатели, которые никак нельзя отличать от integers. А еще есть же absolute address, execution token... Допустим, я типизирую все значения, путем теггирования (что замедлит работу из-за битовых операций) или путем паралельного Shadow Stack с типами (что увеличит вдвое расходуемую под стеки память). Технически это дает возможность пересчитывать те указатели, которые не relative и двигать стеки куда мне захочется? Или есть какие-то подводные камни, которые я не учитываю? Go runtime (по мнению ИИ, подкрепленном ссылками, которые я не проверял) действительно копирует растущие стеки goroutine, затем отдельно корректирует контекст, defer/panic-структуры и указатели внутри кадров по точным pointer maps - то есть это как минимум возможно Я пока вижу вариант сохранять все такие указатели как специальное значение (-2 например, чтобы не путать с FALSE), которое говорит о том, что нужно сходить в отдельную таблицу, ключом в которой является адрес ячейки стека, а значением - что-то относительное, что позволит получить доступ к самому значению. И это относительное будет переписываться при всех перемещениях стеков и других Memory Region-ов (словарей?) относительно друг друга. Получается примерно тот же коленкор что мы обсуждали про объекты, управляемые gc..
  1. R
    Наверное, имеется ввиду переполнение, а не исчерпание. Стек (с содержимым) можно перенести в другую область памяти, если нету ссылок на ячейки стека через их абсолютный адрес. А стек локальных переменных вообще не обязательно переносить. Его можно сделать просто связным списком фреймов. Стандартные программы не могут получать адреса ячеек стека. Адреса ячеек стеков обычно используются в реализации исключений. Но, вместо адреса вершины можно запоминать текущую глубину стека. Или, корректировать адреса, т.к. список фреймов исключений известен. Иногда адрес ячейки стека данных (или стека возвратов) передается параметром (например, при вызове внешних функций). Тут можно использовать адрес из фрейма локальных переменных, который остается постоянным (т.к. фрейм мы не переносим). Но (как минимум) data и return стеки могут хранить указатели, которые никак нельзя отличать от integers. А еще есть же absolute address, execution token... Это не мешает переносить стек в другую область памяти. Главное, чтобы в неизвестных местах не хранились ссылки на сами ячейки стека. #forth #implementation
  2. R
    Ссылка
    нажмите — покажем
    https://t.me/ruforth/18902/19331 ☝️ Тегировать адреса можно одним битом. Shadow stack имеет смысл, если мы хотим динамически проверять согласования типов данных, а не только отличать адреса от других значений. Но это тянет за собой и shadow memory. https://t.me/ruforth/11687/18084 #forth #typesystem #technique
[[NF] Forth-like languages, язык Форт[NF] Forth-like languages, язык Форт@forthchat · группа · Технологии
59участников2 476сообщений в индексе
Лента площадки Открыть в Telegram

Открытая публичная лента из поискового индекса ChatCrawler — «Google по публичному Telegram»; обновляется по мере обхода площадки. Время — UTC.

Только публичный контент, официальный API Telegram. О проекте · Вопросы · Чего мы не делаем · Убрать страницу из выдачи · Каталог · Поиск · Как мы считаем