微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何编译到任意内存并在 Forth 中执行?

如何解决如何编译到任意内存并在 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 中是否可能?

解决方法

你可以执行一个任意的 xt 列表,但是你必须使用你自己的词来执行这个列表,方法是将 execute 应用到列表中的每个 xt。

以当前的standard,标准程序无法将任意代码编译到分配的内存中。该程序只能编译到字典的代码空间中,并且在当前定义的框架中(即尚未完成)。可以通过 compile,( xt -- ) postpone ( i*x "name" -- j*x ) 字进行编译。还有单词 literal2literalsliteralfliteral(或它们的对应词 lit,2lit,slit,、{{ 1}}) 可用于编译文字。

在 Gforth 中,您还可以编译成另一个字典(“section”),可以使用字 flit, 分配。

extra-section ( size "name" -- )

另请参阅 section.fs 来源和 Sections Anton Ertl 的论文,2016 年。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。