文字变成机器之事的路:编译器与解释器
我们用「add」「if」「名字」这样的人话来写代码。 可机器在里头,只懂得开·关那种 极小极小的指令。 人话和机器话之间,有一道大缝。 往那道缝上架桥的,就是编译器和解释器。
人话和机器话不一样
我们写的「add」「if」,是人读着顺口的话。
可机器真正懂的,
只是开·关排起来的极小指令。
我们的字,和机器干的活之间,有一道大缝。
所以我们的字,原样是跑不了的。
上面是我们写的一行,下面是机器懂的小指令。点点中间那道缝。
上下差得太多了。
人话一眼就读懂,机器话却认不出来。
这道缝,得有谁替我们跨过去。
做这活儿,有两种办法。
架桥的两种办法
要跨过缝,得有个替你翻译的。
办法有两种。
一种是,把整段文字事先全翻好。
另一种是,一行一行就地读着马上执行。
前者是编译器,后者是解释器。
点点两条路。「先全翻」和「一行一行就地」,样子不一样。
跨的是同一道缝,方式却很不一样。
一个事先,一个就地。
先来细看「事先整个翻译」那一边好吗?
这就是编译器的干活方式。
编译:整个事先翻好
编译器把我们的文字从头到尾全读一遍,
一次性变成机器能直接用的成品。
翻译事先就一次。那个成品可以反复地快快跑。
哪儿出了岔,它常常在跑之前就先告诉你。
就像把一整本书事先翻好,再递给读者。
点「编译」,整段文字变成成品;「运行」把它一次性快快跑完。
事先把整个翻好,运行就利落又快。
代价是,开头得等翻译翻完。
那么反过来,有没有不等、马上就开始的办法呢?
那就是解释器。
解释:一行一行就地来
解释器不另外做成品。
它把我们的文字从上往下读一行,马上就干那件事,
再读下一行又干,就这样就地进行下去。
所以不用等就能马上开始,还能轻轻松松试一试。
像在你说话旁边,一句一句替你翻译的口译员。
点「运行」:读一行就干,再到下一行。就地一行行往下走。
马上开始、一行行地走,用着很顺手。
代价是,每次跑都从头一行行重读一遍。
编译是事先·快,解释是就地·简便。
那么哪一种更好呢?
与其说谁更好,不如说是取舍
并不是哪一个一味地好;它们彼此取舍。
编译启动慢但运行快,还能事先报错。
解释马上开始、好试,但每次都一行行重读。
所以实际上,常常把两者妥当地搭配着用。
看你更看重什么,就选哪个。
点点各项。启动、运行快慢、报错时机、成品,在两者间怎么分,一看便知。
现在我们看到了,文字是怎么变成机器之事的。
可在那样运转的时候,
我们做出的值和对象,到底装在哪儿呢?
「这个指向那个」,又是什么意思呢?
下一课,也是最后一课,我们去看看那个地方。