?

Log in

No account? Create an account

[sticky post] Вступление (ред1)

Моё пристанище пополнилось ещё одним моим увлечением - фортом.
Мной была написана NOVA-forth.
Можно просто, Нова.
Думаю, большая часть записей будет за Новой.
В принципе, это достаточна простая 32-битная форт-система под Винду.
Исключение составляют таблица предкомпиляции и отканые операции.
Тут буду мусолить вечносамогонные темы: развитие форта, идеи.

А также публиковать свои наработки.


Кого можно почитать в ЖЖ?
shatff история
demonada всяко разное. в ЖЖ бывает наскоками
galeneastro астрономия, пейзажи
gibajd в основном путешествия

terra_irrornita  журнал заброшен. Но у автора хороший стиль.

Nova-forth версия VC 1

Nova-VC

обновление 1

Ядро

    COMPILE, стал вектором. А это значит, что можно дополнительно влиять на последнюю стадию компиляции.
    Добавлено чтение INI-файла перед запуском системы
    Поправлена интерпретация командной строки (ранее ругался на пути с пробелами).

Библиотеки:
Создание и загрузка оверлеев. Оверлей в данном случае это временный словарь сохранённый в бинарном формате. При загрузке корректируются указатели словаря, цепочки поиска и пр.
Для корректной работы полученного оверлея код должен быть позиционно-независим.
Писалось ради интереса. Интерес пробудился на форт-форуме

Оптимизатор:
Размер подопытных библиотек уменьшился на 16 %.

Nova-forth 1.05

Нова 1.05

Кратко по новшествам:

  • интерпретация командной строки

  • новый механизм инлайна

  • портирована либа-обёртка для #MySQL от ~day

  • написан собственный вариант для работы с MySQL


По поставке: убран СПФ, ЦК на его основе и мои либы к нему

Nova-forth 1.03

https://cloud.mail.ru/public/4ENj/Sx9zaV7Sz

Изменения:
Нова может скомпилировать саму себя по исходникам.
В процессе переписал часть стекового манипулятора (в 5.1). Из-за различий версий код компилировался разный, что мешало проверить "правильность" системы. После этого живо были ликвидированы остальные несуразности.
Стоит отметить, что компиляция форт-образа ведётся Новой для работы с теми же абсолютными адресами, что и в используемом форте (т.е c 0x00402000).

Добавлена возможность сохранить наработанную форт-систему. Для этого добавлена библиотека (компилируется во врем. словарь, в форт-образ не идёт).

Добавлены слова:
MIN
MAX
SSET?
\ a1 a2 ... an n b --- a1 a2 ... an n flag проверить элемент b на вхождение в множество, вернуть флаг (-1 да, 0 нет).

Думаю, пора портировать на 64 бита.
У меня тут как раз fasm с дизассемблером завалялись :)
Обкатаю пару примитивов в фасме для работы с виндой (там fastcall), допишу форт-ассемблер, подготовлю стек. манипулятор и пр. Всё дело проверю в дизассемблере (не очень мне нравится 64бита в интеле, инструкцию порезали гады )

По идеям:

Добавить возможность использовать дополнительные таблицы предкомпиляции в словарях. Т.е. сначала шерстятся некие куски памяти в словарях, а потом основная таблица.
Зачем: есть либы (к примеру лок. переменные), существующие в временных словарях. Они ест-но пишут обработчики в основную таблицу. Но стоит врем. словарь освободить, то может случиться ошибка (запрещённый адрес, "не то" значение и проч.
Плюсы: надёжность, легко реализуется (освежил память, потребуется изменить только одно слово).
Минусы: завязка на словарь (чего не хочется).

Компилировать параметрические слова через таблицу предкомпиляции.
Плюсы: логичность, расширяемость (хотя не думаю, что кому-то понадобится определять новое параметрическое слово)
Минусы: ?
А так ли оно надо? Сейчас обработка параметрических слов хоть и кастрирована по сути, но проста. Да и опр. новых парам. слов маловероятно.

По либам:
JSON основная часть работы сделана. Уже может транслировать JSON-файлы, и просто отрезки на этом языке.
Добавлено слово DUMP

Nova-forth 1.02 май

Нова 1.02, исходники, либы, портированный COM


Что изменилось?
TRANSLATE-FILE стал пользовательским вектором.
Пользовательские вектора тоже изменились. Т.к. они определяются почти на финишной прямой, то USER-VECT-CODE определяется на среднем уровне, что позволило вывести его из параметризации. Это слово уже само отвечает за компиляцию.
Read more...Collapse )

Nova-forth 1.02

NOVA-forth версия 1.02

29.04.2018
Добавлены слова: GET-CALL и RECOMPILE . Последнее занимается (само)модификацией кода. Эти слова необходимы для реализации слов ниже.
Слова TO и FROM работают через вызов обработчиков в запрашиваемых параметрических словах. Механизм записи и получения указателя переменных теперь может быть расширен при необходимости.
Добавлено слово WINAPI:
Маленький шажок к СПФ-у - неплохой шаг к поддержке самомодификации кода.

08.04.2018
Переписано слово TASK>


https://cloud.mail.ru/public/CqRW/BUc7h2HhS

В настоящий момент портирую либу для работы с COM от ~yz. То и дело натыкаюсь на особенности СПФа
Переписал проверку нахождения инлайн-слова в разбираемом коде.
Каждый раз для проверки создаётся функция в хипе (там вызов параметрического слова и указатель на инлайн-код). После проверки функция самоудаляется. Если же слово >OPT обрубило проверочную трассу раньше, то выделенная память под функции также освобождается силами >OPT.

