Forth http://fforum.winglion.ru/ |
|
моя форт-система, которая потихоньку пишется http://fforum.winglion.ru/viewtopic.php?f=40&t=3125 |
Страница 2 из 7 |
Автор: | F-MAP [ Вт май 30, 2017 21:45 ] |
Заголовок сообщения: | Re: моя форт-система, которая потихоньку пишется |
И чего INCLUDED было не оставить.... |
Автор: | Victor__v [ Ср июн 21, 2017 14:34 ] |
Заголовок сообщения: | Re: моя форт-система, которая потихоньку пишется |
https://cloud.mail.ru/public/M31s/oTsZUNLQR Отлажен стек словарей, написана обёртка под внешний вызов ( винда ), написано слово интерпретации и механизм поддержки notfound-ов в словарях. Добавлены слова для навигации по словарю и слов.статье. Структура словаря изменилась. Добавлено 64-битное поле-маска для ускорения поиска. Ещё несколько служебных слов. А также слово для компиляции слов с параметрами ( вектора, переменные, константы ). Всё ещё не переписан механизм предкомпиляции ( требуется пара улучшений ), да и требования изменились, так сказать, стали мягче. В раздумьях над поддержкой "механизма" структур. Пока надо в одном месте. Реализуется просто, но нет особой необходимости в них. Есть мысли добавить стек форт-окружения. Но это уже на будущее. Осталось немного: внешняя ось-ная вещь ( вызовы, константы ), механизм предкомпиляции, да с заголовком exe-шника разобраться надо И ещё надо исходники причесать. А то уже теряется причинно-следственная связь 9 |
Автор: | Victor__v [ Пн июл 10, 2017 13:54 ] |
Заголовок сообщения: | Re: моя форт-система, которая потихоньку пишется |
https://vk.com/doc189457568_449128163 Отлажен механизм перехвата. Дополнен и также отлажен стек словарей ( GET-ORDER SET-ORDER ) Написаны обёртки под некоторые операции с файлами ( пока читать, писать, размер ) Примечательно, что обёртки пишутся на стековом манипуляторе Код: : READ-FILE(std) \ addr kv h -- size err|0 2/(33x3^4R<)34120 ReadFile API-ERR R> SWAP ; Так манипуляций со стеком меньше, да и понятней стало Написана трансляция исходных файлов. Осталось написать механизм предкомпиляции, отладочные слова, обёртки и инициализацию и ещё pe-формат изучить немножко. Что-то с каждым разом остаётся всё больше и больше Всё ещё в раздумьях над реализацией стека окружений. Без этого стека текущий код подключения выглядит "многообещающе" Код: : INCLUDE-FILE \ ADDR U -- ?? -1|0 MOVE->R 2DUP FILE-EXIST IF TRANSLATE-FILE ELSE S" DEVEL/" 1/(2#R0-)1R0 0/(2^0^)0 MOVE 0/(3#30+2#1R<2^)013 2DUP FILE-EXIST IF 3/10 TRANSLATE-FILE ELSE 2DROP 1/(2#R1<2^)10 S" SCRIPT/" 1/(2#R0-)1R0 0/(2^0^)0 MOVE 0/(3#30+2#1R<2^)013 2DUP FILE-EXIST IF 3/10 TRANSLATE-FILE ELSE 2DROP 2DROP 0 0/(R#) EXIT THEN THEN THEN -1 0/(R#) ; В этом коде заметил косяк стекового манипулятора. Нельзя писать 0/(...)234(...) Ввиду того, что стек модифицируется повторно. И код на выходе некорректен. Надо тогда писать так 0/(...)234 0/(...) По логике, оба манипулятора должны генерить один и то же код. Но в реале первый сбоит. Эх, буду фиксить. В архиве помимо исходников строящегося форта есть мои либы, которые используются в служебной части. ассемблер, манипуляторы, преобразование, стек с плав.точкой и пр. |
Автор: | Victor__v [ Сб сен 16, 2017 13:03 ] |
Заголовок сообщения: | Re: моя форт-система, которая потихоньку пишется |
https://vk.com/doc189457568_452212114 Тек.состояние. Добавлен стек окружений. Отлажен. Переписан механизм трансляции см тему http://fforum.winglion.ru/viewtopic.php?f=8&t=3139&p=44148#p44148 Отлажены слова USER-CREATE-CODE, CREATE-CODE Какая-то непонятка с ассемблером. [EBX] JMPr - работает раз через 2 . А EBX [EBX] MOVr-r EBX JMPr - работает стабильно. Что за фигня в ассемблере интела? Ещё была замечена неработающая связка AL [EDX] CMPr-r или [EDX] AL CMPr-r . Стоило поменять 8-битный регистр и всё заработало. Почему-то. Потом ещё раз проверил с AL, работает. Хрень какая-то. Ещё было замечено странное поведение в переходах. Может просветит кто-нть? Если сравнить на больше/меньше память и 8-битный регистр, то флаг не корректен. А если местами поменять регистры, то всё работает штатно. Сменил ассемблер. Из-за этого в моём форте временно отключена поддержка стека с плав.точкой. Печать также частично отлажена. Добавлено 2 слова для сохранения зн.переменных на стеке возвратов и их восстановление при откате. Добавлено ССКИС ( сопрограмма сделанная крайне извращённым способом ) см. SRC2\FORTH\MID\CATCH.F слово TO-CATCH SRC2\FORTH\TOP\TRANSLATE.F там повсеместно Там же решена проблема мн-ных точек перехвата чуть менее извращённым способом. Ну куда деваться? Есть сопрограмма, делай и goto. Чуть переписан интерпретатор. Некоторые комментирующие слова надобно переписать. Дабы трансляцию перезагружали. Из-за добавления ССКИС возникает заморочка по параметрам в перехвате исключений. CATCH при опр.условиях получает два значения вместо одного. Что может привести к неприятностям. К примеру, надо перезагрузить трансляцию, а перехват стоит не на интерпретаторе! Будем думать. Зато нет типизации источника данных как в СПФ или в Форке. ( можно посмеяться ) Чуть отлажена компиляция SRC2\FORTH\MID\COMPIL.F Отключена проверка наличия слов по маске, временно. |
Автор: | Victor__v [ Сб сен 16, 2017 13:12 ] |
Заголовок сообщения: | Re: моя форт-система, которая потихоньку пишется |
Ещё добавлен механизм предкомпиляции. Осталось: Ос-зависимые вещи. PE-формат, отладка основных слов. К примеру SFIND-IN-VOC тестировался, а SFIND нет. |
Автор: | Victor__v [ Сб сен 30, 2017 15:01 ] |
Заголовок сообщения: | Re: моя форт-система, которая потихоньку пишется |
Тек.состояние Переписана трансляция файлов и пр. Теперь всё гораздо проще и логичней. Почти как в СПФ только без типизации источника. Добавлено несколько новых слов. В т.ч для работы с файлами ( OPEN CREATE CLOSE и пр ) Введены пользовательские вектора. Сейчас только один вектор в системе - REFILL Обновлена сервисная часть. Теперь есть спец.словарь из которого ЦК берёт особые слова для компиляции ( циклы условия, операции с вход.потоком и пр. ) В сервисной части обновлён механизм предкомпиляции. Что позволило сделать код в строй.системе чуть оптимальней ( убрано лишнее стеко-махание в некоторых местах ). Эффект, однако, минимальный. Тому 2 причины: 1) Везде где может быть тотальный стековый ахтунг используется стековый манипулятор 2) Было написано лишь 3 обработчика для предкомпиляции. https://vk.com/doc189457568_452945871 |
Автор: | Victor__v [ Чт окт 05, 2017 13:21 ] |
Заголовок сообщения: | Re: моя форт-система, которая потихоньку пишется |
https://vk.com/doc189457568_453178623 Текущее состояние. Вся нужная ОСь-ка написана ( многозадачность, хип ) Написано несколько оптимизаторов-обработчиков предкомпиляции. Написаны были ради интереса. Каждый пишется минут по 5 и экономит на весь код байт ~15 . Впрочем, с глазковой оптимизацией закончил. Всё равно из-за стекового манипулятора оптимизировать-то и нечего почти. Просматривал код нижнего уровня и нашёл ошибку. У меня за каким-то лешим указатель на кодофайл берётся из CONTEXT. Исправил. Теперь как и задумывалось из CURRENT. Код перевёл в высокий уровень. Что осталось? PE-формат, дописать инициализацию, убрать из исходников невостребованные побеги творчества, добавить форт-ништячки без которых можно, однако ж неудобно писать и отлаживать иногда. HEX DECIMAL POSTPONE и пр. Допилить свой ассемблер ( всё лень про поддержку float в документации прочитать ) и заново ввести несколько слов для операций с float-стеком А потом тотальная отладка P.S. Ещё имеется мысль засунуть некоторые слова по словарям или ещё как-то избавиться от них К примеру, поиск по записям предкомпиляции с условием нафиг не сдался в основном словаре, как и почти все константы от Винды |
Автор: | Victor__v [ Вт окт 17, 2017 22:58 ] |
Заголовок сообщения: | Re: моя форт-система, которая потихоньку пишется |
В настоящий момент размышляю над полным перебором всех слов во всех словарях форт-системы. Необходимо также позаботиться о возможности цикличности словарей. Словарь FORTH к примеру. Естественно, предусматриваем крайний вариант - большая вложенность словарей и их паранормальные взаимоотношения. Нам понадобится слово для работы со множествами - включить элемент в множество Цитата: \ приставка S означает STACK : SSET-IN \ elem1 elem2 ... elem-n n zn -- elem1 .. elem-n zn n+1| elem1 ... elem-n n ; Алгоритм на данный момент: 0) создаём новую обитель для стека контекста и переносим элементы туда 1) дублируем элементы стека словарей на стек данных и получаем множество ( логически ) 2) находим все словари в списках стека контекста, и включаем в множество на стеке данных 3) если количество словарей во множестве и на стеке равно, выполняем переборный код и уходим из слова 4) заносим полученное множество в стек контекста переходим к п. 1 Тормоза, но зато железобетонно. Да и скорость тут не критична. |
Автор: | mOleg [ Ср окт 18, 2017 20:50 ] |
Заголовок сообщения: | Re: моя форт-система, которая потихоньку пишется |
Victor__v писал(а): В настоящий момент размышляю над полным перебором всех слов во всех словарях форт-системы. интересно, нафига? ну, перебор всех слов в одном словаре понимаю, а вот вообще всех зачем? |
Автор: | Victor__v [ Ср окт 18, 2017 22:49 ] |
Заголовок сообщения: | Re: моя форт-система, которая потихоньку пишется |
Благодарю за убор дубляжа. mOleg писал(а): Victor__v писал(а): В настоящий момент размышляю над полным перебором всех слов во всех словарях форт-системы. интересно, нафига? ну, перебор всех слов в одном словаре понимаю, а вот вообще всех зачем? Я предвидел этот вопрос Этот перебор позволяет решить несколько проблем. 1) Обнулить данные в WINAPI-словах. Использование отдельного списка для оных, хоть и решает проблему, но мешает их определению во врем.словарях т.к. цепочку рушится при очистке. 2) Инициализация таблицы предкомпиляции. Т.к. при старте форт-системы таблица пуста и есмь кусок хипа, то необходимо её заполнить словами предкомпиляции. Откуда их взять? Можно создать отдельный список адресов, который скармливаем таблице. Короче, у этого подхода проблема озв. в п 1). Можно понасотворять слов пополнения и пр. Но с перебором проще. Форт как-никак будет расти, а растущему организму нужно хорошее питание |
Автор: | Victor__v [ Ср окт 18, 2017 22:58 ] |
Заголовок сообщения: | Re: моя форт-система, которая потихоньку пишется |
Цитата: : xt-WORDS-CONTEXT \ xt -- \ xt: LFA -- VOC0 @ CONTEXT 2>R >R BEGIN RP@ CELL + @ @ L>LLFA @ >R BEGIN R@ WHILE R@ RP@ CELL+ @ EXECUTE R> @ >R REPEAT RDROP R> 2R@ = IF RDROP RDROP DROP EXIT THEN R> CELL- >R >R AGAIN ; \ найти и включить словарь в множество : (xt-vocs-words) \ set LFA -- set|set-upd L>CFA @ >R R@ ['] VOC-CODE CALL-in-addr? IF R@ param @ SSET-IN THEN RDROP ; : xt-ALL-WORDS \ xt \ xt: LFA -- GET-ORDER \ готовим словари для перемещения ['] THROW >R \ если ошибка в xt, поймаем VOC0 FROM CONTEXT 2 N>KEEP \ сохраняем зн.переменных для отката 300 CELLS RALLOT ['] (free-R) >R \ делаем массив откатным DUP VOC0 ! TO CONTEXT SET-ORDER >R \ xt операция возможно лишняя, но так спокойней BEGIN GET-ORDER ['] (xt-vocs-words) xt-WORDS-CONTEXT \ словари в стеке и множестве равны ? CONTEXT VOC0 @ - CELL+ CELL / OVER XOR >R SET-ORDER R> 0= UNTIL \ если да выполняем перебор R> ['] xt-WORDS-CONTEXT CATCH \ тут наступает откат. Т.е стек контекста восстановится \ если кому-то понадобится исходный стек контекста \ извращайтесь с CATCH и HANDLER ; Вот как-то так. Тормоза однако, как и говорил |
Автор: | Victor__v [ Пн окт 23, 2017 21:03 ] |
Заголовок сообщения: | Re: моя форт-система, которая потихоньку пишется |
https://vk.com/doc189457568_454154687 Что изменил? Нашёл забавную ошибку. Оказывается в моей системе не было слова XOR Добавил ништячки POSTPONE DECIMAL HEX Пересмотрел поиск в словаре. Самое глобальное изменение - в словаре 4 цепочки поиска вместо 1-ой. Как всё работает? На входе указатель на строку и длина строки От строки находится хеш. Этот хеш является идентификатором слова во всём словаре! После с этим хешом происходит операция 3 AND CELLS т.е. получаем смещение ( +0 +4 +8 +12 ). Оно влияет на используемую цепочку. После выбора цепочки в ней производится поиск слова по хешу-идентификатору. Ещё заметил логический косяк. SFIND вызывал SFIND-IN-VOC и это слово хешировало строку при каждом вызове! Тормоза, однако-ж. По этой причине добавил слово HASH-IN-VOC ( возможно стоит переименовать ) и изменил слово SFIND Теперь строка хешируется один раз! а HASH-IN-VOC осуществляет по нему поиск. Также переправил WORDS . Вот вывод в кач-ве примера: Цитата: thread-1 DECIMAL .SN OK FORTH-VOC-NOTFOUND INCLUDED INCLUDED-DEPTH INTERPRET REFILL DOES> VALUE TERMINATE ExitThread Sleep CreateThread TASK> RESIZE CREATE-HEAP THREAD-HEAP HeapFree HeapAlloc HeapCreate ReadFile GetProcAddress FILE-EXIST OPEN-FILE-SHARE READ-FILE POSTPONE FROM ['] [CHAR] ENVIR-DROP >ENVIR NOTF-(CHAR) NOTFOUND-GENERATE ALIGN-NOP ] INLINE(ret) INLINE(pop) EVENT-RP@ rec.find.xt-e find-rec-cond str>group-name EVENT-TABLE rec-event sp-h SHEADER(std) WHILE BEGIN HERE L>HFA ! SSET-IN COUNT COMPARE SEARCH <> = AND LSHIFT - HASH STR>NUM GET-ORDER SET-ORDER RALLOT RP! R@ SP@ OVER NIP 2SWAP VOC-CODE H-STDOUT H-STDIN DEPTH LAST-LFA VOC0 R0 CURRENT STATE EXECUTE NOOP CELL TRUE 'TAB' BL CELL- 1- USER-CREATE-CODE USER-VECT-CODE words in thread: 90 thread-2 TYPE(std) . INCLUDE-FILE TRANSLATE-FILE TRANSLATE-CONSOLE USER-CREATE USER-VECT :NONAME : PAUSE ResumeThread SuspendThread START ALLOCATE DESTROY-HEAP HeapReAlloc HeapDestroy OPEN-FILE(std) WRITE-FILE(std) CLOSE-FILE API-ERR R/W R/O MEM_COMMIT Stdcall: CLOSE-FILE TO ->parse-data parse-data-> ParseBuff ParseBuff.simb SFIND-IN-VOC INIT-STACK&USER ALIGN-SIZE EVENT-WORD INLINE COMPILE, LIT, mark-delete-ev group-name SHEADER Name-head(slit,) COMP? ELSE IF S, W, C, L>hereFA L>countFA W@ C@ MOVE->R > MOD * usign }num KEEP DEFINITIONS PREVIOUS 2R@ SP! 2OVER DROP USER+ USER-OFFS CONTEXT-SPACE S0 >param 2- CREATE-CODE VECT-CODE CONST-CODE VARIABLE-CODE words in thread: 75 thread-3 xt-ALL-WORDS (xt-vocs-words) xt-WORDS-CONTEXT HEX \EOF WORDS ." LT TYPE REQUIRE TEMP-WORDLIST TEMP-WL-SIZE VOCABULARY RECURSE EXIT ; LATEST-CODE CREATE VECT VARIABLE CONSTANT STOP TerminateThread FREE CREATE-FILE CreateFileA WriteFile GetFileAttributesA GetLastError LoadLibraryA W/O FILE_CURRENT FILE_BEGIN FILE_ATTRIBUTE_ARCHIVE INVALID_HANDLE_VALUE OPEN-FILE WRITE-FILE ' CHAR PARSE ParseBuff_t >IN ENVIR-P ENVIR0 ENVIR-SPACE HASH-IN-VOC ALIGN LAST-CHAR IMMEDIATE [ CALL-in-addr? INLINE-COMPILE, EVENT-COMPILE, EVENT-TO-GROUP ->EVENT-GROUP ->EVENT rec.find.xt-e.set sp-ev gr-h CATCH DP DP[cdf] L>notfoundFA L>NFA L>FFA W! C! ASCIIZ> XOR INVERT NEGATE RSHIFT / + HASH(LY) sign-n num>s{ (free-R) RDROP R> >R ROT 2DROP DUP USER-ALLOT USER-SIZE DATA-STACK-SIZE CONTEXT FALSE CELLS CELL+ 2* 1+ 1+! USER-VALUE-CODE USER-CODE words in thread: 96 thread-4 ( \ OK(std) ORDER S" EMIT CR (REFILL-FILE) Buff.size (REFILL-CONSOLE) EVALUATE notfoundFA(default) USER-VALUE USER HEADER RESUME SUSPEND OPEN-FILE-SHARE(std) READ-FILE(std) CloseHandle FILE-EXIST(std) GetStdHandle OPEN_EXISTING CREATE_ALWAYS MEM_RESERVE PAGE_EXECUTE_READWRITE (stdcall) API-CALL init-API GET-STD-HANDLE PARSE-NAME SkipDelimiters NOTF-(VOCS::??) SFIND ALIGN-TO SPLIT FFA-COMPILE, TO-comp, params-COMPILE, RET, EVENT-EXIT NEW-GROUP rec.find.group-name new-event-rec gr-e NAME-head VOC-TH STACK? THROW UNTIL REPEAT AGAIN THEN ALLOT L>LLFA L>CFA @ FILL MOVE 0= < OR ABS /MOD N>KEEP ALSO RP@ NR> N>R 2R> 2>R PICK SWAP 2DUP LFA-FIELD BASE HANDLER 2/ 2+ 0! SLIT-CODE VALUE-CODE words in thread: 82 words: 343 Переписал подключение файлов в сторону лучшей читаемости и большей тормознутости. Один R@ CELL+ ASCIIZ> чего стоит, но зато в случае успеха добавил выравнивание стека возвратов. Пред.вариант закомментировал. |
Автор: | Victor__v [ Сб окт 28, 2017 03:37 ] |
Заголовок сообщения: | Re: моя форт-система, несколько слов о переиспользовании код |
Пишу я значит инициализацию таблицы предкомпиляции. И тут чувствую, жаба душит два слова на это тратить. Там получается обёртка и каллбек. И начал думать, как бы сжать до одного слова. У Profit'а есть подобное решение мне однако ж неподходящее. Решил задействовать ранее написанный пераметрический код. Вот что вышло: Код: : EVENT-INIT ['] xt-ALL-WORDS >R [CALL] VARIABLE-CODE \ [call] для читаемости. \ это получается лямбда \ LFA -- >R R@ L>FFA W@ &EVENT-WORD AND IF R@ L>CFA @ new-event-rec DROP THEN RDROP ; [CALL] это [COMPILE] в СПФ, реализовано также. Заменил 3-4 места на связку с этим словом. Странное дело, слово не так уж и востребовано. И по факту его назначение подавление дополнительных возможностей ( immediate ). Но всё равно это короче связки ['] word EXECUTE |
Автор: | Victor__v [ Вт окт 31, 2017 20:15 ] |
Заголовок сообщения: | Re: моя форт-система, которая потихоньку пишется |
Вот размышляю, а было б хорошо, если б... Грубо говоря, идеи на будущее. В свой первую версию форта носить не буду, надеюсь. А то есть стек окружений, хватит Идея первая. Возможность ссылаться на исходники по расположению предыдущих исходников. М, да. Понятно объяснил... На примере будет более понятно: подключаем файл dir1/dir2/test.f в dir2 у нас есть несколько файлов. пусть там у нас будет файл x.f В исходнике test.f первой строкой идёт подключение файла x.f без указания директории. И хочется, чтобы это работало. В моём случае это сделать можно просто. Благо, есть стек окружений. Только его необходимо будет расширить. Добавить сложение путей. И их проверка на реальность. Варианты: 1) линейно-откатный. При установлении реальности файла, расчленить путь и сам файл, путь положить на стек окружений. В стек возвратов всунуть ENVIR-DROP . Всё. Недостатки: Нужен контроль за стеком. Т.к. стек под строки имеет скромные размеры, ибо не фиг, вложенность не может быть большой. Если в файле есть операции со стеком окружений, то они в лучшем случае будут некорректны в случае не парности. 2) Пространственно-откатный. При установлении реальности файла, расчленить путь и сам файл. ВЫДЕЛИТЬ память под стек окружений, перенести указатели этого стека на память и поставить на откат. Загрузить в новую обитель стека значения по умолчанию ( прямо из ENVIR-SPACE ). Недостатки: А лицо человека не треснет при каждом вложении выделять память? Особенности: 2.1) Работа с подпространством директорий. Если у нас путь dir1/test.f , то мы сможем брать файлы только из dir1 и вложенных в него каталогов. А файлы в вложенных в dir1 каталогах уже не смогут ссылаться на dir1. 2.2) Откатность стека исключений. Если мы манипулируем им, то при завершении трансляции вся работа с ним пропадёт. 3) Объектно-откатный. Тоже, что и вариант 2) только стек исключений "спискофицируется". В начале памяти под стек окружений есть ссылка на пред.обитель стека окружений. Наследование Недостатки: А лицо человека не изойдёт пеплом при каждом вложении выделять память и создавать список используемых каталогов? Особенности: 3.1) ООПа 3.2) Присутствует недостаток 2.2) ,но он устраняем расширением набора слов под стек окружений. Идея вторая: Храним строки от S" полученные в режиме интерпретации в стеке возвратов. Т.к. в СПФ строки хранятся в области разбора, то при обновлении буфера, данные становятся некорректными. Хранение в стеке возвратов сохраняет корректность данных вплоть до окончания трансляции. Делается легко, и в отладке такая мелочь пригодится. Недостатки: если создавать строки в консоли, то происходит утечка памяти на стеке возвратов. Лечится легко: PHP-FAST-LANG или любое-число THROW |
Автор: | vikt [ Вт окт 31, 2017 23:12 ] |
Заголовок сообщения: | Re: моя форт-система, которая потихоньку пишется |
А что есть стек окружений? У меня от VK потерян пароль. |
Страница 2 из 7 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |