解释器
复习
- 语言运行时:程序运行时的支撑
- 编译器:把源码翻译成目标代码
- 抽象语法树:程序结构的表示
TL;DR
- 解释器直接读取程序结构并执行,不先生成机器码
- 它逐条处理,灵活但通常较慢
- 编译与解释,是“翻译”的两种时机
- 两者各有适用场景,也常混合使用
正文
前面一路讲的都是编译:先把源码翻译成机器码,再运行。但“把程序变成能跑的东西”,其实还有另一条路——解释。
另一种做法:边读边执行
解释器(interpreter)不把程序整体翻译成机器码,而是直接读取程序的结构,逐条执行。它可以读源码,也可以读某种中间形式,然后一条一条地处理下去。
这就像两种翻译方式:
- 编译:先把整本书翻译好,再交给读者(生成完整的目标程序)
- 解释:请一位同声传译,你读到哪,它翻到哪(边读边执行)
各自的脾气
解释执行有它的好处:
- 灵活:改一行代码就能立刻重新跑,适合开发和调试
- 启动快:不必先花时间编译整个程序
- 跨平台:只要有解释器,同一份程序就能跑
但代价也很明显:慢。 因为程序每次运行都要被“解释”一遍,同样的逻辑可能被反复分析,却无法像编译那样一次性生成高效的机器码。灵活性,是用速度换来的。
编译与解释并不是对立的
别把两者看成非此即彼。现实中很多系统是混合的:先把源码编译成一种中间形式,再由解释器执行;甚至在执行过程中,把“跑得最勤”的部分进一步编译成机器码——那就是后面的即时编译。
所以,编译和解释不是谁取代谁,而是在“提前翻译”与“边跑边翻”之间,各取所长。接下来的两章,看看这种混合是怎么做的。
思考题 1
解释器和编译器,在“翻译时机”上有什么不同?
思考题 2
解释执行通常比编译执行慢,为什么?
小结
知识点
- 解释器直接读取程序结构并逐条执行
- 优点:灵活、启动快、跨平台
- 代价:通常比编译执行慢
- 编译与解释可以混合使用
参考资料
- Wikipedia(zh):解释器:直接执行程序的软件
- Wikipedia(zh):编译器:把源码翻译为目标代码的程序
思考题答案(仅供参考)
思考题 1
编译器在程序运行之前就把整个程序翻译成目标代码,运行时直接执行机器码;解释器则在程序运行时边读边执行,不提前生成完整的机器码。区别在于翻译发生在运行前还是运行中。
思考题 2
因为解释执行需要边运行边分析、逐条处理,同一段逻辑每次运行都要再解释一遍,无法像编译那样一次性生成高效的机器码。额外的分析开销使它通常比编译后的机器码执行慢。
协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
封面图
设计师 | 南国微雪