我如何编译到任意内存并在 Forth 中执行它?
How do I compile to arbitrary memory and execute it in Forth?
我对测试 Gforth 的一些限制很感兴趣,并且想让它执行我“手动编译”到分配的内存中的任意代码。这是我的尝试。
100 cells allocate throw constant &mem
\ store at &mem: docol: . EXIT
docol: &mem !
comp' . &mem 1 cells + ! drop \ drop "execution token"
comp' EXIT &mem 2 cells + ! drop
42 \ something to print
&mem execute
不幸的是,这失败了:
in file included from *OS command line*:-1
notes/execute.fs:8: Invalid memory address
&mem >>>execute<<<
Backtrace:
EFC61175B28 execute
I have to use comp'
instead of '
, because it doesn't work for getting the xt of EXIT
.
我认为这应该可行,除非 Gforth 不像 JonesForth 那样以任何方式运行 docol:
开始执行它旁边的 xt。
一般来说,这在 Gforth 或 ANS forth 中可能吗?
您可以执行任意的 xt 列表,但您必须使用自己的词来执行此列表,方法是对列表中的每个 xt 应用 execute
。
根据当前 standard,标准程序无法将任意代码编译到分配的内存中。该程序只能编译成字典的代码space,并且在当前定义的框架中(即尚未完成)。可以通过 compile, ( xt -- )
或 postpone ( i*x "name" -- j*x )
字执行编译。还有单词 literal
、2literal
、sliteral
、fliteral
(或它们的对应词 lit,
、2lit,
、slit,
、flit,
) 可用于编译文字。
在 Gforth 中,您还可以编译成另一个字典(“部分”),可以使用单词 extra-section ( size "name" -- )
.
进行分配
10000 extra-section execute-in-my-section
\ execute-in-my-section ( i*x xt -- j*x )
unused cr . \ free space in the default dictionary
[:
unused cr . \ free space in the current section
:noname
postpone .
postpone ;
( xt-new )
unused cr . \ free space after compile the new definition
;] execute-in-my-section ( xt-new )
\ test
123 swap execute
另请参阅 section.fs source, and Sections Anton Ertl 的论文,2016 年。
我对测试 Gforth 的一些限制很感兴趣,并且想让它执行我“手动编译”到分配的内存中的任意代码。这是我的尝试。
100 cells allocate throw constant &mem
\ store at &mem: docol: . EXIT
docol: &mem !
comp' . &mem 1 cells + ! drop \ drop "execution token"
comp' EXIT &mem 2 cells + ! drop
42 \ something to print
&mem execute
不幸的是,这失败了:
in file included from *OS command line*:-1
notes/execute.fs:8: Invalid memory address
&mem >>>execute<<<
Backtrace:
EFC61175B28 execute
I have to use
comp'
instead of'
, because it doesn't work for getting the xt ofEXIT
.
我认为这应该可行,除非 Gforth 不像 JonesForth 那样以任何方式运行 docol:
开始执行它旁边的 xt。
一般来说,这在 Gforth 或 ANS forth 中可能吗?
您可以执行任意的 xt 列表,但您必须使用自己的词来执行此列表,方法是对列表中的每个 xt 应用 execute
。
根据当前 standard,标准程序无法将任意代码编译到分配的内存中。该程序只能编译成字典的代码space,并且在当前定义的框架中(即尚未完成)。可以通过 compile, ( xt -- )
或 postpone ( i*x "name" -- j*x )
字执行编译。还有单词 literal
、2literal
、sliteral
、fliteral
(或它们的对应词 lit,
、2lit,
、slit,
、flit,
) 可用于编译文字。
在 Gforth 中,您还可以编译成另一个字典(“部分”),可以使用单词 extra-section ( size "name" -- )
.
10000 extra-section execute-in-my-section
\ execute-in-my-section ( i*x xt -- j*x )
unused cr . \ free space in the default dictionary
[:
unused cr . \ free space in the current section
:noname
postpone .
postpone ;
( xt-new )
unused cr . \ free space after compile the new definition
;] execute-in-my-section ( xt-new )
\ test
123 swap execute
另请参阅 section.fs source, and Sections Anton Ertl 的论文,2016 年。