位置:首頁 > 軟件操作教程 > 編程開發(fā) > C# > 問題詳情

托管代碼的優(yōu)點

提問人:劉冬梅發(fā)布時間:2020-10-12

Microsoft中間語言與Java字節(jié)代碼共享一種理念:它們都是一種低級語言,語法很簡單(使用數(shù)字代碼,而不是文本代碼),可以非常快速地轉(zhuǎn)換為內(nèi)部機器碼。對于代碼來說,這種精心設(shè)計的通用語法,有很重要的優(yōu)點。

1. 平臺無關(guān)性

首先,這意味著包含字節(jié)代碼指令的同一文件可以放在任一平臺中,運行時編譯過程的最后階段可以很容易完成,這樣代碼就可以運行在該特定的平臺上。換言之,編譯為中間語言就可以獲得.NET平臺無關(guān)性,這與編譯為Java字節(jié)代碼就會得到Java平臺無關(guān)性是一樣的。

注意.NET的平臺無關(guān)性目前只是一種可能,因為在編寫本書時,.NET只能用于Windows平臺,但人們正在積極準(zhǔn)備,使它可以用于其他平臺(參見Mono項目,它用于創(chuàng)建.NET的開放源代碼的實現(xiàn),參見http://www.go-mono.com/)。

2. 提高性能

實際上,IL比Java字節(jié)代碼的作用還要大。IL總是即時編譯的(稱為JIT編譯),而Java字節(jié)代碼常常是解釋性的,Java的一個缺點是,在運行應(yīng)用程序時,把Java字節(jié)代碼轉(zhuǎn)換為內(nèi)部可執(zhí)行代碼的過程會導(dǎo)致性能的損失(但在最近,Java在某些平臺上能進(jìn)行JIT編譯)。

JIT編譯器并不是把整個應(yīng)用程序一次編譯完(這樣會有很長的啟動時間),而是只編譯它調(diào)用的那部分代碼(這是其名稱由來)。代碼編譯過一次后,得到的內(nèi)部可執(zhí)行代碼就存儲起來,直到退出該應(yīng)用程序為止,這樣在下次運行這部分代碼時,就不需要重新編譯了。Microsoft認(rèn)為這個過程要比一開始就編譯整個應(yīng)用程序代碼的效率高得多,因為任何應(yīng)用程序的大部分代碼實際上并不是在每次運行過程中都執(zhí)行。使用JIT編譯器,從來都不會編譯這種代碼。

這解釋了為什么托管IL代碼的執(zhí)行幾乎和內(nèi)部機器代碼的執(zhí)行速度一樣快,但是并沒有說明為什么Microsoft認(rèn)為這會提高性能。其原因是編譯過程的最后一部分是在運行時進(jìn)行的,JIT編譯器確切地知道程序運行在什么類型的處理器上,利用該處理器提供的任何特性或特定的機器代碼指令來優(yōu)化最后的可執(zhí)行代碼。

傳統(tǒng)的編譯器會優(yōu)化代碼,但它們的優(yōu)化過程是獨立于代碼所運行的特定處理器的。這是因為傳統(tǒng)的編譯器是在發(fā)布軟件之前編譯為內(nèi)部機器可執(zhí)行的代碼。即編譯器不知道代碼所運行的處理器類型,例如該處理器是x86兼容處理器或Alpha處理器,這超出了基本操作的范圍。例如Visual Studio 6優(yōu)化了一臺一般的Pentium機器,所以它生成的代碼就不能利用Pentium III處理器的硬件特性。相反,JIT編譯器不僅可以進(jìn)行Visual Studio 6所能完成的優(yōu)化工作,還可以優(yōu)化代碼所運行的特定處理器。

3. 語言的互操作性

使用IL不僅支持平臺無關(guān)性,還支持語言的互操作性。簡言之,就是能將任何一種語言編譯為中間代碼,編譯好的代碼可以與從其他語言編譯過來的代碼進(jìn)行交互操作。

那么除了C#之外,還有什么語言可以通過.NET進(jìn)行交互操作呢?下面就簡要討論其他常見語言如何與.NET交互操作。

(1) VB.NET

Visual Basic 6在升級到Visual Basic .NET時,經(jīng)歷了一番脫胎換骨的變化。Visual Basic是在最近的幾年中演化的,其早期版本Visual Basic 6并不適合運行.NET程序。例如,它與COM的高度集成,且只把事件處理程序作為源代碼顯示給開發(fā)人員,大多數(shù)后臺代碼不能用作源代碼。另外,它不支持繼承,Visual Basic使用的標(biāo)準(zhǔn)數(shù)據(jù)類型也與.NET不兼容。

Visual Basic 6已經(jīng)升級為Visual Basic .NET,對VB進(jìn)行的改變非常大,完全可以把Visual Basic .NET當(dāng)作是一種新語言?,F(xiàn)有的VB6代碼不能編譯為VB.NET代碼,把VB6程序轉(zhuǎn)換為VB.NET時,需要對代碼進(jìn)行大量的改動,但大多數(shù)修改工作都可以由Visual Studio .NET(VS的升級版本,用于與.NET一起使用)自動完成。如果要把一個VB6項目讀取到Visual Studio .NET中,Visual Studio .NET就會升級該項目,也就是說把VB6源代碼重寫為VB.NET源代碼。雖然這意味著其中的工作已大大減輕,但用戶仍需要檢查新的VB.NET代碼,以確保項目仍可正確工作,因為這種轉(zhuǎn)換并不十分完美。

這種語言升級的一個副作用是不能再把VB.NET編譯為內(nèi)部可執(zhí)行代碼了。VB.NET只編譯為中間語言,就像C#一樣。如果需要繼續(xù)使用VB6編寫程序,就可以這么做,但生成的可執(zhí)行代碼會完全忽略.NET Framework,如果繼續(xù)把Visual Studio作為開發(fā)環(huán)境,就需要安裝Visual Studio 6。

(2) Visual C++ .NET

Visual C++ 6有許多Microsoft對Windows的特定擴展。通過Visual C++ .NET,又加入了更多的擴展內(nèi)容,來支持.NET Framework?,F(xiàn)有的C++源代碼會繼續(xù)編譯為內(nèi)部可執(zhí)行代碼,不會有修改,但它會獨立于.NET運行庫運行。如果要讓C++代碼在.NET Framework中運行,就要在代碼的開頭添加下述命令:

#using <mscorlib.dll>

還要把標(biāo)記/clr傳遞給編譯器,編譯器假定要編譯托管代碼,因此會生成中間語言,而不是內(nèi)部機器碼。C++的一個有趣的問題是在編譯托管代碼時,編譯器可以生成包含內(nèi)嵌本機可執(zhí)行代碼的IL。這表示在C++代碼中可以把托管類型和非托管類型合并起來,因此托管C++   代碼:

class MyClass

{

定義了一個普通的C++類,而代碼:

__gc class MyClass

{

生成了一個托管類,就好像使用C#或VB.NET編寫類一樣。實際上,托管C++比C#更優(yōu)越的一點是可以在托管C++代碼中調(diào)用非托管C++類,而不必采用COM交互功能。

如果在托管類型上試圖使用.NET不支持的特性(例如,模板或類的多繼承),編譯器就會出現(xiàn)一個錯誤。另外,在使用托管類時,還需要使用非標(biāo)準(zhǔn)的C++特性(例如上述代碼中的__gc關(guān)鍵字)。

因為C++允許低級指針操作,C++編譯器不能生成可以通過CLR內(nèi)存類型安全測試的代碼。如果CLR把代碼標(biāo)識為內(nèi)存類型安全是非常重要的,就需要用其他一些語言編寫源代碼,例如C# 或VB.NET。

(3) Visual J#

最新添加的語言是Visual J#。在.NET Framework 1.1版本推出之前,用戶必須下載相應(yīng)的軟件,才能使用J#?,F(xiàn)在J#語言內(nèi)置于.NET Framework中。因此,J#用戶可以利用Visual Studio .NET的所有常見特性。Microsoft希望大多數(shù)J++用戶認(rèn)為他們在使用.NET時,將很容易使用J#。J#不使用Java運行庫,而是使用與其他.NET兼容語言一樣的基類庫。這說明,與C#和VB.NET一樣,可以使用J#創(chuàng)建ASP.NET Web應(yīng)用程序、Windows窗體、XML Web服務(wù)和其他應(yīng)用程序。

(4) 腳本語言

腳本語言仍在使用之中,但由于.NET的推出,一般認(rèn)為它們的重要性在降低。另一方面,JScript升級到JScript.NET。ASP.NET頁面可以用JScript.NET編寫,現(xiàn)在可以把JScript.NET當(dāng)作一種編譯語言來運行,而不是解釋性的語言,也可以編寫輸入量比較大的JScript.NET代碼。有了ASP.NET后,就沒有必要在服務(wù)器端的Web頁面上使用腳本語言了,但VBA仍用作Office文檔和Visual Studio宏語言。

(5) COM和COM+

從技術(shù)上講,COM 和 COM+并不是面向.NET的技術(shù),因為基于它們的組件不能編譯為IL(但如果原來的COM組件是用C++編寫的,使用托管C++,在某種程度上可以這么做)。但是,COM+仍然是一個重要的工具,因為其特性沒有在.NET中完全實現(xiàn)。另外,COM組件仍可以使用——.NET組合了COM的互操作性,從而使托管代碼可以調(diào)用COM組件,COM組件也可以調(diào)用托管代碼(見第29章)。在大多數(shù)情況中,把新組件編寫為.NET組件,其多數(shù)目的是為了比較方便,因為這樣可以利用.NET基類和托管代碼的其他優(yōu)點。

繼續(xù)查找其他問題的答案?

相關(guān)視頻回答
回復(fù)(0)
返回頂部