Автор |
Сообщение |
|
|
Заголовок сообщения: |
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 , то это привело бы к ошибкам
[url=https://cloud.mail.ru/public/HZzU/dwBNBhyin]Форт-система[/url] Изменения: Ядро: добавлен обратный вызов Либы: сравнение строки с маской (что-то похожее) И по мелочи, почти не писал последний месяц.
Что в планах? "Оторваться" от ядра и наварганить более-менее простой HTTP-сервер, благо, сокеты имеются. MySQL (портировать пример из SPF от ~day) и написать свой собственный вариант. Юзверьский интерфейс пощупать.
По ядру. Вычисление размера инлайн-области происходит каждый раз при вызове слова. Думаю, немного упростить этот момент. К примеру, при пометке слова инлайн-флагом сразу вычисляется его размер, размер укладывается в верхний байт FFA слова. Чтобы отличать этот вариант от 2 уже существующих предлагается помечать такие слова сразу IMMEDIATE и INLINE флагами. Т.к. одновременно они в компиляции не участвуют, то это будет отличительным признаком. Примерный код [code] : FFA-COMPILE, \ ffa@ xt .... OVER &INLINE &IMMEDIATE OR AND IF SWAP 8 RSHIFT S, EXIT THEN .... [/code]
Это разгрузит часть инлайн-слов и как бонус позволит в эту же степь засунуть константы. Изначально отказывался от инлайн-констант т. к. если она в каком-либо байте имела бы 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
Оставлю здесь на случай неожиданностей на компе: Виндяшный обратный вызов для Новы [code]
\ каллбек на обратном ходу самостоятельно дропает элементы вызывающего кода 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] ] ;
[/code]
Для проверки работоспособности использовались API из темы [url]http://www.fforum.winglion.ru/viewtopic.php?f=25&t=2219[/url]
|
|
|
|
Добавлено: Сб июл 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 ;
Не хочешь перевязывать или переключать словари, пользуйся. Ограничение одно: кодофайл текущего словаря и выбранного (куда идёт привязка) должен быть одним и тем же.
Идея взята из: http://fforum.winglion.ru/viewtopic.php?f=25&t=2097
Возможность определять слово в словарь без переключений.
[code] : TO-VOC: ' >param @ >R R@ L>hereFA @ DP = IF R> CURRENT KEEP! : ELSE ." error, various codofile!!!" CR -1999 THROW THEN ; [/code]
Не хочешь перевязывать или переключать словари, пользуйся. Ограничение одно: кодофайл текущего словаря и выбранного (куда идёт привязка) должен быть одним и тем же.
|
|
|
|
Добавлено: Пн июл 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бита в интеле, инструкцию порезали гады ) По идеям: Добавить возможность использовать дополнительные таблицы предкомпиляции в словарях. Т.е. сначала шерстятся некие куски памяти в словарях, а потом основная таблица. Зачем: есть либы (к примеру лок. переменные), существующие в временных словарях. Они ест-но пишут обработчики в основную таблицу. Но стоит врем. словарь освободить, то может случиться ошибка (запрещённый адрес, "не то" значение и проч. Плюсы: надёжность, легко реализуется (освежил память, потребуется изменить только одно слово). Минусы: завязка на словарь (чего не хочется). Компилировать параметрические слова через таблицу предкомпиляции. Плюсы: логичность, расширяемость (хотя не думаю, что кому-то понадобится определять новое параметрическое слово) Минусы: ? А так ли оно надо? Сейчас обработка параметрических слов хоть и кастрирована по сути, но проста. Да и опр. новых парам. слов маловероятно. По либам: JSON основная часть работы сделана. Уже может транслировать JSON-файлы, и просто отрезки на этом языке. Добавлено слово DUMP
[url=https://cloud.mail.ru/public/4ENj/Sx9zaV7Sz]Нова 1.03[/url]
Изменения: Нова может скомпилировать саму себя по исходникам. В процессе переписал часть стекового манипулятора (в 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 Позволяет определять простые макросы и константы, которые нигде не отсвечивают. Вся служебка хранится в стеке возвратов и при окончании трансляции очищается откатом. Откаты решают всё! Портирована работа с COM - automate.f от ~yz Как я понял, эта либа писалась достаточно давно. Иначе как объяснить наличие BL WORD COUNT вместо PARSE-NAME
[url=https://cloud.mail.ru/public/DgXL/maVWRjPBn]Нова 1.02, исходники, либы, портированный COM[/url]
Что изменилось? 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
Либу выложу позже. Когда ещё Нову и либы к ней пополню
Портировал библиотеку automate.f от ~yz на Нову Портирована она почти полностью. Исключение: цикл FOREACH и расшифровка ошибок (будут вылезать кракозябры). Работоспособность проверял бегло.
Как пользоваться СПФ-скими либами из Новы?
Надо подключить окружение: SPF/ENV+.F Всё, портированные либы будут корректно подключаться. Поскольку в Нове слов меньше, может потребоваться слой совместимости - файл WORDS.F (знаете, как назвать попонятней, предлагайте).
Как подключается automate
[code] SPF/ENV+.F WORDS.F ~YZ\LIB\AUTOMATE.F
[/code]
Либу выложу позже. Когда ещё Нову и либы к ней пополню
|
|
|
|
Добавлено: Сб май 05, 2018 14:09 |
|
|
|
|
|
Заголовок сообщения: |
Re: моя форт-система, которая потихоньку пишется |
|
|
Написал обёртку под обратный вызов ( callback ). Подскажите, на какой функции легче всего затестить обёртку на работоспособность?
Написал обёртку под обратный вызов ( 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а купировать. т.к. мой вариант всё таки требует кол-во параметров, а СПФ-ский нет
NOVA-forth версия 1.02
29.04.2018 Добавлены слова: [b]GET-CALL[/b] и [b]RECOMPILE[/b] . Последнее занимается [u](само)модификацией[/u] кода. Эти слова необходимы для реализации слов ниже. Слова [b]TO[/b] и [b]FROM[/b] работают через вызов обработчиков в запрашиваемых параметрических словах. Механизм записи и получения указателя переменных теперь может быть расширен при необходимости. Добавлено слово [b]WINAPI:[/b] Маленький шажок к СПФ-у - неплохой шаг к поддержке самомодификации кода. :^)
08.04.2018 Переписано слово [b]TASK>[/b]
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 вычисляют адрес параметрического слова и вычленяют из него при наличии соответствующие обработчики.
Как планирую решить проблему с масштабированием 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 писал(а): Возможное решение проблемы: а чем классика не угодила? (по сути решение стандартное, и, хотя пример из форка моего, который я таки классикой не считаю но, надеюсь, понятное) <Всякий разный rод> то есть несколько полей кода. ? Честно сказать, не додумался. А по факту отдать поведение с ёнтими словами самому параметрическому слову идея хорошая. К тому же при компилировании форт-системы это можно сделать уже легко. Но как красивей поступить с развёрткой параметрических слов? Чтоб к примеру константа в коде сразу превращалась число, а юзер-переменная в LEA EAX, 4 [EDI] У меня параметрические слова метятся флагами и потом отдельно развёртываются спец. словом. Думал над тем, чтобы отдать это на откуп самим словам, но это приведёт к созданию ссылок вперёд, чего бы не хотелось. Т.к. константы юзвери и переменные начинаются использоваться почти сразу, а компилирующие слова несколько позже. Груба говоря все слова с -CODE упразднять, использовать CREATE и DOES> с компилирующими словами, которых нет в начале форт-образа. Без ссылок вперёд не обойтись. А этого бы не хотелось.
[quote="mOleg"][quote="Victor__v"]Возможное решение проблемы:[/quote] а чем классика не угодила? (по сути решение стандартное, и, хотя пример из форка моего, который я таки классикой не считаю 8) но, надеюсь, понятное) <Всякий разный rод> то есть несколько полей кода. ?[/quote]
Честно сказать, не додумался. :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
то есть несколько полей кода. ?
[quote="Victor__v"]Возможное решение проблемы:[/quote] а чем классика не угодила? (по сути решение стандартное, и, хотя пример из форка моего, который я таки классикой не считаю 8) но, надеюсь, понятное) [code]\ создать инициализированную переменную, \ возвращающую по-умолчанию собственно значение. : 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 [/code] то есть несколько полей кода. ?
|
|
|
|
Добавлено: Вт апр 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 Что думаете по этому поводу?
Хочу обсудить такую идею. Вступление: В СПФ развёрткой параметрических слов и компиляцией слова TO занимается оптимизатор (предположительно). В Нове развёртка отведена отдельному слову, как и компиляция слова TO
Но оба варианта не очень хороши. Как минимум, они не масштабируются. А при расширении функционала это требуется. К примеру, чтобы можно было записать значение в лок. переменную используя TO. Или у нас появились новы сущности с коими хотелось бы аналогично работать. Переопределение слов в данной ситуации не кажется надёжным и правильным.
Возможное решение проблемы: Можем использовать таблицу, назовём её PARAMS-TABLE у неё будет 4 поля. Каждое их которых размером CELL. В первом столбце у нас само параметрическое слово (по нему всё ищется) В втором столбце у нас слово отв. за развёртку слова во время компиляции В третьем столбце у нас слово отв. за действие с параметрическим словом через TO В четвёртом столбце у нас действие с параметрическим словом через FROM (получить указатель на зн. переменной).
Естественно, "кушать" они будут указатели на переменную (на то, что за параметрическим словом).
При использовании слов TO и FROM будет вызываться перебор PARAMS-TABLE, который выдаст указатель на строку таблицы, где будут соответствующие указатели на код. Примерный код для TO [code]: 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[/code]
Это позволит гибче пользоваться словами 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-значения.
Стоит ли ещё разбирать строки с экспонентой? Стоит ли ещё дополнительно заморачиваться поддержкой исключений на плав. точке?
Код плаа-хой строки типа 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
[url=https://cloud.mail.ru/public/GXHa/4vviZE3vN]Исходники Новы[/url]
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 |
|
|
|
|