Непрерывная память в массивах Forth?

Я знаю, что variable test 5 cells allot не гарантирует выделение непрерывного блока памяти, в то время как create test 1 , 2 , 3 , 4 , 5 , обязательно создаст непрерывный блок памяти.

variable определяется как : variable create 0 , ;

allotДобавление большего количества ячеек к переменной не гарантирует непрерывного расширения блока памяти, потому что create можно вызывать только один раз для каждого слова?

Пример:

create test 1 , 2 , test 3 , 4 , 5 , ‹‹‹‹ Это не обязательно приведет к непрерывному расширению массива, верно?

Верны ли мои предположения?


person Byte    schedule 14.03.2016    source источник
comment
Из-за того, что вы используете тег gforth, неясно, относится ли ваш вопрос к Standard Forth или, точнее, к Gforth.   -  person Lars Brinkhoff    schedule 14.03.2016
comment
@LarsBrinkhoff Вопрос о стандартном Forth, я использовал только тег gforth, чтобы показать, какой Forth я использовал. Но я должен был просто написать, что использую gforth, не используя тег.   -  person Byte    schedule 15.03.2016
comment
В стандарте осторожно сказано, что ПЕРЕМЕННАЯ может быть где угодно, и нет гарантии, что ALLOT после нее будет выделять непрерывную память. Используйте CREATE, и убедитесь, что ничего не мешает перед выполнением ALLOT. То, что сегодня gforth делает это одним способом, ничего не значит, они вполне могут переосмыслить, как это работает завтра, тем более, если это повлияет на код, который стандарт считает незаконным или, по крайней мере, подозрительным для начала.   -  person vonbrand    schedule 08.05.2018


Ответы (1)


  • Формулировка стандарта дает VARIABLE и CREATE свободу размещать данные в разных областях памяти. Если да, то очевидно, что CREATE или ALLOT не могут расширить регион, созданный VARIABLE.

  • CREATE можно назвать много раз от любого слова.

  • Ваш пример может не совсем соответствовать тому, что вы думаете. Вторая строка вызывает test, оставляя его адрес в стеке. Затем он устанавливает три ячейки, которые расширяют область, выделенную для test.

  • Ваше предположение об определении VARIABLE неверно для всех реализаций.

person Lars Brinkhoff    schedule 14.03.2016
comment
Если я добавлю в словарь слово created, затем добавлю еще одно слово (например, test2), а затем попытаюсь расширить первое слово с помощью n1 , n2 ,, может быть, оно не будет непрерывным? Если это так, будет ли повторение массива с 1 cells +loop семантической ошибкой? - person Byte; 15.03.2016
comment
Нет, это не непрерывно из-за добавления нового определения. - person Lars Brinkhoff; 15.03.2016
comment
, — взять число из стека, поместить его в текущий адрес памяти пользовательских данных, затем увеличить текущий адрес пользовательских данных на размер адреса. Этот адрес обычно находится в переменной DP. Итак, определение может быть следующим: : , DP @ ! DP @ CELL+ DP ! ; - person VoidVolker; 18.03.2016