IPB

Здравствуйте, гость ( Вход | Регистрация )

> Refer, еще один ЯП для срыва мозга
tolich
сообщение 05 Jun 2010, 13:06 (Сообщение отредактировал tolich - 04 Jul 2020, 13:40)
Сообщение #1

😸🧡✊✌️
Сообщений: 16 423
Спасибо сказали: 3294 раза




Более полной документацией озабочусь позднее, пока только основные фишки:
1) Forth-подобный синтаксис. (Хотя это не совсем Forth...)
2) Компилятор на Refer, входит в поставку.
3) Только COM-файлы, никаких библиотек поддержки.

Скачать 1.03
Скачать 1.04
Скачать 1.05
Скачать 1.06


--------------------
Я слежу за тобой!
* tolic.narod.ru

Цитата
Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел.
Борис "Бонус" Репетур, "От винта!", выпуск 38.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
 
Start new topic
Ответов
tolich
сообщение 02 Jun 2012, 12:40
Сообщение #2

😸🧡✊✌️
Сообщений: 16 423
Спасибо сказали: 3294 раза




Прямой шитый код и типы слов

В реализации применён прямой шитый код. Причём текущий указатель интерпретации хранится в DS:SI, вершина стека данных в SS:SP, а вершина стека возврата в SS:BP. Что это означает?

Пользовательские низкоуровневые определения представляют собой обычный машинный код, который заканчивается, правда, не инстукцией ret, а трёхбайтовой последовательностью lodsw jmp ax (которая сокращённо записывается, как next). Тем самым осуществляется переход к интерпретации очередной ссылке в последовательности ссылок. В дальнейшем я не буду упоминать, что низкоуровневое слово выполняет последовательность next, так как бесполезно писать про каждую подпрограмму, что она заканчивается оператором возврата.

Высокоуровневые определения начинаются с команды call перехода к подпрограмме интерпретатора. Это команда, кроме собственно перехода, кладёт в стек SS:SP "адрес возврата", который в нашем случае не используется для возврата, а является адресом поля параметров высокоуровнего определения. Инетерпретатор получает адрес поля параметров на вершине стека и обрабатывает его способом, свойственным для слов данного типа.

Например, подпрограммы в шитом коде также используют интерпретатор 'call', который кладёт текущее значение указателя интерпретации (только SI, конечно) на стек возврата, а затем снимает новое значение этого указателя со стека данных.

Слова пользовательского типа могут использовать в качестве интерпретатора произвольное пользовательское слово, которое, в свою очередь, может быть как низкоуровневым, вроде 'call', так и высокоуровневым, определённым в шитом коде, или даже словом пользовательсвкого типа!

Как же писать эти подпрограммы, спросите вы.

Низкоуровневые определения

Низкоуровневые определения начинаются со слова create-item, за которым следуют операторы компиляции машинного кода. Ничего фантастического тут нет. =).gif
Код
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
  mov si 0 [bp]
  inc bp
  inc bp
  next
end-code
Для того, чтобы не приходилось постоянно писать exit [, можно написать простой макрос:
Код
current compilers
macro ; exit [ endm
current interpret

Теперь можно со спокойной совестью написать:
Код
: do-nothing ;
Оно является высокоуровневым аналогом ранее определённого слова nop.

to be continued...


--------------------
Я слежу за тобой!
* tolic.narod.ru

Цитата
Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел.
Борис "Бонус" Репетур, "От винта!", выпуск 38.
Go to the top of the pageAdd Nick
 
+Quote Post
tolich
сообщение 10 May 2020, 13:43
Сообщение #3

😸🧡✊✌️
Сообщений: 16 423
Спасибо сказали: 3294 раза




Цитата(tolich @ 02 Jun 2012, 12:40) *
Слово type служит для определения пользовательского типа слов.
Больше не служит. Теперь оно, как ему и положено по FORTH-стандартам, снимает со стека адрес и длину строки и печатает её. То, что раньше называлось type, теперь называется typedef. Впрочем, использование тоже изменилось. Всё так же необходимо определить макрос, который осуществляет инициализацию поля параметров слова, а также пользовательское слово-интерпретатор. Но вызов выглядит так:
Код
' интерпретатор typedef имятипа компилятор
Примеры использования:
Код
' nop typedef create nop
Код
' call typedef : ]
Суть определения не изменилась.

Заодно поправил обработку макросов:
1) Макрос не может содержать слово macro в своём теле.
2) Если макрос не закончен словом endm, компилятор больше не зависает.

Кроме того, пустой результат больше не сохраняется в файл.

Новую версию выложил на ЯД (первый пост).


--------------------
Я слежу за тобой!
* tolic.narod.ru

Цитата
Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел.
Борис "Бонус" Репетур, "От винта!", выпуск 38.
Go to the top of the pageAdd Nick
 
+Quote Post

Сообщений в этой теме
- 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   Прямой шитый код и типы слов В реализации применё...   02 Jun 2012, 12:40
|- - tolich   Цитата(tolich @ 02 Jun 2012, 12:40) Слово...   10 May 2020, 13:43
- - 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 11 September 2025 - 17:42
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика