Здравствуйте, гость ( Вход | Регистрация )
05 Jun 2010, 13:06
(Сообщение отредактировал tolich - 04 Jul 2020, 13:40)
Сообщение
#1
|
|
![]() 😸🧡✊✌️ Сообщений: 16 555 Спасибо сказали: 3519 раз |
Более полной документацией озабочусь позднее, пока только основные фишки:
1) Forth-подобный синтаксис. (Хотя это не совсем Forth...) 2) Компилятор на Refer, входит в поставку. 3) Только COM-файлы, никаких библиотек поддержки. Скачать 1.06 -------------------- Я слежу за тобой!
tolic.narod.ru![]() Цитата Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел. Борис "Бонус" Репетур, "От винта!", выпуск 38. |
|
|
|
![]() |
02 Jun 2012, 12:40
Сообщение
#2
|
|
![]() 😸🧡✊✌️ Сообщений: 16 555 Спасибо сказали: 3519 раз |
Прямой шитый код и типы слов
В реализации применён прямой шитый код. Причём текущий указатель интерпретации хранится в DS:SI, вершина стека данных в SS:SP, а вершина стека возврата в SS:BP. Что это означает? Пользовательские низкоуровневые определения представляют собой обычный машинный код, который заканчивается, правда, не инстукцией ret, а трёхбайтовой последовательностью lodsw jmp ax (которая сокращённо записывается, как next). Тем самым осуществляется переход к интерпретации очередной ссылке в последовательности ссылок. В дальнейшем я не буду упоминать, что низкоуровневое слово выполняет последовательность next, так как бесполезно писать про каждую подпрограмму, что она заканчивается оператором возврата. Высокоуровневые определения начинаются с команды call перехода к подпрограмме интерпретатора. Это команда, кроме собственно перехода, кладёт в стек SS:SP "адрес возврата", который в нашем случае не используется для возврата, а является адресом поля параметров высокоуровнего определения. Инетерпретатор получает адрес поля параметров на вершине стека и обрабатывает его способом, свойственным для слов данного типа. Например, подпрограммы в шитом коде также используют интерпретатор 'call', который кладёт текущее значение указателя интерпретации (только SI, конечно) на стек возврата, а затем снимает новое значение этого указателя со стека данных. Слова пользовательского типа могут использовать в качестве интерпретатора произвольное пользовательское слово, которое, в свою очередь, может быть как низкоуровневым, вроде 'call', так и высокоуровневым, определённым в шитом коде, или даже словом пользовательсвкого типа! Как же писать эти подпрограммы, спросите вы. Низкоуровневые определения Низкоуровневые определения начинаются со слова create-item, за которым следуют операторы компиляции машинного кода. Ничего фантастического тут нет. Код create-item nop $FFAD , $E0 c, Впрочем, для использования более комфортного ассемблера существуют слова start-code и end-code, первое переходит refer в режим ассемблера, второе обратно в режим интерпретатора. А для еще более комфортной работы существует слово code, которое создаёт метку с помощью create-item, а затем переходит в режим ассемблера с помощью start-code. Тот же пример: Код code nop next end-code Этот пример нужен прежде всего, чтобы показать, что end-code не завершает определение слова, оно только выключает режим ассемблера, не существует никаких способов определить, где заканчивается определение в машинном коде, где завершится выполнение, не анализируя сам код. Высокоуровневые слова Слово type служит для определения пользовательского типа слов. Перед определением собственно типа необходимо определить макрос, который осуществляет инициализацию поля параметров слова, а также пользовательское слово-интерпретатор. После этого требуется написать что-то вроде: Код type имятипа компилятор интерпретатор После этого употребление слова имятипа в контексте Код имятипа новое-слово будет приводить к определению нового слова новое-слово пользовательского типа имятипа.Пример определения: Код type create nop nop В данном примере определяется некий тип create, который в качестве компилятора использует слово nop, которое ничего не делает во время компиляции, а в качестве интерпретатора — пользовательское слово nop (определённое в предыдущем пункте), которое тоже ничего не делает, но уже на этапе исполнения готовой программы. Слово create определяет пользовательские слова, которые в момент исполнения кладут на стек адрес своего поля параметров и больше ничего не делают. Конечно, чтобы от этого слова был толк, необходимо некоторое расширение, например:Код macro variable create 0 , endm Слово variable не только определяет пользовательское слово с указанной семантикой, но и добавляет в поле параметров небольшой буфер, в которм можно хранить текущее значение переменной, получать его словом @ и менять словом !.Шитый код Слово в шитом коде это тоже высокоуровневое слово. В компиляторе refer оно определено так: Код code call Слово : начинает определение высокоуровневой подпрограммы в шитом коде, для чего переходит в режим компиляции словом ]. Для того, чтобы вернуться в режим интерпретации, необходимо воспользоваться словом [.dec bp dec bp mov 0 [bp] si pop si next end-code type : ] call Кроме способа перейти к вложенному определению через двоеточие у нас должен быть механизм возврата к шитому коду, вызвавшему данный. Для этого существует слово exit: Код code exit Для того, чтобы не приходилось постоянно писать exit [, можно написать простой макрос:mov si 0 [bp] inc bp inc bp next end-code Код current compilers macro ; exit [ endm current interpret Теперь можно со спокойной совестью написать: Код : do-nothing ; Оно является высокоуровневым аналогом ранее определённого слова nop.to be continued... -------------------- Я слежу за тобой!
tolic.narod.ru![]() Цитата Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел. Борис "Бонус" Репетур, "От винта!", выпуск 38. |
|
|
|
10 May 2020, 13:43
Сообщение
#3
|
|
![]() 😸🧡✊✌️ Сообщений: 16 555 Спасибо сказали: 3519 раз |
Слово type служит для определения пользовательского типа слов. Больше не служит. Теперь оно, как ему и положено по FORTH-стандартам, снимает со стека адрес и длину строки и печатает её. То, что раньше называлось type, теперь называется typedef. Впрочем, использование тоже изменилось. Всё так же необходимо определить макрос, который осуществляет инициализацию поля параметров слова, а также пользовательское слово-интерпретатор. Но вызов выглядит так:Код ' интерпретатор typedef имятипа компилятор Примеры использования:Код ' nop typedef create nop Код ' call typedef : ] Суть определения не изменилась.Заодно поправил обработку макросов: 1) Макрос не может содержать слово macro в своём теле. 2) Если макрос не закончен словом endm, компилятор больше не зависает. Кроме того, пустой результат больше не сохраняется в файл. Новую версию выложил на ЯД (первый пост). -------------------- Я слежу за тобой!
tolic.narod.ru![]() Цитата Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел. Борис "Бонус" Репетур, "От винта!", выпуск 38. |
|
|
|
tolich Refer 05 Jun 2010, 13:06
Nariel какие особенности у Refer? 05 Jun 2010, 18:40
gamecreator нич-чего не понимаю! (с) 05 Jun 2010, 18:54
etoprostoya Присоединяюсь. 05 Jun 2010, 19:33
Flashback Одобряю эту тему 05 Jun 2010, 19:52
tolich Для тех, кто не понял, поясню:
refer.com - компиля... 05 Jun 2010, 20:11
Chrono Syndrome Хм, уже третий Forth-образный язык в разделе - зан... 05 Jun 2010, 20:34
gamecreator краткое описание команд не повредит. вообще язык п... 05 Jun 2010, 20:38
tolich Вступление
В далеком 1994 году я разрабатывал соб... 25 Dec 2010, 12:32
tolich Итак, прошло почти джва года... ну и Лентяй же ты,... 02 Jun 2012, 09:14
tolich Примечание: в дальнейшем если я буду писать ... 02 Jun 2012, 10:53
tolich Случайно заметил, что в мета-ассемблере есть ошибк... 29 Mar 2020, 18:16
hippocamus А вообще возможно под 10-й запустить com-файл? Без... 29 Mar 2020, 18:49
tolich Без досбокса или другой VM, насколько я знаю, нет.... 30 Mar 2020, 00:21
tolich Добавил распознавание слов вида 'X', где X... 10 Apr 2020, 13:58
tolich Оказывается, моё расширение 'X' для чисел ... 06 May 2020, 20:28
tolich Теперь в макросах допустимы комментарии (они больш... 13 May 2020, 13:36
tolich Новая версия. Изменения настолько глобальные, что ... 02 Jun 2020, 21:28
tolich Обновление.
1. Добавлен контроль управляющих струк... 15 Jun 2020, 12:02
tolich Обновление. Кроме упомянутого исправленного if-tru... 18 Jun 2020, 21:37
tolich Новая версия, 1.06.
1) Изменена командная строка.
... 04 Jul 2020, 13:39![]() ![]() |
| Текстовая версия | Сейчас: 12 February 2026 - 13:24 |
|
Copyright by Алексей Крючков
Programming by Degtyarev Dmitry |
|