我们用高级编程语言java啊C++啊写的程序,怎么到机器上执行的呢?
机器可看不懂我们的java语言,他哪知道你要干啥呢,所以就需要有人翻译给他们听啊,编译器就是干这事的,把神秘的人类编程语言翻译成机器能理解的语言,然后机器听懂后,就开心的执行起来了。
可是机器也有来自不同地方的啊,根据CPU的不同,有X86的,有ARM的,有MIPS的,他们虽然都说的机器话,但方言也有所不同啊,所以这个翻译的人,还得会不同的方言。
好,这个时候我用人类的编程语言写了段程序,想在X86机器上跑一跑,我找来了会这门人类语言的编译器,他先把我的语言翻译成X86机器能懂的方言,然后我把方言送给X86机器,X86机器听到后,咔咔开始执行。
我现在也想把这段程序在一个ARM机器上跑一跑,我再找编译器给翻译成ARM能懂的方言,再给ARM机器,ARM机器然后咔咔的执行。
如此以来,每次我都要先编译成两种方言,然后给两台机器跑,如果机器类型更多,我还得编译出好多个方言版本,好麻烦啊。
这时门外来了个解释器,他说我不用编译器,也不用提前准备那么多方言版本,你直接把程序给我就完事了,执行也甭管了,我来帮你执行。解释器为什么这么霸道呢,原来他们人多势众,存在于每台机器里。比如程序送给X86机器时,X86机器里的解释器一边翻译一边给机器执行。原来解释器竟然自己雇佣了那些做翻译的人,这样也好,我们就不用出钱请做翻译的编译器了,直接把程序给解释器就好。
这种方式一开始,就有点不对劲,解释器简直是资本主义剥削的代表,他们不断催着翻译的人快快快,每翻译完一句就赶紧拿过来执行掉了,等不及啊,可是我们知道,程序里有很多重复的代码和可以优化的地方呢,如果是交给专门的编译器做,他们会好好的做优化,也不会在重复代码上耗费多余劳动力,可怜解释器里的那些充当编译器的小翻译啊,他们哪有时间啊,这样下去,总耗时反而增加了很多,因为很多无用功啊。
过了几天他们终于瞒不住了,我们发现你这个解释器吹牛逼可以,怎么现在越跑越慢了还。解释器也苦不堪言,说要是有人帮我们先优化一下下就好了,我们就不那么吃力了。于是好吧,我们又从外面找了个做兼职翻译的编译器,因为是兼职啊,所以也不用你编译的那么透彻,差不多行了,然后再送给解释器,这下解释器的工作轻松多了,效率就提升起来啦。
看到这里应该就完全理解了吧,如果有人问你编译器和解释器有啥区别,你会说这有啥比的,编译器是把一种语言翻译成另一种语言,解释器是翻译完了还要执行的,严格来说不能拿到同一类来比较的呀。
看看这个图,不同编程语言的方式不同,比如java,用javac生成的字节码就是一个中间编译版本,而C语言用gcc后就可以生成一个直接执行的版本。