前言

解释器模式是23种设计模式的最后一个设计模式,要讲清楚解释器模式,我们分两个部分来理解,本篇是第一部分先理解它目前的应用场景,然后再理解它的原理。

为了帮助理解解释器模式,我们先来谈谈编译原理上说的编译器,编译器分为几个部分组成,比如:

  1. 词法分析器
  2. 语法分析器
  3. 语义分析器
  4. 中间代码优化器
  5. 最终的代码生成器

而这个解释器其实就是完成了对语法的解析,将一个个的词组解释成了一个个语法范畴,之后拿来使用而已。

解释器和编译器

关于编译器与解释器我们先来看两张图,如下图所示:

编译器

设计模式—解释器模式详解《一》

解释器

设计模式—解释器模式详解《一》
用解释器很方便,只需要直接“运行”就好了,不用像C那样有编译链接的工序。

为什么说这些语言是跨平台的?因为你写了程序以后,如果这个平台上有这种语言的解释器,只需要拿到这个平台上直接运行就可以了。你可以理解为:解释器是在“一边编译,一边运行”,它只是把以前程序员手工做的编译过程放在了运行程序的时候进行。

为什么我们一般说解释器的效率比较低?你也可以想象的是,一段程序在解释器中运行时可能会被编译多次,因为每次运行到这段程序时,都会重新编译一次,这样的开销是很大的。

所以诞生了Java,C#这样的预编译语言:
设计模式—解释器模式详解《一》
在运行之前,需要手动把源代码编译成中间代码(Java里叫字节码),然后在解释器中执行。这种架构避免了上面纯解释器中编译源代码的开销,所以相对会有效率一些。

其实像Python,Perl,PHP可能都不会是真的纯解释执行的,这样实在是太没有效率。Python在运行时会生成pyc的二进制临时文件,看起来很像是预编译的结果。不过JavaScript这种语言确实是纯解释执行的,因为它一般不会写得太长。

相关文章: