Virtual machine 什么';虚拟机实现中非原语和原语的区别是什么?

Virtual machine 什么';虚拟机实现中非原语和原语的区别是什么?,virtual-machine,forth,Virtual Machine,Forth,我在文章中看到: 传统上,Forth是使用间接线程实现的。因此,直接线程Forth实现与间接线程实现有很多共同点:非原语有一个代码字段,但它现在包含一个到代码的跳转,而不是它的地址。在大多数处理器上,这种跳跃比间接线程的额外负载花费更多的时间,因此只有在执行原语时,直接线程才有回报。在486上产生的加速比为2%-8% 那么,上面提到的“非原语”和“原语”有什么区别呢?非原语是用其他词来定义的。原语是目标平台的本机代码 传统上,大多数目标平台在混合代码和数据方面没有问题,因此第四个字典将是一个单一

我在文章中看到:

传统上,Forth是使用间接线程实现的。因此,直接线程Forth实现与间接线程实现有很多共同点:非原语有一个代码字段,但它现在包含一个到代码的跳转,而不是它的地址。在大多数处理器上,这种跳跃比间接线程的额外负载花费更多的时间,因此只有在执行原语时,直接线程才有回报。在486上产生的加速比为2%-8%


那么,上面提到的“非原语”和“原语”有什么区别呢?

非原语是用其他词来定义的。原语是目标平台的本机代码

传统上,大多数目标平台在混合代码和数据方面没有问题,因此第四个字典将是一个单一的数据结构,从顶部的原语开始,而后面的单词将被定义为非原语

一个典型的单词定义会有一个标题,包含单词的名称,一个指向字典中前一个单词的链接(创建一个链接列表),然后是代码字段和实际定义

查看几个例子

从6502定义的
-
,从代码字段开始:

.WORD DOCOL
.WORD MINUS
.WORD PLUS
.WORD SEMIS
这是对
:-减号+的代码部分的编译

这是原语
减去
的定义:

.WORD *+2
SEC
TYA
SBC 0,X
STA 0,X
TYA
SBC 1,X
STA l , X
JMP NEXT
第一个以地址
DOCOL
开始,而下一个仅指2字节以上的本机代码


在本例中,
减去
是原语,但它仍然涉及前两个字节中地址的间接跳转。线程解释器以
DOCOL
SEMIS

的形式存在。在上述文章中,原语是一种简单的虚拟机指令。但这还不够清楚:什么指令简单,什么指令不简单

根据,Forth定义是编译到字典中的Forth执行过程。所以,我们所说的“定义”是指第四个定义

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

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

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

通常通过其他定义(和文字)来描述定义。但是,用这种方式来描述第四系统中的所有定义是不可能的。一些定义将不可避免地在没有任何参考其他定义的情况下进行描述。这些定义用底层机器或CPU的二进制代码描述

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

请注意,原语可以使用其他定义,但即使没有其他定义,也只能描述原语

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

来自链接页面:“虚拟机代码现在由一系列代码字段地址表示,而不是代码地址。简单的虚拟机指令(原语)通常如下所示: