О вторичных FORTH-машинах

Перейти вниз

О вторичных FORTH-машинах

Сообщение автор Gudleifr в Чт Янв 18, 2018 11:33 pm

Из старых записей:

Фортеры спокон веку гордятся тем, что в Forth-систему встроен интерпретатор текста, который позволяет за здорово живешь обрабатывать чуть ли не человеческий язык. Мол, что вам еще надо, кроме слов, разделенных пробелами? И, действительно, огромному числу прикладных языков ничего больше и не требуется...

Но...
1. ... время от времени появляются фортеры, которые жаждут странного, например, языков с командами-литерами (BASIC-музыка, расширенные файловые манипуляторы)...
2. ... ОС часто ставит перед программистом задачу распознавать что-то непотребное, например, файлы со словами, разделенными запятыми; c-, lisp- и trac-программы; слова-команды в виде четверок msg-wnd-wpar-lpar...
3. ... целевая компиляция требует создать новый Forth (а заодно и - новый интерпретатор) в параллель старому...
4. ... реализовав зародыш Forth на специализированном процессоре, может захотеться его расширить...

Конечно, существует множество решений на такой случай: сделать основополагающие слова косвенными, заранее создать умные словари, распознающие, что угодно и т.п...

Возьму FOBOS. В момент чтения исходного текстового файла все идет по-старинке.
Но когда дело доходит до создания окна, в дело вступает "совершенно другая Forth-машина", которая в качестве входного потока берет оконные сообщения: рассматривает их как "слова" и исполняет.
Что никак не противоречит тому, что, если я допишу консоль, некоторые сообщения будут вызывать интерпретацию слов, вбитых в Edit-окно, в старой манере.

Но...
Что такое "Forth-машина"?
Это GOTO и в точку входа цепочки шитого кода, связанную в кольцо (даже главный цикл не просматривается) и прицепленное где-то "сбоку" INTERPRET - набор из пятка очень машинно-зависимых и практически независимых от остального кода слов: EXPECT, WORD, FIND, NUMBER... Времена, когда INTERPRET составлял основу Главного Цикла давно канули в лету (как и сам главный цикл).
Так какого черта мы строим свой Forth вокруг этого "интерпретатора"? Давно пора сделать наличие второй (третьей и т.д) "Forth-машины" в рамках одной Forth-системы нормой! И не надо никаких векторных слов и умных словарей: просто пишем еще один тупой INTERPRET', состоящий из тупых EXPECT', WORD', FIND', NUMBER'...
И вопрос не имеет ничего общего с многозадачностью, все это вполне может работать "по очереди".
***

Вышеизложенное было написано до того, как у меня в голове устаканилось представление FORTH-системы в виде комплекса сопрограмм OK-СИМВОЛ-ВЫПОЛННИТЬ-КОМПИЛИРОВАТЬ-СЛЕДУЮЩИЙ.
Теперь я бы перефразировал так: в единую FORTH-систему можно и часто нужно (см. ТЕМА #64) объединять несколько FORTH-машин, отличающихся реализацией своих компонентов.
avatar
Gudleifr
Admin

Сообщения : 908
Дата регистрации : 2017-03-29

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: О вторичных FORTH-машинах

Сообщение автор Gudleifr в Чт Янв 18, 2018 11:37 pm

Кстати, применение механизма вторичных FORTH-машин позволяет обходится вообще без "стандартного FORTH". Ведь, то, что не может сделать одна FORTH-машина, вполне может восполнить другая...

Тут, на днях, опять всплыла старая задачка о перелопачивании GIF-файлов под мои потребности. Достал свои старые исходники и понял, что строить в голове полную модель GIF-библиотек, чтобы найти ту пару-другую функций, что мне тут нужны, будет стрельбой из пушек по воробьям. Решил быстренько переписать, разве что, подсматривая в старые таблички.

Писал на C.
Минусы программирования по Forth-овски на C очевидны:
1. Цикл диалога с программой включает перекомпиляцию.
2. Использование нетривиальных программных конструкций (например, сопрограмм) требует лишних переменных.
3. И с точки зрения С это часто выглядит неопрятно. Многие "углы" хочется "спрямить".
Зато, нет необходимости в поддержке стека и шитого кода.

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

FORTH-машина считывания gif-ов должна начать работу в состоянии, когда из файла удается выдернуть "знакомые буквы", а закончить, когда я вспомню все форматы и смогу распознать все, что нужно:

ОК - чтение из файла
СИМВОЛ - первая литера фрагмента определяет его тип
ВЫПОЛНИТЬ - нахождение нужного распознавателя по первой букве
КОМПИЛИРОВАТЬ - развернуть фрагмент в словарь блоков
СЛЕДУЮЩИЙ - цикл вокруг чтения из файла

Достаточно быстро удалось вспомнить, что эта машина должна знать всего четыре слова - ЗАГОЛОВОК, КАРТИНКА, РАСШИРЕНИЕ, КОНЕЦ. Причем, способы хранения информации в этих фрагментах достаточно универсальны. Скормив этой машине несколько разных GIF-ов, быстро разобрался, что каждый "гиф-редактор", добавляет в них мусорные РАСШИРЕНИЯ по своему вкусу. На радостях выкинул из машины весь диагностический вывод.

Однако, дерево разбора получилось сложноватым и я для него зафигачил вторую машину:

ОК - выбор строки команд-букв
СИМВОЛ - буква-операция (цифра - параметр следующей команды)
ВЫПОЛНИТЬ - перемещение указателя блоков и сбор данных из них
КОМПИЛИРОВАТЬ - пока хватит букв
СЛЕДУЮЩИЙ - перебор букв в строке

Теперь, например, я могу добраться к палитре второго рисунка в GIF-е, введя что-то вроде: "RC,N,B". Правда, останавливаться на возможности присваивать новым буквам последовательность старых (этакая кривенькая реализация "двоеточия") было уже некогда.

Тогда посмотрел на первую машину и, т.к. все цифры были уже налицо, понял, что операция обратной записи в файл описывается простенькой таблицей (ведь, способы хранения данных, как я писал выше, для разных фрагментов достаточно универсальны). И команда печати блока получилась сама собой. Гордо послав последовательность команд "RPCPNP;", получил копию простого GIF-а в новом файле.

Кстати, зародыш стека во второй машине, все-таки, присутствовал - в виде числового префикса повтора команд.

Т.о. без всяких ВФМ, за пару часов, я получил методом постепенного приближения и борьбы со склерозом, программу разборки/сборки файлов. Кстати, если бы начал писать на C честно, то, наверняка, еще бы потерял время на LZW. Но. т.к. тупо, по сути, отвечал на вопросы программы, то вовремя вспомнил, что оно мне пока без надобности...

Как-то так...
avatar
Gudleifr
Admin

Сообщения : 908
Дата регистрации : 2017-03-29

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: О вторичных FORTH-машинах

Сообщение автор Gudleifr в Чт Янв 18, 2018 11:40 pm

Были еще какие-то наметки про FORTH-образную работу на уровне диалога с ОС, но их пожую позже - во втором томе "заметок о простых играх".
avatar
Gudleifr
Admin

Сообщения : 908
Дата регистрации : 2017-03-29

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: О вторичных FORTH-машинах

Сообщение автор Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Вернуться к началу

- Похожие темы

 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения