g如何编译到任意内存并在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:
$7EFC61175B28 execute

我必须使用comp'而不是',因为它不适用于获取EXIT的xt。

我本以为这应该有效,除非Gforth不像JonesForth那样操作docol:开始执行旁边的xt。

这在一般的Gforth或ANS forth中可能吗?

您可以执行任意的xt列表,但您必须使用自己的单词来执行该列表,方法是将execute应用于列表中的每个xt。

按照目前的标准,标准程序不能将任意代码编译到分配的内存中。程序只能编译到字典的代码空间中,并且在当前定义的框架中(即,尚未完成(。编译可以通过compile, ( xt -- )postpone ( i*x "name" -- j*x )字来执行。此外,单词literal2literalsliteralfliteral(或它们的对应词lit,2lit,slit,flit,(可以用于编译文字。

在Gforth中,您还可以编译到另一个字典("section"(中,该字典可以使用单词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

另请参阅第.fs节的来源,以及Anton Ertl于2016年撰写的章节论文。

相关内容

  • 没有找到相关文章

最新更新