如何解决虚拟机实现中的非原始和原始之间有什么区别?
我在文章 Threaded Code 中看到了一些内容:
传统上,Forth是使用间接线程实现的。因此,直接线程Forth实现与间接线程实现有很多共通之处:非基元具有一个代码字段,但是现在它包含跳转到代码而不是其地址的信息。在大多数处理器上,这种跳转所花费的时间比间接线程的额外负担要多,因此直接线程只有在执行 primitives 时才能获得回报。从而使486的速度提高了2%-8%。
那么,上面提到的“非原始”和“原始”有什么区别?
解决方法
非基本词是用其他Forth词定义的。基元在目标平台的本机代码中。
传统上,大多数目标平台在混合代码和数据时都没有问题,因此Forth字典将是一个单一的数据结构,从顶部的基元开始,而后来的单词将被定义为非基元。
典型的单词定义将包含标题,单词的名称,到字典中前一个单词的链接(创建链接列表),然后是代码字段和实际定义。
查看http://www.forth.org/fig-forth/contents.html中的几个示例。
根据-
的6502定义,从代码字段开始:
.WORD DOCOL
.WORD MINUS
.WORD PLUS
.WORD SEMIS
这实际上是: - MINUS + ;
的代码部分的编译
这是基元MINUS
的定义:
.WORD *+2
SEC
TYA
SBC 0,X
STA 0,X
TYA
SBC 1,X
STA l,X
JMP NEXT
第一个以DOCOL
的地址开头,而第二个仅引用2字节以上的本机代码。
在这种情况下,MINUS
是基元,但是它仍然涉及前两个字节中地址的间接跳转。线程解释器以DOCOL
和SEMIS
的形式出现。
通过上述文章,原语是一条简单的虚拟机指令。但这还不够清楚:什么指令很简单,什么指令不简单。
根据terms definitions, Forth定义是编译到字典中的Forth执行过程。因此,通过“ 定义”一词,我们指的是 Forth定义。
为简单起见,让我们进一步考虑仅由执行令牌标识的定义。
从概念上讲,字典中此类定义的描述具有标题(可能为空)和主体。主体以某种二进制代码格式(即二进制语言)描述执行语义。使用多种格式时,标头(如果有)可以确定主体的代码格式。
threaded code的变体是二进制代码格式的示例。
通常,通过其他定义(和文字)来描述定义。但是不可能以此方式描述Forth系统中的所有定义。在不参考其他定义的情况下,不可避免地会描述某些定义。这些定义在基础计算机或CPU的二进制代码中进行了描述。
因此,原语是在底层计算机的代码中描述的定义。
请注意,基元可以使用其他定义,但是即使没有其他定义,也只能描述基元。
从某种意义上来说,在某些Forth系统实现中,所有定义都是原语-例如,当使用子例程线程的代码时(实际上,该代码是准线程的)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。