怎么工作 编译器和解释器 有什么区别
我们用“add”“if”“名字”这样的人话来写代码。可机器在里面真正听得懂的,只是开和关这一级的极小指令。人话和机器话之间有一道大缝,给这道缝搭桥的,就是编译器和解释器。
人话和机器话不一样
我们写的“add”“if”,是人读起来方便的话。
可机器真正认得的,只是由一串开和关组成的极小指令。
我们写的文字和机器做的事之间隔着一道大缝,所以我们的文字照原样是运行不了的。
上面是我们写的一行,下面是机器认得的小指令。按“看缝隙”,两者之间的距离就显出来了。
上下差得太远了。
人话一眼就能读懂,机器话却很难认出来。
得有人替我们跨过这道缝,而做这件事的方法有两种。
搭桥的两种方法
要跨过这道缝,需要有人来翻译。
一种是先把全文都翻译好,另一种是一行一行当场读、马上执行。
前一种是编译器,后一种是解释器。
依次点编译器和解释器,就能看到“先翻译全部”和“一行一行当场来”画出来的样子不一样。
跨同一道缝,方式却大不相同。
一个事先做好,一个当场来。
我们先仔细看看事先整体翻译的那一种,也就是编译器的工作方式。
编译:事先整体翻译
编译器把我们的文字从头到尾读完,一次性变成机器能直接使用的成品。
翻译只事先做一次,得到的结果可以快速运行很多遍。
有出错的地方,它还能在运行之前就提醒你。
就像把一整本书先翻译好,再交给读者。
按“编译”,全文就变成成品;按“运行”,就一口气快速运行这个成品。
全部事先翻译好,运行起来干净利落,速度很快。
代价是一开始要等翻译做完。
那么,有没有不用等、马上就能开始的办法呢?那就是解释器。
解释:一行一行当场来
解释器不另外做成品。
它从上往下读一行我们的文字,马上做那件事,再读下一行接着做,就这样当场推进。
所以不用等就能马上开始,随手试一试也很容易。
就像站在讲话人旁边,一句一句翻译的口译员。
按“运行”,它就读一行、马上做,再转到下一行。当场一步一步推进。
马上开始、一行一行推进,用起来很顺手。
代价是每次运行,都要从头一行行重新读。
编译是事先、快速,解释是当场、简便。
那么,哪一种更好呢?
不是谁更好,而是有得有失
没有哪一种永远更好,两者是有得有失的关系。
编译开始得慢,但运行快,还能事先发现错误。
解释开始得快,测试也方便,但每次都要一行行重新读。
所以实际中常常把两者适当搭配使用,看你更看重什么来选择。
点一个项目,就会显示开始、运行速度、出错时机、产出物在两者之间怎样分开。
现在我们看到了我们的文字怎样变成机器的工作。
可是在这样运行的时候,我们做出来的值和对象到底放在哪里?
“这个指向那个”又是什么意思?
在这一部分的最后一课里,我们去看看那个地方。