Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 19:34

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - моя форт-система, которая потихоньку пишется
Автор Сообщение
  Заголовок сообщения:  Nova-forth 1.04  Ответить с цитатой
Форт-система
Изменения:
Ядро: добавлен обратный вызов
Либы: сравнение строки с маской (что-то похожее)
И по мелочи, почти не писал последний месяц.

Что в планах? "Оторваться" от ядра и наварганить более-менее простой HTTP-сервер, благо, сокеты имеются. MySQL (портировать пример из SPF от ~day) и написать свой собственный вариант.
Юзверьский интерфейс пощупать.

По ядру.
Вычисление размера инлайн-области происходит каждый раз при вызове слова. Думаю, немного упростить этот момент.
К примеру, при пометке слова инлайн-флагом сразу вычисляется его размер, размер укладывается в верхний байт FFA слова.
Чтобы отличать этот вариант от 2 уже существующих предлагается помечать такие слова сразу IMMEDIATE и INLINE флагами. Т.к. одновременно они в компиляции не участвуют, то это будет отличительным признаком.
Примерный код
Код:
: FFA-COMPILE, \ ffa@ xt
....
OVER &INLINE &IMMEDIATE OR AND
IF
SWAP 8 RSHIFT S, EXIT
THEN
....


Это разгрузит часть инлайн-слов и как бонус позволит в эту же степь засунуть константы. Изначально отказывался от инлайн-констант т. к. если она в каком-либо байте имела бы 0xC3 , то это привело бы к ошибкам
Сообщение Добавлено: Сб июл 21, 2018 22:07
  Заголовок сообщения:  Re: моя форт-система, которая потихоньку пишется  Ответить с цитатой
Хм, может как в Форке тоже тупо указатель на параметры передавать?
Проще и структурней...
Надо подумать над этим
Сообщение Добавлено: Сб июл 14, 2018 14:56
  Заголовок сообщения:  Re: моя форт-система, которая потихоньку пишется  Ответить с цитатой
Оставлю здесь на случай неожиданностей на компе:
Виндяшный обратный вызов для Новы
Код:

\ каллбек на обратном ходу самостоятельно дропает элементы вызывающего кода
HEADER (free-arg)
ECX POPr \ (p)
EDX POPr \ ~call
0x8D C, 0x24 C, 0x8C C,   \ LEA ESP, [ECX*4] [ESP]
EDX JMPr

\ восстановить значения регистров на обратном ходу
HEADER (call-restore)
EDI POPr
ESI POPr
EBP POPr
EBX POPr
EDX POPr
ECX POPr
RET,


\ стековая диаграмма (возвраты) слова ниже
\ params ~call dw
\ (free-arg) registr (call-restore)
\ подушка параметры+стек (free-R)


HEADER (CALL-BACK)
EAX POPr      \ тут указатель на кол-во параметров И КОД
[EAX] PUSHr   \ ячейки под параметры
0x68 C, ' (free-arg) ,
ECX PUSHr
EDX PUSHr
EBX PUSHr
EBP PUSHr
ESI PUSHr
EDI PUSHr
0x68 C, ' (call-restore) ,      \ RLIT
ECX ESP MOVr-r            \ для сброса стека данных
\ косячный асм потому что
\ EBX 9 CELLS ESP LEAr-im-r      \ указатель для перетаскивания параметров
0x8D C, 0x5C C, 0x24 C, 9 CELLS C,
ESI [EAX] MOVr-r                        \ получаем кол-во ячеек
0x8D C, 0x5C C, 0xB3 C, 0x00 C,   \ LEA EBX, 0 [EBX] [ESI*4]
EDX 20 CELLS MOVr-im                 \ восстанавливаем TLS, если код не в потоке, то ручками
FS: EDI [EDX] MOVr-r

