gudleifr писал(а):
Здесь мы имеем порочный круг. При реализации Forth на чистом Forth нужна, действительно, какая-то виртуальная Forth-машина. Но ее не реализовать на чистом Forth. Собрать из готовых частей? Но и их не написать на чистом Forth.
Мне достаточно было сэмулировать целевое адресное пространство.
Для этого, требуется чтобы инструментальное и адресное пространство не
накладывались друг на друга. Если накладываются, инструментальные средства
можно (на пример) перенести в другое место.
Переопределяю слова работающие с памятью - следующим образом:
Код:
: C! DUP THERE? IF T_C! EXIT THEN C! ;
: C@ DUP THERE? IF T_C@ EXIT THEN C@ ;
: ! DUP THERE? IF T_! EXIT THEN ! ;
: @ DUP THERE? IF T_@ EXIT THEN @ ;
: EXECUTE DUP THERE? IF TEXECUTE EXIT THEN EXECUTE ;
Где THERE? определяет принадлежность адреса целевой области.
TEXECUTE - перед передачей управления, целевое CFA заменяет на эквивалентное ему инструментальное
по средствам таблицы соответствия.
Целевой компилятор, при этом, будет представлять набор тех-же средств компиляции что и в целевой системе.
Этот-же механизм я использую для взаимодействия с удаленным устройством в распределенной форт-системе.
gudleifr писал(а):
Чем раньше мы разорвем этот круг и перейдем на язык ассемблера (пусть и встроенного в Forth), тем раньше это заработает.
Если встроенного ассемблера нет, то проще
минимизировать количество примитивов и представить их в виде:
Код:
: DUP
[
0x8D C, 0x6D C, 0xFC C, \ LEA EBP , -4 [EBP]
0x89 C, 0x45 C, 0x00 C, \ MOV 0 [EBP] , EAX
0xC3 C, \ RET
] ;
чем писать ассемблер.