Советы по написанию транслятора.

 
RU Barmaglot #10.05.2005 14:10
+
-
edit
 

Barmaglot

новичок
Я вот тут писать ФОРТ собрался под x86 BSD и вот хочу спросить. Решил что лучше будет сделать в таком шитом коде: поскольку под 32 бит архитектуру и слова выравнивать на границу 4 байта надобно, то можно использовать младшие два бита адреса под свои нужды, конкретно можно младший битиспользовать как определение типа слова(машинное или в шитом коде), посему интепретатор шитого кода будет проще и шустрее. Или может лучше по-другому сделать как-то?
 
RU Balancer #10.05.2005 15:07  @Barmaglot#10.05.2005 14:10
+
-
edit
 

Balancer

администратор
★★★★☆
Barmaglot> Я вот тут писать ФОРТ собрался под x86 BSD и вот хочу спросить. Решил что лучше будет сделать в таком шитом коде: поскольку под 32 бит архитектуру и слова выравнивать на границу 4 байта надобно, то можно использовать младшие два бита адреса под свои нужды, конкретно можно младший битиспользовать как определение типа слова(машинное или в шитом коде), посему интепретатор шитого кода будет проще и шустрее. Или может лучше по-другому сделать как-то? [»]

Ты потеряешь в скорости на анализе этих бит. Высокоуровневые слова обычно определяются их обработчиком :) В форт-системе нет как атковой виртуальной машины. Каждое слово, завершая работу, само передаёт управление следующему. (NEXT)
 

Vale

Сальсолёт

>Я вот тут писать ФОРТ собрался под x86 BSD

А ты уверен, что это надо делать, вообще говоря? :)

См. FreshPorts — lang/forth

"Не следуй за большинством на зло, и не решай тяжбы, отступая по большинству от правды" (Исх. 23:2)  
+
-
edit
 

Balancer

администратор
★★★★☆
А если хочется руки приложить, то можно подключиться к проеку переложения SP-Forth под Linux и сделать такую штуку под BSD :)



SourceForge.net: Log In to SourceForge.net


SourceForge.net. Fast, secure and free downloads from the largest Open Source applications and software directory.

// sourceforge.net
 

http://wiki.forth.org.ru/SPF4%20%ED%E0%20Linux
 
RU Barmaglot #10.05.2005 16:23
+
-
edit
 

Barmaglot

новичок
Настолько ли сильная потеря? Анализ бита одна инструкция, переход на вариант машинное/немашинное и еще пара инструкций. Думается мне не так уж и много потеряю. 3-4 такта на машинное слово, 5-6 на обычное.
 
+
-
edit
 

Barmaglot

новичок
[quote|Vale, 10.05.2005 15:09:45:]
>Я вот тут писать ФОРТ собрался под x86 BSD

А ты уверен, что это надо делать, вообще говоря? :)

См. FreshPorts — lang/forth


[»]

[/quote]
Он на C писанный, соотвественно сильно теряет в скорости. И в ELF не сохраняет/компилирует.
 
RU Barmaglot #10.05.2005 16:32  @Balancer#10.05.2005 15:20
+
-
edit
 

Barmaglot

новичок
[quote|Balancer, 10.05.2005 15:20:30:]
А если хочется руки приложить, то можно подключиться к проеку переложения SP-Forth под Linux и сделать такую штуку под BSD :)



SourceForge.net: Log In to SourceForge.net


SourceForge.net. Fast, secure and free downloads from the largest Open Source applications and software directory.

// sourceforge.net
 

http://wiki.forth.org.ru/SPF4%20%ED%E0%20Linux

[»]

[/quote]
Я уже об этом подумал, дело в том, что написание 16-разрядного транслятора в дос заняло у меня около 2 недель. Совсем немного времени. Масса радостных эмоций.:) Мдя.:) Ну порадовал сам процесс, да и асм потом к нему приписал. Думается мне на разборки с исходными текстами spf4 уйдет больше времени. Хотя может и откажусь от своей первоначальной затеи. Потому и поспрошать решил сначала.:)
 

Vale

Сальсолёт

Написание- может быть и 2 недели. А отладка ;) ...
"Не следуй за большинством на зло, и не решай тяжбы, отступая по большинству от правды" (Исх. 23:2)  
RU Barmaglot #10.05.2005 18:17
+
-
edit
 

Barmaglot

новичок
Чего там отлаживать-то?:) Уже через две недели имел вполне рабочий форт. Ну может в каких-то малопользуемых словах и остались ошибки, но они все такие простые и отлаживались тут же, после написания. Вот ассемблер неделю писал, и потом еще дня три ловил баги. Ну ничего так, вполне все работало. Я ведь велосипед изобретал не только потому что не было никакого транслятора, но и потому что задачка несложная. 6 кб получился бинарник. Мало кода.

 
RU Balancer #10.05.2005 20:04  @Barmaglot#10.05.2005 16:23
+
-
edit
 

Balancer

администратор
★★★★☆
Barmaglot> Настолько ли сильная потеря? Анализ бита одна инструкция, переход на вариант машинное/немашинное и еще пара инструкций. Думается мне не так уж и много потеряю. 3-4 такта на машинное слово, 5-6 на обычное. [»]

А так ты вообще ничего не теряешь :D Ну не нужно на Форте знать какое это слово. Нужно знать только его CFA.
 
RU Barmaglot #10.05.2005 22:41
+
-
edit
 

Barmaglot

новичок
Ага. Ну тогда может пнешь в меня ссылкой на тему правильного построения трансляторов? Или может даже сам объяснишь?:) Я собственно именно за советом и пришел, пока еще не начал писать и не жалко отказываться от отдельных моментов затеи.:)

 
+
-
edit
 

Balancer

администратор
★★★★☆
При традиционном шитом коде в слова вписываются прямо адреса полей слов, откуда их нужно запускать (CFA - Code Field Address). Для низкоуровневых слов это прямо ссылки на их код, для высокоуровневых - ссылки на пролог (пролог может быть как общим, что несколько снижает скорость, так и у каждого слова свой, что потребляет немного лишней памяти). Код каждого слова заканчивается инструкцией "NEXT", передающей управление следующему слову.

Традиционно, один из регистров резервируется под указатель слов, WP (Word Pointer) и он постоянно, как и процессорный IP, указывает на адрес следующего слова. Но на x86 архитектуре (в отличие от всевозможных DEC/68K/ARM/MIPS и т.п.) из-за её бедности (нет автоинкрементов при косвенной адресации и т.п.) проще хранить адрес последнего выполненного слова. Тогда процедура NEXT обычно выглядит в таком духе:
code 6502acme
  1. ; NEXT
  2.     add eax, 4
  3.     jmp [eax]


Легко видеть, кстати, что в любой x86 системе такая конструкция по тактам занимает места меньше, чем call/ret. Так что на вызове низкоуровневых слов Форт с шитым кодом обходит обычные подпрограммные вызовы классических ЯВУ. Но вот когда дело доходит до вызова высокоуровневых слов - там нужно сохранить текущий WP на стеке возвратов, загрузить новый, а в конце - вернуть WP. Тут начинается некоторый проигрышь.
 

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