Дабы легче было пользоваться проверкой на развёртку, INLINE-COMPILE, в ядре было переписано.
Слово дополнительно просит функцию компилирования. И если поставить NOOP, то получим длину инлайн-слова.

Касательно проверочной трассы.
Трасса может быть большой. И каждый раз писать что-то вроде ['] >R >INLINE? ['] DUP >INLINE? NUMBER не есть хорошо.
Поэтому строим абстракцию.
Что-то вроде
: TRACE{
0
BEGIN
PASRE-NAME
2DUP S" }TRACE" COMPARE WHILE
['] ENTITY-VOCS >param @ SFIND-IN-VOC
IF
NIP LIT,
ELSE
SFIND
IF
SWAP &INLINE AND IF LIT, ['] >INLINE? COMPILE, ELSE -2003 THROW THEN
ELSE -2003 THROW THEN
THEN
1+
REPEAT
2DROP
LIT, \ n
;

Но случаи могут быть и интересней. К примеру, #оптимизация повторяющихся оптимизаций.
Хоть #LISP садись пиши. Хотя вариант интересный. В плане абстракций Лисп хорош.
Код будет забавным: проверка форт-кода на соответствие шаблона на Лиспе, который написан на форте.
Но это ещё одну фундаментальную вещь продумывать.
А это ж всё-таки глазковая оптимизация. Хотя инструментарий в виде таблицы предкомпиляции есть. Можно потом #натив в псевдокод (на этот раз не в форт-код, а в некий вымышленный асм) и снова в натив.
И тут уже настоящая оптимизация возможна по скорости, размеру, использованию стеков и регистров.

Дополнительно:
Чтобы разгрузить #ассемблер в оптимизаторе, вызываемые ассемблирующие слова можно немного "съоптимизировать". Если установлено, что ассемблирующие слово жрёт 2 параметра и они всегда одинаковы, то оно вызывается 1 раз, а полученный код от него в последующих вызовах компилируется через S,
Пока это делается вручную, думаю над автоматическим использованием.
Таким образом в оптимизаторе будет меньше вызовов и скорость оптимизатора должна увеличиться.
Исходники Новы


03.04.2018
Добавлено слово VOC-THREADS константа кол-ва цепочек поиска в форт-системе.

31.03.2018
Для ускорения трансляции слово PARSE-NAME переписано на манипуляторе.
Пофиксена проблема с комментарием \ т.к. не работал одиночно.
Переписана трансляция консоли.
Убран из пользовательской области буфер консоли. Теперь буфер создаётся автоматически при использовании трансляции консоли.
Убрано слово TOP-ERROR:


По портированию
Портирована быстрая сортировка ~pinka
В настоящий момент портируется либа для работы с COM от ~yz.
Пишется слой совместимости.
Чуть переписаны лок. переменные, дабы портируемые либы не переписывать.

Написана обёртка WINAPI: Только вчера вечером писал. В отличие от Stdcall: вычисляет кол-во требуемых переменных в момент первого вызова. А после начинается самомодификация кода в месте вызова.
(winapi-code) заменяется (stdcall)



По наработкам
Написаны замыкания, или что-то похожее. Короче, создание функции во время исполнения слова. Делал уже такое для СПФ.


По оптимизатору
Добавил возможность проверки нахождения развернутого слова в коде. Работает всё через жонглирование стеком возвратов. Ибо нефиг юзверей для служебки использовать :)
Оптимизация IF WHILE . Там большая портянка с вариантами оптимизации.


Предложения по ядру
Внести WINAPI: (winapi-code) RECOMPILE последнее слово – перекомпиляция вызова слова. Не очень тянет вносить в ядро слово, которое занимается самомодификацией кода, но оно используется в WINAPI: .

Таблица расшифровки исключений. Суть проста – когда возникает ошибка выкидывающая в консоль, то выдавать текстовое описание ошибки. Для этого надо завести таблицу в хипе. И простейший перебор. Стоит ли оно того?

Внести MIN MAX . Вероятно, будут внесены, когда подготовлю новый ассемблер.

Действие системы перед её стартом. Чтение INI-файла, командной строки.

Nova-forth 1.01

Нова, исходники, либы, оптимизатор

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

Оптимизатор работает, пока в процессе. Потом засуну его во временный словарь.

Если его подключить заранее, то можно неплохо съэкономить в некоторых местах.
К примеру в R:STR выделение памяти на стеке -64 RP@ + RP! вырождается в одну инструкцию.

По Нове.
Изменил версию: 1.01
Причина: поменял механизм компиляции слов, сделал чуть логичней. Появился служебный флаг "я параметрическое слово". Как несложно догадаться, им автоматически метятся константы, векторы, переменные и пр. Плюс 4-5 мелких исправлений. не все их документировал. К примеру слово RF^ стало инлайн-словом, как и планировалось.

Размышления:
Использовал в оптимизаторе своеобразный аналог CASE. Фактически, обёртка произвольной цепочки IF-ELSE
Загвоздка в том, что на это меня надоумило сообщение фиг знает откуда у суперскобке в Лиспе :D
Впрочем, вещь полезная. Чувствую оптимизатор буду портянками писать.




Причуды России

Работая с яндекс-картами не перестаёшь удивляться.
В Сергиевом Посаде жилой комплекс - Посад-премьер. А рядом ЖК Владимирский. Наводит на определённые мысли.
В Екатеринбурге есть кольцевая дорога, которая не является кольцевой -ЕКАД.
Но больше всего меня порадовал город Гагарин, что в Смоленкой губернии.
Представьте себе в городе несколько микрорайонов: Северный, Южный, Восток и... Думаете Западный? Не-а, гагаринцы не признают запад. Вместо этого гагаринцы уважают лес и заботятся о плодородии земли. И названия микрорайонов соответствующие.
Гагарин