EDX EDX EDX PUSHr PUSHr PUSHr   \ подушка стека данных
] BEGIN [                                    \ лень уже было заморачиваться. потом подправлю
   ESI ESI ORr-r
   JE SHORT Jcc>   
   [EBX] PUSHr
   EBX CELL NEGATE LEA+-      
   ESI DEC
2SWAP
] AGAIN [      
j-close
EBP ESP MOVr-r
EBX CELL EAX LEAr-im-r
EAX [EBP] MOVr-r
EBP CELL LEA+-         \ получаем указатель на код

EDX 100 MOVr-im        \ создаём пространство стека данных
Mark1
   EDX PUSHr
   EDX DEC
Mark1 JNE SHORT  >Jcc

ECX PUSHr                  \ точка сброса пространства стека данных
0x68 C, ' (free-R) ,
EBX JMPr
   
: CALLBACK: \ cells -- in: <bl>
HEADER
['] (CALL-BACK) COMPILE,
,      \ шибко маловероятно
[CALL] ]
;   



Для проверки работоспособности использовались API из темы http://www.fforum.winglion.ru/viewtopic.php?f=25&t=2219
Сообщение Добавлено: Сб июл 14, 2018 14:51
  Заголовок сообщения:  Re: моя форт-система, которая потихоньку пишется  Ответить с цитатой
Идея взята из: viewtopic.php?f=25&t=2097

Возможность определять слово в словарь без переключений.

Код:
: TO-VOC:
'
>param @ >R
R@ L>hereFA @ DP   
=
IF
   R> CURRENT KEEP!
   :
ELSE
." error, various codofile!!!" CR -1999 THROW
THEN
;


Не хочешь перевязывать или переключать словари, пользуйся.
Ограничение одно: кодофайл текущего словаря и выбранного (куда идёт привязка) должен быть одним и тем же.
Сообщение Добавлено: Пн июл 09, 2018 21:26
  Заголовок сообщения:  Re: моя форт-система, которая потихоньку пишется  Ответить с цитатой
Нова 1.03

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

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

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

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

По идеям:

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

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

По либам:
JSON основная часть работы сделана. Уже может транслировать JSON-файлы, и просто отрезки на этом языке.
Добавлено слово DUMP
Сообщение Добавлено: Пт июн 22, 2018 14:19
  Заголовок сообщения:  Re: моя форт-система, которая потихоньку пишется  Ответить с цитатой
Нова 1.02, исходники, либы, портированный COM

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

Добавлена возможность загружать файлы в форт-систему без обработки. В принципе, это и так делается одной строчкой, но Нова дополнительно позволяет для этих целей пользоваться стеком окружений и путём используемого файла.
Для этого указывайте в конце пути к файлу :BIN
К примеру, FILE-TEST.F:BIN
Пример использования можно посмотреть в ~er\float\code\include.f

Добавлена библиотека макросов ~er\macro\macro.f
Позволяет определять простые макросы и константы, которые нигде не отсвечивают. Вся служебка хранится в стеке возвратов и при окончании трансляции очищается откатом. Откаты решают всё! :D

Портирована работа с COM - automate.f от ~yz
Как я понял, эта либа писалась достаточно давно. Иначе как объяснить наличие BL WORD COUNT вместо PARSE-NAME :)
Сообщение Добавлено: Ср май 09, 2018 14:08
  Заголовок сообщения:  Re: моя форт-система, которая потихоньку пишется  Ответить с цитатой
Портировал библиотеку automate.f от ~yz на Нову
Портирована она почти полностью. Исключение: цикл FOREACH и расшифровка ошибок (будут вылезать кракозябры).
Работоспособность проверял бегло.

Как пользоваться СПФ-скими либами из Новы?

Надо подключить окружение: SPF/ENV+.F
Всё, портированные либы будут корректно подключаться.
Поскольку в Нове слов меньше, может потребоваться слой совместимости - файл WORDS.F (знаете, как назвать попонятней, предлагайте).

Как подключается automate

Код:
SPF/ENV+.F
WORDS.F
~YZ\LIB\AUTOMATE.F



Либу выложу позже. Когда ещё Нову и либы к ней пополню
Сообщение Добавлено: Сб май 05, 2018 14:09
  Заголовок сообщения:  Re: моя форт-система, которая потихоньку пишется  Ответить с цитатой
