2011-06-22 103 views
5

爲什麼ActionScript,Java,C#等編譯成中間代碼? 我知道使用中間代碼的跨平臺好處。爲什麼編譯成中間代碼?

問題是:與解釋的腳本(JS,Python,PHP,Perl等)相比,編譯到中間代碼的好處是什麼?

它只是代碼混淆?或者是什麼?

另外,與編譯爲本機代碼相比,有哪些好處?

+6

這不是混淆。不是絲毫的 – SLaks

回答

6

所有歷史上的java首先被定位到手機和嵌入式設備具有非常有限的CPU /存儲器不同的語言之間,以及JVM上這樣設備無法進行任何強化優化,就像現在的現代JIT一樣。所以java engeneers決定將優化轉移到編譯階段。

接下來,擁有「字節碼」/ IL允許您將來自不同語言的許多編譯器轉換爲此類字節碼 - 並且只有一個JVM/JIT。爲每種語言創建單獨的VM + JIT會更有效率。請記住,在.NET世界中,您有JVM世界中的Java,JRuby,JPython,Groovy等,以及C#,VB#,ASP.NET,F#等等,每個只有一個運行時/虛擬機。

+1

ASP.NET是一個平臺,而不是編程語言。 –

+0

好吧,可能是我濫用了一些名字 - .NET不是我的專長:) – BegemoT

12

解析和JIT編譯IL代碼比解析Java等高級語言或特別是C#(具有更多功能)要快得多。

它還允許開發人員在不更新最終用戶機器上的任何內容的情況下使用新的語言功能。 (例如,LINQBridge)

1

中間代碼與彙編非常相似,它包含一組有限的指令。然後,運行時就可以在這個(有點)小的指令集上可靠且一致地操作,而不必擔心語法分析等問題。因此,它可以獲得性能改進並進行優化。

1

在.NET編譯爲MSIL解決互操作性如C#,VB.NET等

1

二進制代碼指令非常簡單和原子化,遠比編程語句可以。

例如,需要將z = a + b - (c * d)轉換爲將四個值加載到寄存器中,然後進行加法,乘法和減法,然後寫入另一個存儲器位置。所以我們至少有8條指令,只是爲了這條線!

中間代碼是兩個世界中最好的 - 跨平臺,但也更接近機器代碼通常編寫的方式。

1

除了SLaks的答案之外,編譯爲IL還可以實現一定程度的跨語言互操作性,這在解釋型語言中通常不存在。

這種優勢對於新語言來說可能是巨大的。斯卡拉自2003年以來一直保持着這種狀態,並且已經獲得了巨大的牽引力。另一方面,Ruby在其存在的1.5年中並未遠遠超出Rails應用程序的使用範圍。這至少部分是因爲Scala與所有預先存在的Java代碼和庫都是字節碼兼容的,這使得它具有巨大的優勢:它的社區可以將大部分工作集中在語言本身上,潛在的採用者沒有擔心要經歷任何特殊的扭曲(或者更糟糕的是,替換他們的整個代碼庫)才能開始使用Scala。 F#的故事幾乎完全相同,但是對於其他主要的託管環境。同時,Ruby不會輕易地與其他語言的代碼交流,所以它的社區不得不花費更多的精力來開發特定於Ruby的庫和框架,並且其潛在用戶必須更加願意承諾進行大規模的平臺轉換以便使用它。

+0

JRuby(JVM上的Ruby)怎麼樣? – Jesper