vlambda博客
学习文章列表

解释器和编译器有什么区别和关系?

菜鸟经常将编译器和解释器弄混淆,无奈之下,于是向高手请教。

高手说:

解释器是一条一条的解释执行源语言。比如 php,postscritp,javascript 就是典型的解释性语言。

编译器是把源代码整个编译成目标代码,执行时不在需要编译器,直接在支持目标代码的平台上运行,这样执行效率比解释执行快很多。比如 C 语言代码被编译成二进制代码(exe 程序),在 windows 平台上执行。

菜鸟说:“我还是不明白,能给个形象的比喻么?”

高手说:“给你讲个故事。”

  • 1.壮骨粉和黄金搭档;
  • 2.一家人去看望爸妈;

女儿见到女婿后,就将这张纸上的信息编成短信发给了工作的女婿。女婿一看就明白了,下班后先去超市买了补品,然后开车回家带着妻儿就去看望岳父岳母了。

想到什么了吗?

菜鸟说:

我这样说不知道对不对:儿子就像是解释器,是想到一点做一点。女儿就像编译器,女婿就像平台,女儿听完后,在纸上罗列出所有要做的事情,女婿就按着指示办事了。

高手说:

就是这样的。儿子对于母亲的话是一条一条执行,女儿是将母亲的话整个翻译成平台能理解的目标语言--短信,整个由女婿直接执行。后者的执行效率会更高。从功能上看,解释器和编译器确实不一样。然而,从流程和结构上看,二者却非常相似。儿子和女儿听到母亲的话以后,都是从两个方面来思考:老人的身体和老人对小辈的思念。以此为据,儿子和女儿都做出了自己的决定。只不过一个直接去做了,另一个却将所要做的事情翻译成另一种载体--短信--给存储起来。

解释器和编译器也是如此,读入源语言后,解释器和编译器都要进行词法分析、语法分析和语义分析,之后,二者开始有所分别。解释器在语义分析后选择了直接执行语句;编译器在语义分析后选择将将语义存储成某一种中间语言,之后通过不同的后端翻译成不同的机器语言(可执行程序)。如下图所示:

总之,解析器和编译器它们在功能上是不一样的,然而从结构上看却有诸多相同,而且在开发时也并没有本质上的差别,这也是很多人将二者混淆的原因之一。究竟是开发解析器还是编译器?只需要依据功能上的实际需要来做出决定就ok了。

解释器和编译器有什么区别和关系?


往期精彩回顾


点击左下角阅读原文查看历史经典技术问题汇总,看完顺手三连呀~