Фундаментальный вопрос, возможно, не был получен таким образом, как этого требовал бы новый пользователь Forth, поэтому я попробую.
Память в Forth может зависеть от цели, поэтому я ограничу описаниев простейшей модели - это плоское пространство памяти, в котором код и данные счастливо живут вместе.(в отличие от моделей с сегментированной памятью или флэш-памяти для кода и ОЗУ для данных или других более сложных моделей)
Словарь обычно начинается в нижней части памяти и выделяется системой Forth вверх.Два стека в простой системе должны существовать в старшей памяти и обычно иметь два регистра ЦП, указывающие на них.(Очень зависит от системы)
На самом фундаментальном уровне память выделяется просто путем изменения значения переменной указателя словаря.(иногда называемый DP)
Программист обычно не обращается к этой переменной напрямую, а использует некоторые слова более высокого уровня для управления ею.
Как уже упоминалось, слово Forth 'HERE' возвращает следующий доступный адресв словарном пространстве.Что не было упомянуто, так это то, что ЗДЕСЬ определяется путем извлечения значения переменной DP.(системная зависимость здесь, но полезно для описания)
В Forth 'ЗДЕСЬ' может выглядеть так:
: ЗДЕСЬ (- addr) DP @;
Вот и все.
Чтобы выделить немного памяти, нам нужно переместиться ЗДЕСЬ вверх и сделать это словом «ALLOT».
Определение Forth для «ALLOT» просто берет число из стека параметров идобавляет его к значению в DP.Так что это не более чем:
: ALLOT (n -) DP +!;\ '+!'добавляет n к переменной содержимого DP
ALLOT используется системой FORTH, когда мы создаем новое определение, чтобы то, что мы создали, было безопасно в памяти «ALLOTed».
То, что не сразу очевидно, это то, что ALLOT может принимать отрицательное число, поэтому можно перемещать указатель словаря вверх или вниз.Таким образом, вы могли бы выделить немного памяти и вернуть ее так:
HEX 100 ALLOT
И освободить ее так:
HEX -100 ALLOT
Все это говорит о том, что это самая простая форма управления памятью в системе Forth.Пример того, как это используется, можно увидеть в определении слова «BUFFER:»
: BUFFER: (n -) CREATE ALLOT;
'BUFFER:' 'создает' новое имя в словаре (кстати, create использует allot, чтобы освободить место для имени), затем ALLOTs n байтов памяти сразу после имени и любых связанных служебных байтов вашего Forthсистема может использовать
Так что теперь, чтобы выделить блок именованной памяти, мы просто набираем:
MARKER FOO \ отметьте, где память заканчивается прямо сейчас
HEX 2000 BUFFER: IN_BUFFER
Теперь у нас есть 8-байтовый буфер под названием IN_BUFFER.Если бы вы захотели освободить это место в стандарте Forth, мы могли бы напечатать 'FOO', и все, что выделено в Словаре после FOO, будет удалено из системы Forth.
Но если вам нужно временное пространство памяти, ВСЕ выше 'ЗДЕСЬ'можно использовать бесплатно!
Таким образом, вы можете просто указать адрес и использовать его, если вам это нравится
: MYMEMORY здесь 200+;\ MYMEMORY указывает на нераспределенную память выше ЗДЕСЬ
\ MYMEMORY moves with HERE. be aware.
MYMEMORY HEX 1000 ERASE \ заполнить ее нулевыми 2 КБ
Forth обычно используется для высокопроизводительных встроенных приложений, где динамическая памятьВыделение может вызывать ненадежный код, поэтому статическое распределение с использованием ALLOT было предпочтительным.Однако большие системы имеют кучу и используют ALLOCATE, FREE и RESIZE так же, как мы используем malloc и т. Д. В C.
BF