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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: Контекст записи. 1 вместо множества
СообщениеДобавлено: Вс сен 10, 2017 23:51 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1285
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Вводная.
Транслировать файл иногда приходится с некоторыми условиями ( врем.словари, система счисления и тд)
Что в итоге получается
Код:
BASE @ HEX
...
...
BASE !


А хочется делать иначе и проще.
К примеру,
[BINARY]
\ какой-то код
конец файла

Моё решение:

Код:
: [BINARY]
   R> BASE @ >R 2 BASE ! EXECUTE R> BASE !

;


Код меняет систему счисления и вызывает слово выше по иерархии в данном случае интерпретатор.
Можно использовать некоторые слова из набора по бектрекингу, а именно слова KEEP и KEEP!
В конкретном примере всё ещё проще можно записать
Код:
0x2 BASE KEEP!
\ какой-то код


Значение также восстановится при конце трансляции.

Одна беда, это накладывает ограничение на сам механизм трансляции!
Хорошо, если файл транслируется целиком.
Особенность трансляции файла кусочками привносит такой же "кусочковый" эффект сохранения контекста в файле.
Тут контекст есть, а уже тут он становится прежним.
Это не дело. Но и целиковая трансляция не везде подходит.
Вот оно Противоречие, которое надо решить.
Осталось узнать как.

Как говорится, хочется сдвига при минимуме усилий и новшеств.

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Контекст записи. 1 вместо множества
СообщениеДобавлено: Чт сен 14, 2017 00:56 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1285
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Код:
USER-VALUE transl-H
USER INCLUDED-DEPTH

512 CONSTANT file-trans-size

: TRANSLATE-FILE \ addr u -- ??
INCLUDED-DEPTH @ 64 > IF -2012 THROW THEN

INCLUDED-DEPTH 1+!

