Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 14:32

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: вопрос к FAQ - слово create
СообщениеДобавлено: Сб июл 08, 2006 14:14 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Что это слово на самом деле делает? Где физически в памяти что появляется или исчезает?
Чем это удовольствие отличается от обычного макроса в ассемблере или определения через двоеточие?

Вопросы туповаты, но лучше спросить так.

Ещё: конструкция create - does в определениях ЧЕРЕЗ ':', что это такое?
это то же create и отличается только роль?

Вoт чем отличается
VARIABLE BLOCK-OF-MEMORY HERE BLOCK-OF-MEMORY ! 100 ALLOT

ОТ

CREATE BLOCK-OF-MEMORY 100 ALLOT


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб июл 08, 2006 14:22 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
CREATE создает новое слово с действием "положить на стек первый свободный адрес (на момент создания этого слова)". DOES> позволяет потом с этим адресом сделать что-то еще. variable определяется следующим образом
: VARIABLE CREATE 4 ALLOT DOES> ;
То есть если первый свободный адрес 124, то VARIABLE A создает слово A, которое при исполнении положит на стек 124. Если потом вызвать VARIABLE B, то B будет класть уже 128 (указатель переместился).


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб июл 08, 2006 14:40 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Слово CREATE создает "голую" словарную статью, т.е. поле имени, поле связи, поле кода, но без самого кода.

Слово VARIABLE создает поле имени, поле связи, поле кода (указывающее на исполняемую часть для VARIABLE,
которая формально ничего и не делает) и сам код - точнеем место под переменную, которое может инициализироваться нулем, например, а может и никак не инициализироваться, тогда в переменную при создании попадает то, что было в том месте памяти, на котором оказался "код переменной". В другой реализации может быть и что-то иное, но суть та же.

VARIABLE можно определить через CREATE вот так:

Код:
: VARIABLE CREATE 0 , ;


или так:

Код:
: VARIABLE CREATE 2 ALLOT ;


Последний вариант четко указывает, что переменная двухбайтовая.

Код:
VARIABLE BLOCK-OF-MEMORY HERE BLOCK-OF-MEMORY ! 100 ALLOT


Вот такая конструкция - создаст отдельную переменную, зарезервирует место на вершине кодофайла и оставит на стеке адрес зарезервированного места. Чтобы связать BLOCK-OF-MEMORY с зарезервированным блоком, после данной последовательности надо выполнить
Код:
BLOCK-OF-MEMORY !

Коммент, сделанный позже: Тут я проглючил, это присвоение есть в исходной строчке

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

Надо заметить, что в "обычной разлизации" зарезервированная область скорее всего, окажется сразу за кодом созданной ранее переменной, но рассчитывать на это НЕЛЬЗЯ, потому что в иной реализации это может оказаться не так!

Второй вариант:
Код:
CREATE BLOCK-OF-MEMORY 100 ALLOT


Здесь "классически создается массив".
Зарезервированная область сразу же оказывается в поле кода слова BLOCK-OF-MEMORY, поэтому, его исполнение сразу же положит на стек адрес массива. В первом случае после придется еще и @ делать.

P.S. Под "обычной" реализацией, я понимаю реализацию подобную той, что описана в книге Баранова и Ноздрунова "Язык форт и его реализации".

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Последний раз редактировалось WingLion Вс июл 09, 2006 01:24, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс июл 09, 2006 01:15 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Можно и я тут приложусь?)
вопрос писал(а):
Что это слово на самом деле делает? Где физически в памяти что появляется или исчезает?
Чем это удовольствие отличается от обычного макроса в ассемблере или определения через двоеточие?


Нужно понимать, что в форте все основано на одном единственном понятии, которое называют по-разному: определение\слово\словарная статья,,,

Это даже проще, чем обьект ;) И все в форте сводится к двум фундаментальным вещам: стекам (их в форте оочень много) и словам. Обо всем остальном можно забыть, так как это уже детали реализации в частности и постфиксная запись.

Так что от макросов в форте любое слово отличается тем что оно исполняется!!!
Оно в любом случае знает, что нужно делать! Насчет определения через двоеточие можно сказать, что ничем не отличается. По крайней мере можно сделать и так:

: address [ HERE 5+ ] LITERAL ;
константа за HERE для разных систем будет различна - ее надо вычислять.

Теперь. Память используемая форт системой - это тоже стек ;) только он растет вверх а не вниз.
Есть указатель DP который хранит адрес первой свободной ячейки непрерывного пространства памяти, при создании и сборке слов этот указатель растет( соответственно вверх). Его можно увеличивать и уменьшать в ручную с помощью слова ALLOT. А слово HERE - выкладывает значение DP. Так что память можно выделять даже внутри определения
: test 0 IF [ HERE 200 ALLOT ] THEN LITERAL ;
вы получите слово содержащее внутри себя массив из 200 зарезервированных байт. Причем конструкция 0 IF --THEN нужна только для того, чтобы обойти этот массив во время исполнения .)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср май 21, 2008 15:28 
Один из примеров по использованию слова CREATE

Код:
234 CONSTANT set0

: Data
  CREATE
   [CHAR] ; PARSE 
  EVALUATE , ,  #TIB @ >IN ! DOES> 2@ 
;
Data Var1   123   set0 ; данные первой переменной   
Data Var22  set0  set0 ; данные второй переменной

Var1  . . CR  \ отображение в обратном порядке
Var22 . . CR   



P.S. Можно отнести к полезным определениям:)


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср май 21, 2008 18:17 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Как это сделано в СПФ

CREATE ADDR

Слово CREATE как и любое другое слово входного потока
обрабатывается транслятором.
Слово CREATE скомпилировано в словарь сл. образом
: CREATE PARSE-NAME CREATED ;
поэтому исполнение кода CREATE начнется с выполнения кода
слова PARSE-NAME, исполнение которого состоит в том, что
из входного потока(первоначально входной поток это файл или буфер консоли,
потом часть его помещается в буфер разбора) выделяется следующая за CREATE лексема
(в данном случае это ADDR), при этом на стек параметров форт-системы
кладутся сначала адрес первого символа ADDR в буфере разбора, затем
количество символов в лексеме ADDR, затем начинает работать код слова CREATED,
который забирает со стека параметров адрес и длину и формирует
словарную статью для будущего слова ADDR, при этом в поле кода этой статьи
формируется код, который положит при его последующем исполнении первый свободный адрес кодофайла
после последнего адреса исполняемого кода словарной статьи слова ADDR.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср май 21, 2008 20:40 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Нужно бы составить перечень вопросов для этого FAQ ...

_________________
понимаю некоторую бестолковость некоторых вопросов


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт май 22, 2008 07:05 
Небольшая правка примера для слова CREATE

Код:
234 CONSTANT set0

: Data
  CREATE
   [CHAR] ; PARSE 
  EVALUATE , ,  POSTPONE \ DOES> 2@ 
;
Data Var1   123   set0 ; данные первой переменной   
Data Var22  set0  set0 ; данные второй переменной

Var1  . . CR  \ отображение в обратном порядке
Var22 . . CR   



Вернуться к началу
  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB