第05期:編譯型語言和解釋型語言,該怎麼選?選擇不對、努力白費

文 | 麵包超人

第05期:編譯型語言和解釋型語言,該怎麼選?選擇不對、努力白費

我們需要在運行之前,把源代碼轉換成機器碼,共有兩種主要的方法

① 編譯型代碼

② 解釋型代碼

幸運的是,這不是一個你需要擔心的重要決定,因為大多數你將要處理的語言都會自然地落入這兩者其中的一種,但是我們有必要知道它們二者之間的區別。

我們來假設一種簡單的情況,假設只有你和我,你拿著你的電腦,我也拿著我的電腦,你要寫一個你想讓我運行的程序。你用一種編譯型的語言,你寫你的源代碼,然後你還有一個叫做編譯器的程序,編譯器會遍歷你的源代碼,並創建一個單獨的文件。該文件包含了機器碼,你只需要把那個文件給我就可以,這個最終結果有時被稱為可執行或可執行文件,因為我可以直接執行這個文件,我現在可以運行你的程序了,你留著你的源代碼,而且我從來沒見過你的源代碼。

另一方面,使用解釋型語言,你不需要預先編譯源代碼,你只要給我一份副本就可以了,所以當我想運行你的程序時,我需要我的機器來解釋它。

解釋器和編譯器是不同的,解釋器是動態的,我們可以把解釋器看作是逐行查看源代碼並當場處理代碼,解釋器不會將其保存為單獨的機器碼文件。

即使你不知道解釋型語言是什麼,其實你也早已用過了解釋語言,無論何時你用JavaScript瀏覽網頁時,即便你只是上網超過兩分鐘,這就是剛才正在發生的事情。JavaScript是通過網絡發送給你的,與此同時還包含了一些其他文件,比如網頁和圖片,JavaScript被作為源代碼發送到你的機器上,你的瀏覽器剛剛解釋了JavaScript,所以瀏覽器可以運行這些代碼。

那麼哪一種是最好的呢? 解釋型語言和編譯型語言都有各自的優點和缺點的。

一、編譯型代碼的優點是:

① 一旦編譯好,代碼馬上就可以運行了,你可以把它發送給100個,1000個或10萬個不同的人,這都是沒問題的。

② 編譯型代碼可以針對CPU進行優化,因此實際上速度可以更快,而且你不必將源代碼發送給所有人,這可能是一件好事。

③ 然而,缺點是如果我在PC上編譯它,可執行文件無法在Mac上運行,事實上,它甚至經常需要在同一平臺上針對不同的CPU分別進行編譯。

④ 每次你想測試程序的時候,你必須要編寫代碼來編譯,這是一個附加的步驟!

二、使用解釋型代碼,最大的好處是:

① 我不關心另一端是什麼機器,因為我們並不提供機器碼,我們只是發送源代碼,讓另一方來處理它,因此,它可以更便攜、更靈活地跨平臺運行。

② 解釋型代碼在測試時也更容易一些,因為你只需編寫源代碼,然後運行源代碼,讓解釋器負責轉換它,沒有中間的編譯步驟。

③ 當出現錯誤時,調試會更容易一些,因為您總是可以訪問所有源代碼。

④ 然而,解釋型代碼也有它的缺點,因為運行該程序的人都必須在自己的機器上裝好該語言的解釋器

⑤ 解釋型語言運行起來也可能更慢,因為每次運行程序時都必須解釋它。

⑥ 源代碼實際上是公開的,因為你將源代碼發送給需要運行該程序的每個人。

因為編譯語言和解釋語言都有優點,所以還存在第三種方法,兼具解釋型語言和編譯型語言的優點,既不是編譯模型 - 所有的工作都是在前面完成的,可能有點不靈活,也不是解釋模型 - 所有的工作都是在接收端完成的,但可能會慢一點,更像是五五開一樣。

首先,我們將其編譯為一種稱為中間語言的語言,這種語言可觸及到機器代碼所能達到的最遠處,同時仍然可以跨平臺移植,然後你把它分發出去,發給需要運行它的人,每個運行它的人都要完成最後一步,那就是把它放到他們電腦上的機器代碼中,這有時稱為即時編譯或JIT編譯,這種中間語言有時也被稱為字節碼。

雖然理論上所有的計算機語言都可以使用這些方法中的任何一種,但任何一種語言的正常使用都傾向於其中一種方式,而不是另一種方式,例如,C、 C++、 Objective-C,這些通常都是編譯語言,所以你需要一個編譯器。編譯器可以免費下載,但編譯器通常內置在集成開發環境應用程序中,像PHP和JavaScript這樣的語言,實際上大多數末尾帶有單詞script的語言通常都是可以被解釋的;像Java、C#和VB這樣的語言也是如此,.NET和Python使用這種中間混合方法。

第05期:編譯型語言和解釋型語言,該怎麼選?選擇不對、努力白費

無論一種語言是編譯型的,還是解釋型的,還是介於兩者之間的,這本身就幾乎不是你選擇一種語言的理由,但它會是你要考慮的一些因素。

那麼到底我們該選擇編譯型語言呢,還是該選擇解釋型語言呢?

① 如果你的程序的一個主要優先級是在單個平臺上運行的絕對最高速度,那麼您可能得去了解一下編譯型語言。

② 如果您對跨多個平臺輕鬆移植代碼更感興趣,那麼您可能對解釋型代碼更感興趣。

但通常情況下,你更多的是被你需要做的事情所驅動,比如您需要構建iPhone應用程序或Windows桌面應用程序或動態網站,或者,就像我們本課程,我們的目的只是學習編程的基礎知識。那麼請帶著你的決定,然後讓這個決定去驅動語言選擇。而目的選擇將決定你是要選擇編譯型語言、解釋型語言還是介於兩者之間。


分享到:


相關文章: