咱們用高級編程語言java啊C++啊寫的程序,怎麼到機器上執行的呢?java
機器可看不懂咱們的java語言,他哪知道你要幹啥呢,因此就須要有人翻譯給他們聽啊,編譯器就是幹這事的,把神祕的人類編程語言翻譯成機器能理解的語言,而後機器聽懂後,就開心的執行起來了。
但是機器也有來自不一樣地方的啊,根據CPU的不一樣,有X86的,有ARM的,有MIPS的,他們雖然都說的機器話,但方言也有所不一樣啊,因此這個翻譯的人,還得會不一樣的方言。編程
好,這個時候我用人類的編程語言寫了段程序,想在X86機器上跑一跑,我找來了會這門人類語言的編譯器,他先把個人語言翻譯成X86機器能懂的方言,而後我把方言送給X86機器,X86機器聽到後,咔咔開始執行。
我如今也想把這段程序在一個ARM機器上跑一跑,我再找編譯器給翻譯成ARM能懂的方言,再給ARM機器,ARM機器而後咔咔的執行。
如此以來,每次我都要先編譯成兩種方言,而後給兩臺機器跑,若是機器類型更多,我還得編譯出好多個方言版本,好麻煩啊。編程語言
這時門外來了個解釋器,他說我不用編譯器,也不用提早準備那麼多方言版本,你直接把程序給我就完事了,執行也甭管了,我來幫你執行。解釋器爲何這麼霸道呢,原來他們人多勢衆,存在於每臺機器裏。好比程序送給X86機器時,X86機器裏的解釋器一邊翻譯一邊給機器執行。原來解釋器居然本身僱傭了那些作翻譯的人,這樣也好,咱們就不用出錢請作翻譯的編譯器了,直接把程序給解釋器就好。優化
這種方式一開始,就有點不對勁,解釋器簡直是資本主義剝削的表明,他們不斷催着翻譯的人快快快,每翻譯完一句就趕忙拿過來執行掉了,等不及啊,但是咱們知道,程序裏有不少重複的代碼和能夠優化的地方呢,若是是交給專門的編譯器作,他們會好好的作優化,也不會在重複代碼上耗費多餘勞動力,可憐解釋器裏的那些充當編譯器的小翻譯啊,他們哪有時間啊,這樣下去,總耗時反而增長了不少,由於不少無用功啊。翻譯
過了幾天他們終於瞞不住了,咱們發現你這個解釋器吹牛逼能夠,怎麼如今越跑越慢了還。解釋器也苦不堪言,說要是有人幫咱們先優化一下下就行了,咱們就不那麼吃力了。因而好吧,咱們又從外面找了個作兼職翻譯的編譯器,由於是兼職啊,因此也不用你編譯的那麼透徹,差很少行了,而後再送給解釋器,這下解釋器的工做輕鬆多了,效率就提高起來啦。blog
看到這裏應該就徹底理解了吧,若是有人問你編譯器和解釋器有啥區別,你會說這有啥比的,編譯器是把一種語言翻譯成另外一種語言,解釋器是翻譯完了還要執行的,嚴格來講不能拿到同一類來比較的呀。編譯器
看看這個圖,不一樣編程語言的方式不一樣,好比java,用javac生成的字節碼就是一箇中間編譯版本,而C語言用gcc後就能夠生成一個直接執行的版本。編譯