OPEN-FILE-SHARE THROW TO transl-H
file-trans-size CELL+ RALLOT
['] (free-R) >R            \ теперь код откатный
TO ParseBuff
>IN 0!

ParseBuff file-trans-size

BEGIN
transl-H @ READ-FILE THROW
DUP 0= IF            \ если читать больше нечего
               \ заканчиваем трансляцию
   DROP
   transl-H CLOSE-FILE THROW
   EXIT
   THEN
TO ParseBuff.simb

SkipDelimiters
ParseBuff >IN @ +
   ParseBuff.simb >IN @ -
0xA >R RP@ 1 SPLIT RDROP   \ уменьшаем зону трансляции
   IF
      2DROP
        NIP
      TO ParseBuff.simb
   ELSE
      2DROP \  сюда код для коррекции содержимого надо будет потом
   THEN

BEGIN               \ ЦИКЛ ИНТЕРПРЕТАЦИИ
STACK?
PARSE-NAME DUP WHILE
SFIND IF
      STATE @ IF FFA-COMPILE, ELSE NIP EXECUTE THEN
    ELSE NOTFOUND-GENERATE
    THEN
REPEAT
2DROP

ParseBuff ParseBuff.simb +    \ вычисляем адрес и размер
file-trans-size  ParseBuff.size -   \ области для обновы
2>R                     \ трансляции
2R@ ParseBuff SWAP MOVE
2R>
AGAIN
;


Как-то так. Код ещё не тестировался.
Однако, решение выглядит достаточно объёмным. К тому ж пришлось засунуть сюда интерпретатор.
Возможно, найдётся решение попроще.
Уже из кода выкинул все необходимые сохранки. Пусть об этом заботится вызывающая процедура.

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Контекст записи. 1 вместо множества
СообщениеДобавлено: Чт сен 14, 2017 04:10 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
Просто расширить идеологию CATCH THROW. Чтобы при завершении интерпретатора, вызванного по CATCH, откатывалось бы не только значение указателя стека, но и контекст рядышком со старым указателем стека в там-же в стеке сохраненный. Тогда получится сколь угодно вложенная конструкция с изменением контекста. В старых фортах в конце каждого экрана ставилось ;S чтобы подсасывать и запускать на интерпретацию следующий экран. Можно определить ;S как "безусловно выкинуть исключение с откатом контекста : ;S зарезервированный_для_нашей_системы_код_исключения THROW ;" и ставить в концах файлов, тогда эту систему не свалят даже ошибки в компилируемых текстах с глубиной стека. Чужие исключения эта система должна молча пропускать наверх, поскольку это ошибки в исходниках и их надо отдать интерпретатору QUIT чтобы он выругался соответствующей ошибкой. В общем, рекурсивный вызов интерпретатора с сохранением контекста и откатом контекста, если вложенная интерпретация завершилась безо ошибок.
Вот примерно такое мне приходит в голову.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Контекст записи. 1 вместо множества
СообщениеДобавлено: Чт сен 14, 2017 11:04 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1285
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Кажется мы говорим немножко о разном.
С интерпретатором как таковых проблем нет.
Слова меняющие контекст просто укладывают за (в) код интерпретатора некоторые финтифлюшки.
Вот к примеру. R: I -- 0x10 base ~keep I-next
где I - это вызов в интерпретаторе по execute
~keep - это указатель на остаток кода по восстановлению контекста
I-next -код за execute .

Здесь перехват исключений нужен, ежели что-то пошло не так. Прибраться-то надо в случае ЧП. Это факт.
Как вариант сместим указатель стека возвратов на последний откатный код
HENDLER RP@ ! одним словом.

Проблемка немножко в другом.
Когда разбираем файл по кусочкам, интерпретатор каждый раз прерывается, чтобы загрузить следующий кусочек для разбора.
Вот тут-то и проблема.
при таком строении R: я-тут-загружаю-файл-кусками откатная-хрень интерпретатор
Завершение интерпретатора восстанавливает контекст преждевременно .
А в коде выше, интерпретация и загрузка данных объединены в одно действие, что позволяет этого избежать.

Можно ещё попробовать сделать сопрограммами. Как раз похожий случай. Только локально из-за стека возвратов это сделать проблематично. А разводить лишних юзверей значит потерять понятность кода.

Хотя...
Можно модифицировать сам интерпретатор добавлением нового слова
назовём его TO-CATCH \ перейти к слову, которое экранирует ошибки, дать указатель стека и нейтральный код ошибки
Код:
: TO-CATCH
R>
HANDLER RP!
DUP >R
-1
;


А в коде выше мы просто перехватим этот код. Т.к. указатель уже восстановлен мы спокойно вытаскиваем из сохр.значений id-файла, восстанавливаем ук.стека перезагружаем источник трансляции и прыгаем на интерпретатор.
Примерно это имелось в виду?

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Контекст записи. 1 вместо множества
СообщениеДобавлено: Чт сен 14, 2017 14:06 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
Видимо вопрос сильно зависит от реализации конкретной Форт-системы.

Я имел ввиду что-то типа определить облегченную версию интерпретатора QUIT , которая не очищала бы стек вовзратов, не ловила бы исключений. А потом вызывать ее через CATCH вот примерно так :
Код:
: (QUIT)
  BEGIN
    QUERY INTERPRET
    ." Ok" CR
  AGAIN
;
: [SAVE-CONTEXT]
  BASE @
\ ...
  ['] (QUIT) CATCH >R
\ ...
  BASE !
  R> DUP -5000 = IF DROP ELSE THROW THEN
;
: [RESTORE-CONTEXT]
  -5000 THROW \ Код -5000 резервируем для исключения на восстановление контекста
;

[SAVE-CONTEXT] После [SAVE-CONTEXT] остаток строки игнорируется
HEX
: TEST 5 5 + . ;
TEST
[RESTORE-CONTEXT]
TEST
BYE
Прогон на моем Форте:
Код:
[SAVE-CONTEXT] После [SAVE-CONTEXT] остаток строки игнорируется
HEX
Ok
: TEST 5 5 + . ;
Ok
TEST
A Ok
[RESTORE-CONTEXT]
Ok
TEST
10  Ok
BYE

Здесь парами [SAVE-CONTEXT] [RESTORE-CONTEXT] можно создать сколь угодно вложенное, а если произойдет ошибка, то она улетит к настоящему QUIT

Как вариант на коленке.


Последний раз редактировалось Ethereal Чт сен 14, 2017 15:02, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Контекст записи. 1 вместо множества
СообщениеДобавлено: Чт сен 14, 2017 14:57 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1285
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Как понимаю вещи по сохранению и откату надо будет складывать в [SAVE-CONTEXT] ?
переменные там, вектора и пр.
Однако ж пара так же может привести к ошибкам
Хотя вместо множества пар будет одна это весомый плюс, но не лучше ли пойти дальше?
К примеру определим в начале файла следующее
Код:
\ какой-то файл
BASE KEEP HEX
LOCALS-LIBRARY \ врем.словарь позв. пользоваться локалками. По завершении трансляции текущ.файла самоудалится.

: Di { a b c }
  b b * a c * 4 * -
;


Расширение функционала, работа за кадром, вложенность. Вот что хочется
Надо лишь с особым чувством гармонии написать форт-ядро :)

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Контекст записи. 1 вместо множества
СообщениеДобавлено: Чт сен 14, 2017 15:03 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
Тогда сначала просто определись по какому событию должен сохраняться контекст, а по какому восстанавливаться ? А реализация придумается.

Или ты хочешь так : если в начале файла указать KEEP-CONTEXT , то он запомнит контекст, а по его окончании автоматически именно его восстановит. При этом файлы можно будет по INCLUDED друг в друга вкладывать ?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Контекст записи. 1 вместо множества
СообщениеДобавлено: Чт сен 14, 2017 15:53 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1285
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Именно так

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Контекст записи. 1 вместо множества
СообщениеДобавлено: Чт сен 14, 2017 15:56 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1285
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Цитата:
то он запомнит контекст, а по его окончании автоматически именно его восстановит

Именно так. Проблема в трансляции файла кусками интерпретатор необходимо сбрасывать. Если транслировать файл целиком, то такой мороки уже нет, это и так работает.

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Контекст записи. 1 вместо множества
СообщениеДобавлено: Пт сен 15, 2017 13:44 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1285
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Не тестировалось
Код:
: TRANSLATE-FILE \ addr u -- ??
INCLUDED-DEPTH @ 64 > IF -2012 THROW THEN
parse-data-> INCLUDED-DEPTH 4 N>KEEP
INCLUDED-DEPTH 1+!

OPEN-FILE-SHARE THROW
0/R0
1024 CELL+ RALLOT TO ParseBuff
0 TO ParseBuff.simb
>IN 0!
0/0^
SWAP >R ['] (free-R) >R         \ теперь код откатный

ParseBuff 1024 ROT
0 TO ParseBuff.simb
BEGIN
>R
R@ READ-FILE THROW
DUP 0= IF            \ если читать больше нечего
               \ заканчиваем трансляцию
   DROP
   R> CLOSE-FILE THROW
   EXIT
   THEN
RDROP
ParseBuff.simb + TO ParseBuff.simb

ParseBuff ParseBuff.simb 0xA
2/33x3d21+2dB0..2&?'=Js2d1dU3iJr13 \ обрезать с конца зону трансляции до первого всреч. каретки
IF TO ParseBuff.simb
ELSE
   DROP \ значит здесь слово занимает весь буфер
THEN

['] INTERPRET CATCH
DUP -4000 <> IF
       DUP 0= IF DROP EXIT THEN
       THEN
RDROP \ R: ... ~to-catch -- ...
DROP
2 CELLS + @

ParseBuff ParseBuff.simb +    \ вычисляем адрес и размер
1024 ParseBuff.simb -         \ области для обновы
2>R                  \ трансляции
2R@ ParseBuff SWAP MOVE
2R> ROT
AGAIN
;



Тестировалось
Код:
\ ~сatch
\ SP
\ last-handler
\

\ выполнить безусловный переход по адресу после CATCH
\ вернуть указатель стека возвратов до CATCH и код -4000
\ на стеке возвратов адрес за словом TO-CATCH
HEADER TO-CATCH   \ мне проблематично описать тут стек.диаграмму.
   EBP 2 CELLS NEGATE LEA+-
   CELL [EBP] EAX MOVim-r-r
   ECX ' HANDLER 5 + @ [EDI] MOVr-im-r
   EBX 2 CELLS [ECX] MOVr-im-r
   ECX 3 CELLS LEA+-
   [EBP] ECX MOVr-r
   EAX -4000 MOVr-im
   EBX JMPr


[/code]

Последнее слово стоит в интерпретаторе. Если транслировать нечего прыгаем на CATCH и разбираемся уже там.
Тек. проблемы:
Корректность отката в случае ошибки. Т.к. механизм перехвата исключений уже задействован, то лучше действовать без него.
В1) - ничего не делать
В2) а хрен его знает.

Множественность точек восстановки CATCH . Т.к. трансляция перезагружается n-раз ( дано по условию ), то и восстановление переменной HANDLER будет повторяться n-раз. Из-за чего будет выполняться лишний участок кода
Цитата:
DUP -4000 <> IF
DUP 0= IF DROP EXIT THEN


В1) ничего не делать. Пусть есть неприятная побочка, но работает же
В2) при переходе по TO-CATCH, убрать последний элемент цепочки исключений. В освободившиеся пространство засунуть ['] NOOP

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Контекст записи. 1 вместо множества
СообщениеДобавлено: Сб сен 16, 2017 13:16 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1285
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Хм, можно по логике и без изголений с перехватом.
Нужны лишь переменная и два слова установки. Вот и всё поддержка сопрограмм

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

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


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

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