Написал обёртку под обратный вызов ( callback ).
Подскажите, на какой функции легче всего затестить обёртку на работоспособность?
Сообщение Добавлено: Ср май 02, 2018 14:11
  Заголовок сообщения:  Re: моя форт-система, которая потихоньку пишется  Ответить с цитатой
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. То и дело натыкаюсь на особенности СПФа
Ещё блин надо будет API-CALL для COMа купировать. т.к. мой вариант всё таки требует кол-во параметров, а СПФ-ский нет
Сообщение Добавлено: Пн апр 30, 2018 16:48
  Заголовок сообщения:  Re: моя форт-система, которая потихоньку пишется  Ответить с цитатой
Как планирую решить проблему с масштабированием TO и FROM

HEADER (SKIP-TO&FROM)
EBX POPr
EBX 2 CELLS [EBX] LEAr-im-r
EBX JMPr

\ Для примера

HEADER VALUE-CODE
' (SKIP-TO&FROM) COMPILE,
' NOOP ,
' NOOP ,
EBP CELL NEGATE [EBP] LEAr-im-r
[EBP] EAX MOVr-r
EAX POPr
EAX [EAX] MOVr-r
RET

И аналогично с остальными параметрическими кодами.
С CREATE немножко заморочаюсь, дабы тоже поддержка была

TO и FROM вычисляют адрес параметрического слова и вычленяют из него при наличии соответствующие обработчики.
Сообщение Добавлено: Чт апр 26, 2018 19:10
  Заголовок сообщения:  Re: моя форт-система, которая потихоньку пишется  Ответить с цитатой
mOleg писал(а):
Victor__v писал(а):
Возможное решение проблемы:

а чем классика не угодила?
(по сути решение стандартное, и, хотя
пример из форка моего, который я таки классикой не считаю 8)
но, надеюсь, понятное)
<Всякий разный rод>
то есть несколько полей кода.
?


Честно сказать, не додумался. :P
А по факту отдать поведение с ёнтими словами самому параметрическому слову идея хорошая.
К тому же при компилировании форт-системы это можно сделать уже легко.

Но как красивей поступить с развёрткой параметрических слов?
Чтоб к примеру константа в коде сразу превращалась число, а юзер-переменная в LEA EAX, 4 [EDI]
У меня параметрические слова метятся флагами и потом отдельно развёртываются спец. словом.

Думал над тем, чтобы отдать это на откуп самим словам, но это приведёт к созданию ссылок вперёд, чего бы не хотелось. Т.к. константы юзвери и переменные начинаются использоваться почти сразу, а компилирующие слова несколько позже. Груба говоря все слова с -CODE упразднять, использовать CREATE и DOES> с компилирующими словами, которых нет в начале форт-образа. Без ссылок вперёд не обойтись. А этого бы не хотелось.
Сообщение Добавлено: Вт апр 24, 2018 21:33
  Заголовок сообщения:  Re: моя форт-система, которая потихоньку пишется  Ответить с цитатой
Victor__v писал(а):
Возможное решение проблемы:

а чем классика не угодила?
(по сути решение стандартное, и, хотя
пример из форка моего, который я таки классикой не считаю 8)
но, надеюсь, понятное)
Код:
\ создать инициализированную переменную,
\ возвращающую по-умолчанию собственно значение.
: VALUE ( x / name --> )
        HEADER
          COMPILE (value)
          COMPILE (store)
          COMPILE (CREATE)
          A,
        ;CREATE ;

\ создать неинициализированную переменную
: USER-VALUE ( / name --> )
             HEADER
               COMPILE (uvalue)
               COMPILE (ustore)
               COMPILE (USER)
               ADDR USER-PLACE A,
             ;CREATE ;

\ сохранить значение n в VALUE переменной
: TO ( n / name --> ) ' TOKEN + REGULAR ; IMMEDIATE

\ прочесть содержимое VALUE переменной
: FROM ( / name --> xt ) ' [ 2 TOKEN * LIT, ] + REGULAR ; IMMEDIATE

то есть несколько полей кода.
?
Сообщение Добавлено: Вт апр 24, 2018 20:20
  Заголовок сообщения:  Re: моя форт-система, которая потихоньку пишется  Ответить с цитатой
