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

虚拟机实现中的非原始和原始之间有什么区别?

如何解决虚拟机实现中的非原始和原始之间有什么区别?

我在文章 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是基元,但是它仍然涉及前两个字节中地址的间接跳转。线程解释器以DOCOLSEMIS的形式出现。

,

通过上述文章,原语是一条简单的虚拟机指令。但这还不够清楚:什么指令很简单,什么指令不简单。

根据terms definitions Forth定义是编译到字典中的Forth执行过程。因此,通过“ 定义”一词,我们指的是 Forth定义

为简单起见,让我们进一步考虑仅由执行令牌标识的定义。

从概念上讲,字典中此类定义的描述具有标题(可能为空)和主体。主体以某种二进制代码格式(即二进制语言)描述执行语义。使用多种格式时,标头(如果有)可以确定主体的代码格式。

threaded code的变体是二进制代码格式的示例。

通常,通过其他定义(和文字)来描述定义。但是不可能以此方式描述Forth系统中的所有定义。在不参考其他定义的情况下,不可避免地会描述某些定义。这些定义在基础计算机或CPU的二进制代码中进行了描述。

因此,原语是在底层计算机的代码中描述的定义。

请注意,基元可以使用其他定义,但是即使没有其他定义,也只能描述基元。

从某种意义上来说,在某些Forth系统实现中,所有定义都是原语-例如,当使用子例程线程的代码时(实际上,该代码是准线程的)。

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