0.先說明一下怎么突然想到這個問題了.
大概思路應該是這個樣子的 ...
JVM --> Java內存區域 -->
運行時數據區域 --> JVM和運行時啥關系 -->
Java運行時是名詞?表示狀態?還是表示一個事物? -->
Java是編譯型語言還是解釋型語言 ?
Java是編譯型語言
java的編譯器先將其編譯為class文件,也就是字節碼;然后將字節碼交由jvm(java虛擬機)解釋執行;
所以很多地方都說“java是一種半編譯、半解釋執行”的語言;
近來(其實也不是很"近")Oracle的(以前是Sun的)HotSpot VM采用了jit compile(just in time compilation)技術,
將運行頻率很高的字節碼直接編譯為機器指令執行以提高性能, 所以當字節碼被jit編譯為機器碼的時候,要說它是編譯執行的也可以...
不過總體來講,java的編譯結果是被jvm“解釋執行”的,所以這么說也能說通,
而其實這個“是編譯還是解釋”這個概念在這里已經有點模糊了,理解它的過程就行了,不必下一個“精確”的定義;
而我自己仍然贊成“java是編譯型語言”的說法,因為“編譯”其本質就是“把一個相對高級的語言轉換為另一個相對低級的語言”,而由java -> class文件的編譯已經滿足了這個特征; 而后面你要說jvm是“解釋執行”的,那其實硬件對於機器碼又何嘗不是“解釋執行”呢?
(編輯於 2012-06-22 00:15)
作者:溫悅
鏈接:https://www.zhihu.com/question/19608553/answer/14702010
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
如上圖, 從上至下分別是編譯型語言,解釋型語言,Java的執行模型。
看上去陷入了一個困境,Java到底是編譯型語言呢,還是解釋型語言呢?
一種朴素的判定方式:如果翻譯器部分較為簡單,我們說這個語言是“解釋的”,反之如果翻譯器部分很復雜,我們就說這個語言是“編譯的”。
事實上這兩者之間的界限是模糊的,因為“簡單”和“復雜”都具有主觀性。
“解釋型”和“編譯型”並不是一個清晰的描述。故強行將某種具有混合形式的語言划入兩者之一是不當的。
但實踐中肯定還是有進行分類的需求的,所以這里有一條啟發性原則用以判斷語言的類型:
如果翻譯器對程序進行了徹底的分析而非某種機械的變換,而且生成的中間程序與源程序之間沒有很強的相似性,我們就認為這個語言是編譯的。
徹底的分析和非平凡的變換,是編譯方式的標志性特征。
因此,Java應當被認作一種編譯型語言。
——《PLP》1.4 Compilation and Interpretation
發布於 2014-12-09 18:30
作者:馮若航
鏈接:https://www.zhihu.com/people/vonng
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
Java是解釋型語言
個人認為,java是解釋型的語言,因為雖然java也需要編譯,編譯成.class文件,
但是並不是機器可以識別的語言,而是字節碼,最終還是需要 jvm的解釋,才能在各個平台執行,這同時也是java跨平台的原因。
所以可是說java即是編譯型的,也是解釋型,但是假如非要歸類的話,從概念上的定義,恐怕java應該歸到解釋型的語言中。
附:
編譯型的語言包括:C、C++、Delphi、Pascal、Fortran
解釋型的語言包括:Java、Basic、javascript
Java既是編譯型語言 , 又是解釋型語言
由Java的代碼執行過程可知 ,一個Java 代碼的執行過程是由 . Java-->. class-->對應平台機器碼 ;
. Java-->. class是由 Javac 編譯,這個過程符合編譯型語言的特點(一次性編譯,注意 並未編譯為實際平台的機器碼,)
而. class-->對應平台機器碼 的這一過程 是由Java解釋執行 (逐行解釋為特定平台機器碼)這一過程符合解釋語言的特點 ;
所以說 Java既是編程語言 ,又是解釋語言。
高級編程語言按照程序的執行方式分為編譯型和解釋型兩種。
簡單來說,
編譯型語言是指編譯器針對特定的操作系統將源代碼一次性翻譯成可被該平台執行的機器碼;
解釋型語言是指解釋器對源程序逐行解釋成特定平台的機器碼並立即執行。
比如,你想閱讀一本英文名著,你可以找一個英文翻譯人員幫助你閱讀,
有兩種選擇方式,你可以先等翻譯人員將全本的英文名著(也就是源碼)都翻譯成漢語,再去閱讀,
也可以讓翻譯人員翻譯一段,你在旁邊閱讀一段,慢慢把書讀完。
Java 語言既具有編譯型語言的特征,也具有解釋型語言的特征,
因為 Java 程序要經過先編譯,后解釋兩個步驟,
由 Java 編寫的程序需要先經過編譯步驟,生成字節碼(*.class 文件),這種字節碼必須由 Java 解釋器來解釋執行。
因此,我們可以認為 Java 語言編譯與解釋並存。
Java是編譯型語言,還是解釋型語言,見仁見智( 牆頭草 )
這個比""觀點更隨意 ,
說了這么多,讓我們回頭看一下java到底是編譯型的還是解釋型的。
首先,java需要編譯,解釋型語言不需要編譯,然而java編譯的結果又不是和其他編譯型語言一樣的二進制文件,而是class文件。
從這一點上來看,java介於二者中間;java編譯完成以后,操作系統不能直接運行,而是需要java虛擬機解釋執行class字節碼文件。
因此虛擬機將字節碼程序與操作系統及硬件分開,使得java程序能在異構平台上執行,從這一點上來看,java又屬於解釋型語言。
如果嚴格來說,java確實屬於半編譯半解釋型語言,如果只從最后的執行步驟來看,java屬於解釋型語言。
至於它到底屬於什么類型的語言,還是仁者見仁智者見智的。
編程語言描述為"編譯型"或者"解釋性"本來就是偽命題
很多資料會說,Python、Ruby、JavaScript都是“解釋型語言”,是通過解釋器來實現的。
這么說其實很容易引起誤解:語言一般只會定義其抽象語義,而不會強制性要求采用某種實現方式。
例如說C一般被認為是“編譯型語言”,但C的解釋器也是存在的,例如Ch。同樣,C++也有解釋器版本的實現,例如Cint。
一般被稱為“解釋型語言”的是主流實現為解釋器的語言,但並不是說它就無法編譯。
例如說經常被認為是“解釋型語言”的Scheme就有好幾種編譯器實現,其中率先支持R6RS規范的大部分內容的是Ikarus,支持在x86上編譯Scheme;
它最終不是生成某種虛擬機的字節碼,而是直接生成x86機器碼。
解釋器就是個黑箱,輸入是源碼,輸出就是輸入程序的執行結果,對用戶來說中間沒有獨立的“編譯”步驟。
這非常抽象,內部是怎么實現的都沒關系,只要能實現語義就行。
你可以寫一個C語言的解釋器,里面只是先用普通的C編譯器把源碼編譯為in-memory image,然后直接調用那個image去得到運行結果;
用戶拿過去,發現直接輸入源碼可以得到源程序對應的運行結果就滿足需求了,無需在意解釋器這個“黑箱子”里到底是什么。
實際上很多解釋器內部是以“編譯器+虛擬機”的方式來實現的,先通過編譯器將源碼轉換為AST或者字節碼,然后由虛擬機去完成實際的執行。
所謂“解釋型語言”並不是不用編譯,而只是不需要用戶顯式去使用編譯器得到可執行代碼而已。
什么是編譯型語言和解釋型語言:
編譯型語言(compiled language)指通過編譯器(compiler)將源代碼編譯為機器碼(machine code)后運行的語言,例如C、C++;
解釋型語言(interpreted language)指由解釋器(interpreter)直接執行,不需要編譯成機器語言,例如 PHP、JavaScript。
編譯型語言和解釋型語言的優點和缺點:
由於解釋型語言會在運行時翻譯源代碼,一般情況下運行速度不如編譯型語言;
解釋型語言由解釋器運行,而不是直接運行在操作系統上,所以一般有較強的跨平台能力。
Java 是編譯型語言還是解釋型語言:
為了兼顧跨平台和運行速度,Java 源代碼首先會被編譯為字節碼文件(.class),但並非是機器語言,而是需要在 JVM 上運行,而 .class 文件在 JVM 上是解釋執行的。
所以 Java 兼具編譯型語言和解釋型語言的特點。為了更高的效率,JVM 還引入了 JIT(just-in-time,即時編譯)編譯器,在 Java 程序運行時進一步編譯,轉換成高度優化的機器代碼。
現在的很多語言以及不能以編譯型語言和解釋型語言來區分了,因為很多語言都兼具編譯型語言和解釋型語言的特點。
作者:叉叉哥
鏈接:https://www.zhihu.com/people/wucao
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
偽命題
"Python是解釋型語言,因為Python通常是解釋執行的"
"C是編譯型語言,因為C是編譯執行的"
"Java是解釋型語言,因為Java是有JVM解釋執行的"
舉個栗子 --> 如果我們把"讓計算機執行一段代碼"類比為"讓不懂中文的外國廚師做一道菜"
解釋方式執行一段代碼,就好比是,你每次讓一個英國廚師做一道水煮魚,
就得先把中文菜譜里的第一步概念給翻譯聽,然后翻譯再把這一步驟翻譯成英文念給廚師聽,
等英國廚師把這第一個步驟做完,你再把第二個步驟念給翻譯聽,
這里的翻譯者就相當指導計算機執行代碼的解釋器.
編譯方式執行 一段代碼,就好比是,你預先把整個菜譜都交給翻譯,
讓他寫出一份完整的英文菜譜,
這樣你每次讓英國廚師做水煮魚的時候,就直接把英文菜譜給他.
他就可以照着英文菜譜很快的做出來了,
這里的翻譯者就相當於編譯器.結果你就會發現,同樣一個菜譜(一段代碼),既可以解釋執行,也可以編譯執行.
所以將語言區分為解釋型還是編譯型,就好像有人說"宮保雞丁是一道解釋型的菜,回鍋肉是一道編譯型的菜"
因此"某個語言是編譯型或者解釋型"就是一個偽命題更准確的說法是,某個語言的特定實現,是編譯型或者解釋型的.
比如JavaScript,既有解釋型的實現,90年代初的瀏覽器Netscape Navigator里的JS引擎,
也有編譯型的實現,Chrome瀏覽器里的V8引擎.再舉一個栗子,Chicken Scheme為Scheme這門語言提供了兩套實現,
一個是解釋器csi,一個是編譯器csc.很多時候,當一個團隊在設計一門新語言時,
往往會為它開發一個解釋器,用來測試這個語言.
如果哪天該團隊或者公司想把這門語言推廣到工業界,
就很可能為這個語言開發一個編譯器,讓這個語言的程序能更有效的執行.總結 : 所謂的編譯型,解釋型並不是一門編程語言的特性,
而只是{語言實現}的特性.
作者:SchelleyYuki
鏈接:https://www.zhihu.com/people/schelley
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
總結
我還是比較喜歡"咬文嚼字" ,
觀點上我站{ 編程語言描述為"編譯型"或者"解釋性"本來就是偽命題 }..
其實總結這些知識,也是在DDD,只不過業務是技術本身而已 .
主要還是要區分好哪些屬性應該在哪些類里 , 分清限界上下文 .