IPB

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

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

😸🧡✊✌️
Сообщений: 16 424
Спасибо сказали: 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
сообщение 25 Dec 2010, 12:32 (Сообщение отредактировал tolich - 25 Dec 2010, 12:36)
Сообщение #2

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




Вступление

В далеком 1994 году я разрабатывал собственную Forth-систему. Писал я ее на ассемблере i8086, но, как человек не ленивый, а очень ленивый, написал программку на Turbo Pascal, в некоторой степени автоматизирующую описание слов (если вы не в курсе, словами в Форте называют подпрограммы).

Полноценную Форт-систему я тогда так и не создал (сказалась нехватка опыта), но зато я получил некоторые наметки того, что впоследствии стало языком REFER. Тогда этот язык содержал всего 12 ключевых слов, компилировал в язык ассемблера, а после компиляции, ассемблирования (TASM), линкования (TLINK), преобразования в BIN (EXE2BIN), требовался еще специальный загрузчик для запуска готовой "программы" (который, как ни странно, назывался FORTH.COM smile.gif).

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

В 1997 году, когда у меня уже была Форт-система, имеющая встроенный ассемблер (вначале написанная на языке ассемблера, а затем переписанная под метакомпилятор с подгружаемым ассемблером),
я решил развить REFEF. И вот что из этого вышло...

Refer - язык программирования, "смесь асма и ужаса", предназначенный прежде всего для создания ядра Forth-системы. Тем не менее, он позволяет также писать мелкие программы-утилиты. Название происходит от слова 'reference' (англ. "ссылка"), что означает его направленность на компиляцию последовательностей ссылок.

Слово - последовательность символов, отличных от пробела, ограниченная пробелами (или переводом строки).

Исходный файл - текстовый файл (предпочтительно в кодировке cp866, хотя это не так уж и важно), содержащий исходный текст программы на языке Refer.

Определение - любая подпрограмма.

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

Низкоуровневое определение - подпрограмма, написанная на языке ассемблера или в прямо машинном коде.

Высокоуровневое определение - подпрограмма, написанная в шитом коде или с ипользованием специального определения-интерпретатора. Впрочем, программы в шитом коде также используют особый интерпретатор 'call'.

Поле кода определения - адрес, по которому осуществляется вызов определения. Высокоуровневые определения здесь содержат команду "переход с возвратом" на свой интерпретатор.

Поле параметров высокоуровневого определения - адрес внутренних данных определения.

Шитый код - разновидность внутреннего представления программы в виде последовательности ссылок на подпрограммы-элементы этой программы.

Прямой шитый код - разновидность шитого кода, в которой все ссылки указывают непосредственно на исполнимый код подпрограммы.

Интерпретатор - определение, используемое классом высокоуровневых определений для их выполнения. Интерпретатор получает на стеке данных адрес поля параметров определения и параметры самого определения и должен получить результаты этого определения на выходе.

Стек возврата - стек, используемый интерпретатором шитого для временного хранения значений указателя интерпретации для возврата в вызвавшее определение. Кроме этого, он может использоваться для временного хранения произвольных значений и параметров цикла.

Буфер результата - участок виртуальной памяти, используемый для формирования программного образа - результата компиляции. Все команды работы с памятью работают именно с этим буфером. Особая переменная 'here' хранит размер записанных в буфер данных. Именно эти данные и считаются результатом компиляции.

Словарь - структура данных, предназначенная для сопоставления слов исходного текста программы определениям компилятора и пользователя.

Контекстный словарь - словарь, в котором в данный момент будет осуществляться поиск слов.

Текущий словарь - словарь, в который в данный момент будут добавляться новые макросы.

Режим работы - устаревший термин, на самом деле, связан с контекстным словарем.

Режим интерпретации - основной режим работы компилятора, в котором осуществляется определение макросов, пользовательских типов, пользовательских определений и заполнение буфера результата.

Режим компиляции - режим, в котором осуществляется компиляция последовательностей ссылок на ранее созданные пользователем определения.

В режиме интерпретации контекстным является словарь interpret. Он содержит слова для работы со стеком и памятью, простейшую арифметику, слова для расширения внутреннего словаря транслятора.
Именно в этом режиме осуществляется определение новых пользовательских слов, типов слов и макросов, а также наполнение того массива памяти, который в случае успешной компиляции (и отсутсвия ключа -E в командной строке) будет записан в выходной файл.

В режиме компиляции контекстным словарем является словарь compilers, основанный на другом словаре, userwords. В этом режиме осуществляется компиляция последовательностей ссылок на слова, ранее определенные пользователем (именно они находятся в словаре userwords). Словарь compilers же предназначен для определения разнообразных макросов периода компиляции.

Для перехода из режима интерпретации в режим компиляции и обратно используются слова ] и [, соответственно. (Выбор этих слов исторически обусловлен использованием в Forth в слова, определенные через двоеточие, интерпретируемых вставок, ограниченных именно словами [ и ]).

В режиме ассемблера, основанном на режиме интерпретации, контекст переключается чаще всего. Огромное множество словарей предназначено для компиляции последовательностей байтов, соответствующих командам некоторого подмножества языка ассемблера i8086. Кроме того, словарь содержит несколько слов для организации структурных ветвлений и циклов на уровне машинного кода.

Для перехода из режима интерпретации в режим ассемблера и обратно используются слова start-code и end-code, соответственно, также исторически обоснованные чуть менее, чем полностью.

Все данные представляются в виде двухбайтовых целых чисел и хранятся в стеке, в результате выражения записываются в привычной smile.gif обратной польской записи. Пример:
Код
2 2 + .
, что означает:
  1. положить число 2 на стек,
  2. положить число 2 на стек (слово literal в режиме интерпретации определено и ничего не делает),
  3. вынуть два числа из стека, сложить их и положить результат обратно на стек,
  4. снять число со стека и напечатать.

Разумеется, предыдущий пример в процессе компиляции выведет на экран 4.

to be continued...


--------------------
Я слежу за тобой!
* 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

 



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