下面關於解釋系統和編譯系統的說法中,錯誤的是()
A.解釋程式不產生目標代碼,直接執行來源程式或來源程式的內部形式
B.使用編譯系統時會區分編譯階段和運行階段
C.一般來說,解釋系統比編譯系統複雜,但是可移植性好
D.一般來說,建立在編譯基礎上的系統執行速度要比建立在解釋基礎上的系統快
答案是選A, 錯在後半部分,並不是直接執行來源程式,而是必須要轉換為機器可識別碼才能運行
C++代碼每一次進行更新都需要重新編譯,有些大型系統編譯一次需要花很長時間,這就對系統的調試帶來很多不便,如linux核心,這個是編譯系統的一個不足。
下面是對編譯型語言和解釋型語言介紹:
編譯型語言:
編譯是指在應用來源程式執行之前,就將程式原始碼“翻譯”成目標代碼(機器語言),因此其目標程式可以脫離其語言環境獨立執行,使用比較方便、效率較高。但應用程式一旦需要修改,必須先修改原始碼,再重新編譯產生新的目標檔案(* .OBJ)才能執行,只有目標檔案而沒有原始碼,修改很不方便。現在大多數的程式設計語言都是編譯型的。編譯器將來源程式翻譯成目標程式後儲存在另一個檔案中,該目標程式可脫離編譯器直接在電腦上多次運行。大多數軟體產品都是以目標程式形式發行給使用者的,不僅便於直接運行,同時又使他人難於盜用其中的技術C、C++、Fortran、Visual
Foxpro、Pascal、Delphi、Ada都是編譯實現的。
解釋型語言:
解釋型語言的實現中,翻譯器並不產生目標機器代碼,而是產生易於執行的中間代碼,這種中間代碼與機器代碼是不同的,中間代碼的解釋是由軟體支援的,不能直接使用硬體,軟體解譯器通常會導致執行效率較低。用解釋型語言編寫的程式是由另一個可以理解中間代碼的解釋程式執行的。與編譯器不同的是,解釋程式的任務是逐一將來源程式的語句解釋成可執行檔機器指令,不需要將來源程式翻譯成目標代碼後再執行。解釋程式的優點是當語句出現語法錯誤時,可以立即引起程式員注意,而程式員在程式開發期間就能進行校正。對於解釋型Basic語言,需要一個專門的解譯器解釋執行
Basic程式,每條語言只有在執行才被翻譯。這種解釋型語言每執行一次就翻譯一次,因而效率低下。一般地,動態語言都是解釋型的,如Tcl、Perl、Ruby、VBScript、 JavaScript等。
混合型:
Java很特殊,Java程式也需要編譯,但是沒有直接編譯稱為機器語言,而是編譯稱為位元組碼,然後在Java虛擬機器上用解釋方式執行位元組碼。Python 的也採用了類似Java的編譯模式,先將Python程式編譯成Python位元組碼,然後由一個專門的Python位元組碼解譯器負責解釋執行位元組碼。(Java虛擬機器對位元組碼的執行相當於類比一個cpu,而ruby1.8--在虛擬機器還未出現前--是通過解釋成文法樹執行。)
個人認為,java是解釋型的語言,因為雖然java也需要編譯,編譯成.class檔案,但是並不是機器可以識別的語言,而是位元組碼,最終還是需要jvm的解釋,才能在各個平台執行,這同時也是java跨平台的原因。所以可是說java即是編譯型的,也是解釋型,但是如果非要歸類的話,從概念上的定義,恐怕java應該歸到解釋型的語言中。