Потроха JBForth'а. (Чтобы не было так страшно)

 
+
-
edit
 

Balancer

администратор
★★★★★
В общем, создалось у меня впечатление, что некоторых разработчиков Форт отпугивает своей "непонятностью" там, где её на самом деле нет. Постараюсь рассмотреть реализацию JBForth на низком уровне без "ужасов высокоуровневой терминологии". Потом можете перекинуть это в Wiki или даже перевести на английский :)

Начнём с того, что у JBForth и нынешнего калькулятора статсов l2j - много общего в базовой реализации.

Основной цикл - сниятие из массива/списка очередного объекта и выполнение его метода.

Форт-слово представляет собой массив объектов - наследников Word. Каждое из которых имеет метод .exec(), который и выполняет нужные операции. Для низкоуровневых слов, написанных на Java, это непосредственный набор инструкций. Например, умножение:
code java
  1.     public class mul extends Word
  2.     {
  3.         public void exec(JBForth jbf)
  4.         {
  5.             jbf.st.set(jbf.st.pop_i() * jbf.st.top_i());
  6.         }
  7.     }


Здесь:
jbf - объект Форта, передаваемый выполняемому слову. Их может быть много - у каждого активного объекта игры, например.
jbf.st - стек Форта.
jbf.st.pop_i() - функция, снимающая и преобразующая к целому виду число со стека
jbf.st.top_i() - число на вершине стека, без снятия
jbf.st.set(N) - подменить число на вершине стека на N.

Как видим, всё просто.

При исполнении Форт берёт объекты Word из списка один за другим и делает exec(), пока список не кончится.

Слова высокого уровня содержат в себе пролог и список слов, который должен исполняться.

Трансляция исходного текста на Форте тоже очень примитивна.

Есть два режима трансляции - непосредственное исполнение и компилляция. Различает их Форт тупой булевой переменной.

Берём из входного потока слово, ограниченное пробелом. Пытаемся найти его в словаре (словарь - это хешмап, в котором по имени прописаны все объекты Word в системе). Не находим - пробуем рассмотреть его как число, как строку, как подгружаемый файл, если ничего не прошло - выдаём ошибку.

Если находим, то смотрим на наше состояние. Если режим исполнения - делаем WordHashMap<наше слово,Word>.exec().

Режим компилляции - добавлем этот объект в формирующийся список слов.

Всё.

Задавайте вопросы :)
 

Murkt

Pythoneer
★★★
Balancer>Задавайте вопросы
а почему всё так просто? :)))

всё равно меня его синтаксис немножко пугает. Посмотрим, может привыкну когда-нибудь.
[team Їжачки - сумні падлюки]  
+
-
edit
 

Balancer

администратор
★★★★★
Balancer>>Задавайте вопросы
Murkt> а почему всё так просто? :)))

А потому что транслятор Форта - самый простой из всех известных мне языков :D Я видел реализацию ядра Форта в 512 байт (на 8080).

Murkt> всё равно меня его синтаксис немножко пугает. Посмотрим, может привыкну когда-нибудь.

Он может пугать именно своей простотой :D Поскольку описывает строгую последовательность действий, практически никогда не забегая вперёд :) Взяли. Выполнили. Взяли. Выполнили. Непривычно для многих только условия пишутся, особенно с веткой "иначе". К потрохам это отношения не имеет, но примеры рассмотрю.

Обычный формат:
<что-то, что оставляет флаг> if <ветка условия> then
Т.е. по русски:
вода холодная если, нагреть её тогда. (здравствуй, магистр Йода! :D)

Вот ветка else подкачала. вводили её позже (на момент рождения Форта в других языках её тоже обычно не было :D), формат вышел:
условие if ветка_истины else ветка_лжи then

В общем, можно ввести алиас then == endif и писать так:
null? if new-list else old-list endif

:)
 

Murkt

Pythoneer
★★★
Ага! :) Вот как раз с условиями у меня было плохо.
[team Їжачки - сумні падлюки]  
+
-
edit
 

Balancer

администратор
★★★★★
Сейчас будет ещё проще.

На Форте есть служебное слово ?branch. Оно осуществляет переход по идущему за ним в коде(! - не в тексте) адресу, если на вершине стека 0 ("ложь").

Что делает слово if? Оно, при компилляции, вместо себя прописывает вышеупомянутое ?branch, оставляет место под адрес перехода, а на стек кладёт адрес этого места.

Дальше компилляция проходит как обычно.

Когда дело доходит до then, оно снимает со стека адрес для слова ?branch, оставленного словом if, и записывает туда текущий адрес. Больше оно ничего не делает.

Когда при исполнении дело дойдёт до ?branch, оно снимет со стека число, и если оно истинно, то ничего не сделает. То есть будет выполняться ветка if ... then. Если на стеке была ложь, то произойдёт переход по записанному адресу. А это, как мы помним, адрес, который оставляло слово then ;) То есть ветка условия будет пропущена.

Реализация else работает в таком же духе. Прописываем текущий адрес по адресу от if'а, вписываем безусловный переход (branch) по пока открытому адресу, оставляем этот адрес на стеке вместо того, что был от if. Когда дело дойдёт до then, оно даже знать не будет, что там было до него, и впишет свой адрес уже по адресу безусловного перехода в else ;)
 
+
-
edit
 

NewEviL

новичок
Можно сказать и не сюда...но я так уточнить..
code text
  1. : bypass_item
  2. item_add 555
  3. player@ level@ 40 < if

т.е. добавляется итем 555 если у игрока 40лвл...
если я в чём-то не прав,прошу уточнить именно в чём? ...и желательно почему?
 

Murkt

Pythoneer
★★★
ээээ... не прав во всём, от начала и до конца.
code text
  1. : bypass_item
  2.   player@ level@ 40 < if
  3.         1 555 items_add
  4.   then
  5. ;
[team Їжачки - сумні падлюки]  
+
-
edit
 

NewEviL

новичок
т.е.
code text
  1. : bypass_item
  2. player@ level@ 40 <if
  3.  1 555 items_add
  4. then

так условие должно быть первое...
не дописал кол-во...
а зачем then?
 

guwer

втянувшийся
Balancer> Когда дело доходит до then, оно снимает со стека адрес для слова ?branch, оставленного словом if, и записывает туда текущий адрес. Больше оно ничего не делает.

Выше почитай короче ^^^^^^^^^^^^^^^^^^^^
ИМХО С уважением Guwer.  
+
-
edit
 

MadDed

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



Занялся Фортом... Полон впечатлений!!!
Поразиительно.. в форте не бывает синтаксических ошибок :]
Никогда бы не подумал, что такое возможно... :]
 
+
-
edit
 

Balancer

администратор
★★★★★
MadDed> Поразиительно.. в форте не бывает синтаксических ошибок :]

Как это не бывает? Напиши SscvSDCSD и получишь ошибку на неизвестное слово :D
 
+
-
edit
 

MadDed

новичок
Но это же не "синтаксическая" ошибка... ;]
 

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru