树遍历解释器,基于栈与基于寄存器,大杂烩.docVIP

树遍历解释器,基于栈与基于寄存器,大杂烩.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
树遍历解释器,基于栈与基于寄存器,大杂烩 虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩 1、解析器与解释器解析器是parser,而解释器是interpreter。两者不是同一样东西,不应该混用。前者是编译器/解释器的重要组成部分,也可以用在IDE之类的地方;其主要作用是进行语法分析,提取出句子的结构。广义来说输入一般是程序的源码,输出一般是语法树(syntax tree,也叫parse tree等)或抽象语法树(abstract syntax tree,AST)。进一步剥开来,广义的解析器里一般会有扫描器(scanner,也叫tokenizer或者lexical analyzer,词法分析器),以及狭义的解析器(parser,也叫syntax analyzer,语法分析器)。扫描器的输入一般是文本,经过词法分析,输出是将文本切割为单词的流。狭义的解析器输入是单词的流,经过语法分析,输出是语法树或者精简过的AST。(在一些编译器/解释器中,解析也可能与后续的语义分析、代码生成或解释执行等步骤融合在一起,不一定真的会构造出完整的语法树。但概念上说解析器就是用来抽取句子结构用的,而语法树就是表示句子结构的方式。关于边解析边解释执行的例子,可以看看这帖的计算器。)举例:将i=a+b*c作为源代码输入到解析器里,则广义上的解析器的工作流程如下图:其中词法分析由扫描器完成,语法分析由狭义的解析器完成。(嗯,说来其实解析器这词还是按狭义用法比较准确。把扫描器和解析器合起来叫解析器总觉得怪怪的,但不少人这么用,这里就将就下吧=_=不过近来scannerless parsing也挺流行的:不区分词法分析与语法分析,没有单独的扫描器,直接用解析器从源码生成语法树。这倒整个就是解析器了,没狭不狭义的问题)后者则是实现程序执行的一种实现方式,与编译器相对。它直接实现程序源码的语义,输入是程序源码,输出则是执行源码得到的计算结果;编译器的输入与解释器相同,而输出是用别的语言实现了输入源码的语义的程序。通常编译器的输入语言比输出语言高级,但不一定;也有输入输出是同种语言的情况,此时编译器很可能主要用于优化代码。举例:把同样的源码分别输入到编译器与解释器中,得到的输出不同:值得留意的是,编译器生成出来的代码执行后的结果应该跟解释器输出的结果一样--它们都应该实现源码所指定的语义。在很多地方都看到解析器与解释器两个不同的东西被混为一谈,感到十分无奈。最近某本引起很多关注的书便在开篇给读者们当头一棒,介绍了JavaScript解析机制。编译和预处理也顺带混为一谈了,还有预编译0_0我一直以为预编译应该是ahead-of-time compilation的翻译,是与即时编译(just-in-time compilation,JIT)相对的概念。另外就是PCH(precompile header)这种用法,把以前的编译结果缓存下来称为预编译。把AOT、PCH跟预处理(preprocess)混为一谈真是诡异。算了,我还是不要淌这浑水的好…打住。2、解释器到底是什么?解释型语言呢?很多资料会说,Python、Ruby、JavaScript都是解释型语言,是通过解释器来实现的。这么说其实很容易引起误解:语言一般只会定义其抽象语义,而不会强制性要求采用某种实现方式。例如说C一般被认为是编译型语言,但C的解释器也是存在的,例如Ch。同样,C++也有解释器版本的实现,例如Cint。一般被称为解释型语言的是主流实现为解释器的语言,但并不是说它就无法编译。例如说经常被认为是解释型语言的Scheme就有好几种编译器实现,其中率先支持R6RS规范的大部分内容的是Ikarus,支持在x86上编译Scheme;它最终不是生成某种虚拟机的字节码,而是直接生成x86机器码。解释器就是个黑箱,输入是源码,输出就是输入程序的执行结果,对用户来说中间没有独立的编译步骤。这非常抽象,内部是怎么实现的都没关系,只要能实现语义就行。你可以写一个C语言的解释器,里面只是先用普通的C编译器把源码编译为in-memory image,然后直接调用那个image去得到运行结果;用户拿过去,发现直接输入源码可以得到源程序对应的运行结果就满足需求了,无需在意解释器这个黑箱子里到底是什么。实际上很多解释器内部是以编译器+虚拟机的方式来实现的,先通过编译器将源码转换为AST或者字节码,然后由虚拟机去完成实际的执行。所谓解释型语言并不是不用编译,而只是不需要用户显式去使用编译器得到可执行代码而已。那么虚拟机(virtual machine,VM)又是什么?在许多不同的场合,VM有着不同的意义。如果上下文是Java、Python这类语言,那么一般指的是高级语言虚拟机(high-level langua

文档评论(0)

189****6649 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档