虚拟机实现中的非基元和基元有什么区别?



我在文章线程代码中看到了一些东西:

传统上,Forth是使用间接线程来实现的。因此,直接线程化的Forth实现与间接线程化的实现有很多共同点:非基元有一个代码字段,但它现在包含到代码的跳转,而不是它的地址。在大多数处理器上,这种跳跃比间接线程的额外负载花费更多的时间,因此只有在执行基元时,直接线程才有回报。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的形式存在。

在前面提到的文章中,基元是一条简单的虚拟机指令。但它还不够清楚:什么指令简单,什么指令不简单。

根据术语定义,Forth定义是编译到字典中的Forth执行过程。因此,通过">定义";术语我们指的是第四个定义

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

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

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

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

因此,基元是在底层机器的代码中描述的定义。

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

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

相关内容

  • 没有找到相关文章