Хочу обсудить такую идею.
Вступление:
В СПФ развёрткой параметрических слов и компиляцией слова TO занимается оптимизатор (предположительно).
В Нове развёртка отведена отдельному слову, как и компиляция слова TO

Но оба варианта не очень хороши.
Как минимум, они не масштабируются.
А при расширении функционала это требуется.
К примеру, чтобы можно было записать значение в лок. переменную используя TO. Или у нас появились новы сущности с коими хотелось бы аналогично работать.
Переопределение слов в данной ситуации не кажется надёжным и правильным.

Возможное решение проблемы:
Можем использовать таблицу, назовём её PARAMS-TABLE у неё будет 4 поля. Каждое их которых размером CELL.
В первом столбце у нас само параметрическое слово (по нему всё ищется)
В втором столбце у нас слово отв. за развёртку слова во время компиляции
В третьем столбце у нас слово отв. за действие с параметрическим словом через TO
В четвёртом столбце у нас действие с параметрическим словом через FROM (получить указатель на зн. переменной).

Естественно, "кушать" они будут указатели на переменную (на то, что за параметрическим словом).

При использовании слов TO и FROM будет вызываться перебор PARAMS-TABLE, который выдаст указатель на строку таблицы, где будут соответствующие указатели на код.
Примерный код для TO
Код:
: TO
'
DUP >param SWAP
GET-CALL-in-code ( addr -- xt err|0 ) THROW
PARAM-TABLE-ITER \ xt -- rec
2 CELLS + @ EXECUTE \ xt: ?? addr>param -- ??
;   IMMEDIATE


Это позволит гибче пользоваться словами TO и FROM. Всего лишь добавляя новые параметрические слова и поведение.

Примерный код инициализации параметрического слова
' VARIABLE-CODE ' LIT, ' (DOES>VAR) ' LITERAL ADD-PARAM-TABLE

Что думаете по этому поводу?
Сообщение Добавлено: Пн апр 23, 2018 19:54
  Заголовок сообщения:  Re: моя форт-система, которая потихоньку пишется  Ответить с цитатой
Код плаа-хой
строки типа S" 12,00" вычислялись некорректно

Занимался преобразованием строки в FLOAT

вот как надо
\ преобразовать строку.
\ вернуть 2 числа как дробь ( 12.34 -> 1234 / 100 )
: str->fl \ A U -- число на-сколько-делить
\ S" 12,34" --> S" 12" S" 34"
S" ," SPLIT
0= IF
S" ." SPLIT
0= IF -2001 THROW THEN
THEN

\ дублировать 4 эл-та сохранить длину строк
DUP >R 2OVER DUP >R 2OVER
2SWAP
2R> + CELL+ RALLOT RF^ >R \ point
R@ SWAP DUP >R MOVE
2R@ + SWAP DUP >R MOVE
2R> + \ u
R> \ a
SWAP
STR>NUM THROW
>R
STR>NUM THROW >R
STR>NUM THROW
R>
DUP 0= IF DROP RDROP 1 EXIT THEN
\ 12 34
10 >R
BEGIN
1 RPICK R@ /MOD SWAP
2 PICK = >R
2 PICK = R>
AND INVERT WHILE
R> 10 * >R
REPEAT
2DROP
2R>

;


: NOTFOUND(.,)
['] str->fl CATCH = IF 2DROP 0 EXIT THEN
SWAP int>F F/int
STATE @
IF
FLIT,
THEN
-1
;


[/code]

Часть слов для работы плав. точки написана: операции, "константы" и пр. У меня пока пашет асм, буду всё в коды переводить.
Осталось научиться печатать FLOAT-значения.

Стоит ли ещё разбирать строки с экспонентой?
Стоит ли ещё дополнительно заморачиваться поддержкой исключений на плав. точке?
Сообщение Добавлено: Вс апр 15, 2018 19:31
  Заголовок сообщения:  Re: моя форт-система, которая потихоньку пишется  Ответить с цитатой
Исходники Новы

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

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

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

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

Остальное в моём ЖЖ
https://viktor-ra.livejournal.com/62321.html
Сообщение Добавлено: Сб апр 07, 2018 12:18

Часовой пояс: UTC + 3 часа [ Летнее время ]


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB