2015-10-16 66 views
6

我在這裏錯過了一些基本的東西。從源語言編譯成字節碼(Java)或中間語言(.NET),然後從JVM或CLR內部運行它們的用法是什麼?爲什麼我們需要/使用託管代碼(通過本機)?


有性能的使用託管代碼(無論多小或大)的下降,但有什麼好處?我知道存在垃圾回收和內存管理,但即使將源代碼直接編譯爲本地代碼而不需要此中間級別,也不是更好嗎?

另外(我在這裏添加它,因爲它直接與問題相關) - 顯然Windows 10通用應用程序編譯爲.NET Native編譯爲本機機器碼。我很好奇爲什麼在所有的.NET程序中都沒有這樣做。

+1

無論如何,你已經實現了虛擬機,字節碼的一大優勢就是能夠運行它。這在Windows中是有限的,因爲你只是針對一些體系結構(原子,x86等)。 – Sammy

+0

.NET Native並不是簡單地「編譯爲機器代碼」,它本質上並不需要提早開始,所以它不需要稍後再被激怒。這仍然轉換爲與jit期間相同的機器碼;你的過分簡單化讓它聽起來像你認爲它奇蹟般地變成了原生的C++。 – Krythic

+0

@Krythic我明白了。但是這些不是我選擇的單詞,我從我剛纔提到的鏈接引用([.NET Native](https://msdn.microsoft.com/en-us/vstudio/dotnetnative.aspx))。 –

回答

2

除了一切在其他的答案中指出,這種方法的主要好處是開發和維護以及開發環境的大大提高可擴展性實現了重要的成本削減。

考慮沒有中間語言的情況;您需要針對每種受支持的語言開發並維護一個編譯器,以支持每種受支持的平臺。假設你有語言L1L2L3和平臺P1P2P3。這意味着你需要開發和9個十個分量不同的編譯器:C1(L1,P1)C2(L1,P2)C3(L1,P3)C4(L2,P1)

在另一方面,具有中間的共同語言用於開發3語言特定編譯C1(L1,I)C2(L2,I)C3(L3, I)和3個特定於平臺的編譯器C4(I,P1),C 5(I,P2)C6(I,P3)

顯然,你支持的語言和平臺的基礎越大,越signifcant成本的降低會。

它還爲您在將來添加受支持的平臺或語言時提供了很大的靈活性;任何新的語言L4將只需要一個單一的編譯器C(L4,I)的發展,你inmediately支持所有平臺,一個發展的價格。相反,如果你有一個新的平臺P4,你只需要開發C(I,P4)和,賓果,你有L1L2L3P4所有工作。

這基本上是一個雙贏的局面。

-1

字節碼和JVM「詭計」是指代碼以同樣的方式總是解釋,獨立於平臺的它跑。我很久以前就模糊地讀過英特爾和AMD(以及其他處理器)做不同的邏輯操作,這會在這些處理器上產生不同的結果,並可能導致一些跨平臺的錯誤。所以字節碼解決了這個問題,結果總是不變的。另一方面,如果您知道您只是針對一個平臺進行編程並希望獲得額外的性能,那麼這就是嵌入式軟件開發(或低級語言)進入的地方。當您知道Java和.NET時最好使用它表現並不那麼重要。

0

這是因爲編譯爲本地代碼將使你的程序的平臺指定。 但是,通過編譯爲中間語言,您的程序是可移植的,並且可以在每個平臺上運行(如果有指定JVM/CLR的平臺)。

Java和.NET中使用即時編譯,使他們能夠提供便攜性,而且還更好的性能,使用翻譯進行比較。

此外,微軟已經與Visual Studio提供NGEN一起編譯的.Net代碼爲本地代碼:
https://msdn.microsoft.com/en-us/library/6t9t5wcf(v=vs.110).aspx
NGEN和.Net原住民之間的主要區別在於,NGEN仍然依賴於.NET Framework和.NET Native與程序一起編譯.Net所需的代碼,因此不需要安裝.Net Framework。

-1

在當產生字節代碼的Java,其是專用於特定類型的結構,有助於到Java實現其「一次編譯隨處運行的能力。 除此之外,它佔用的內存非常少。

2

這是MSDN:託管代碼

優勢

託管語言提供了一個通用的方法來處理內存管理和垃圾收集的細節,在開銷少量的費用。這種權衡將您從容易出錯的任務中解放出來,並允許您編寫更緊湊,可讀和無差錯的程序。聯合國人託管代碼

優點如果您使用的非託管的語言,如C++,您必須編寫額外的代碼來管理內存和安全性,並清理對象,他們已經達到目的了。家政服務的細節很複雜,與項目的預期功能無關,因此開發商往往忽視這些任務,忽視它們或者忽略它們。因此,非託管代碼通常測試成本更高,耗時更長,並且需要更多的程序員培訓和紀律。

但是,開發人員往往喜歡非託管代碼,因爲它的執行速度更快,允許使用指針的更大的靈活性,並給出了硬件的直接控制。

+2

看來Aniruddha Varma的問題不是託管/非託管代碼的問題。他想知道爲什麼在Java/.Net程序中使用中間語言。 –

相關問題