【正文】
le processor or an Alpha processor. Visual Studio 6, for example, optimizes for a generic Pentium machine, so the code that it generates cannot take advantage of hardware features of Pentium III processors. On the other hand, the JIT piler can do all the optimizations that Visual Studio 6 can, and in addition it will optimize for the particular processor the code is running on. Language interoperability The use of IL not only enables platform independence。在大多數(shù)情況中,把新組件編寫為 .NET 組件,其多數(shù)目的是為了 更加 方便,因?yàn)檫@樣可以利用 .NET基類和托管代碼的其他優(yōu)點(diǎn)。但是, COM+仍然是一個(gè)重要的工具,因?yàn)槠涮匦詻]有在 .NET中完全實(shí)現(xiàn)。有了 后,就沒有必要在服務(wù)器端的Web頁面上使用腳本語言了,但 VBA仍用作 Office文檔和 Visual Studio宏語言。另一方面, JScript 升級到。這說明,與 C和 一樣,可以使用 J創(chuàng)建 Web應(yīng)用程序、 Windows窗體、 XML Web服務(wù)和其他應(yīng)用程序。 Microsoft希望大多數(shù) J++用戶認(rèn)為他們在使用 .NET 時(shí),將很容易使用 J?,F(xiàn)在 J語言內(nèi)置于 .NET Framework中。 (3) Visual J 最新添加的語言是 Visual J。 因?yàn)?C++允許低 級指針操作, C++編譯器不能生成可以通過 CLR 內(nèi)存類型安全測試的代碼。 如果在托管類型上試圖使用 .NET不支持的特性 (例如,模板或類的多繼承 ),編譯器就會出現(xiàn)一個(gè)錯(cuò)誤。這表示在 C++代碼中可以把托管類型和非托管類型合 并起來,因此托管 C++ 代碼: class MyClass { 定義了一個(gè)普通的 C++類,而代碼: __gc class MyClass { 生成了一個(gè)托管類,就好像使用 C或 。如果要讓 C++代碼在 .NET Framework中運(yùn)行,就要在代碼的開頭添加下述命令: using 還要把標(biāo)記 /clr 傳遞給編譯器,編譯器假定要編譯托管代碼,因此會生成中間語言,而不是內(nèi)部機(jī)器碼。通過 Visual C++ .NET, 又加入了更多的擴(kuò)展內(nèi)容,來支持 .NET Framework。如果需要繼續(xù)使用 VB6 編寫程序,就可以這么做,但生成的可執(zhí)行代碼會完全忽略 .NET Framework,如果繼續(xù)把 Visual Studio作為開發(fā)環(huán)境,就需要安裝 Visual Studio 6。 這種語言升級的一個(gè)副作用是不能再把 編譯為內(nèi)部可執(zhí)行代碼了。如果要把一個(gè) VB6項(xiàng)目讀取到 Visual Studio .NET中, Visual Studio .NET 就會升級該項(xiàng)目,也就是說把 VB6源代碼重寫為 源代碼。 Visual Basic 6已經(jīng)升級為 Visual Basic .NET,對 VB 進(jìn)行的改變非常大,完全可以把 Visual Basic .NET當(dāng)作是一種新語言。例如,它與 COM的高度集成,且只把事件處理程序作為源代碼顯示給開發(fā)人員,大多數(shù)后臺代碼不能用作源代碼。 (1) Visual Basic 6在升級到 Visual Basic .NET時(shí),經(jīng)歷了一番脫胎換骨的變化。簡言之,就是能將任何一種語言編譯為中間代碼,編譯好的代碼可以與從其他語言編譯過來的代碼進(jìn)行交互操作。相反, JIT 編譯器不僅可以進(jìn)行 Visual Studio 6所能完成的優(yōu)化工作,還可以優(yōu)化代碼所運(yùn)行的特定處理器。即編譯器不知道代碼所運(yùn)行的處理器類型,例如該處理器是 x86兼容處理器或 Alpha處理器,這超出了基本操作的范圍。 傳統(tǒng)的編譯器會優(yōu)化代碼,但它們的優(yōu)化過程是獨(dú)立于代碼所運(yùn)行的特定處理器的。 這解釋了為什么托管 IL 代碼的執(zhí)行幾乎和內(nèi)部機(jī)器代碼的執(zhí)行速度一樣快,但是并沒 有說明為什么Microsoft 認(rèn)為這會提高性能。 Microsoft認(rèn)為這個(gè)過程要比一開始就編譯整個(gè)應(yīng)用程序代碼的效率高得多,因?yàn)槿魏螒?yīng)用程序的大部分代碼實(shí)際上并不是在每次運(yùn)行過程中都執(zhí)行。 JIT編譯器并不是把整個(gè)應(yīng)用程序一次編譯完 (這樣會有很長的啟動時(shí)間 ),而是只編譯它調(diào)用的那部分代碼(這是其名稱由來 )。 注意 .NET的平臺無關(guān)性目前只是一種可能,因?yàn)樵诰帉懕緯鴷r(shí), .NET 只能用于 Windows平臺,但人們正在積極準(zhǔn)備,使它可以用于其他平臺 (參見 Mono 項(xiàng)目,它用于創(chuàng)建 .NET 的開放源代碼的實(shí)現(xiàn),參見 2. 提高性能 實(shí)際上, IL比 Java字節(jié)代碼的作用還要大。 1. 平臺無關(guān)性 首先,這意味著包含字節(jié)代碼指令的同一 個(gè) 文件可以放在任一 個(gè) 平臺中,運(yùn)行時(shí)編譯過程的最后階段可以很容易完成,這樣代碼就可以運(yùn)行在該特定的平臺上。托管代碼的優(yōu)點(diǎn) Microsoft中間語言與 Java字節(jié)代碼共享一種理念:它們都是一種低級語言,語法很簡單 (使用數(shù)字代碼,而不是文本代碼 ),可以非常快速地轉(zhuǎn)換為內(nèi)部機(jī)器碼。對于代碼來說,這種精心設(shè)計(jì)的通用語法,有很 大 的優(yōu)點(diǎn)。 也就是說 編譯為中間語言就可以獲得 .NET 平臺無關(guān)性,這與編譯為 Java字節(jié)代碼就會得到 Java平臺無關(guān)性是一樣的。 IL 總是即時(shí)編譯的 (稱為 JIT 編譯 ),而 Java字節(jié)代碼常常是解釋性的, Java的一個(gè)缺點(diǎn)是,在運(yùn)行應(yīng)用程序時(shí),把 Java字節(jié)代碼轉(zhuǎn)換為內(nèi)部可執(zhí)行代碼的過程會導(dǎo)致性能的損失 (但在最近, Java在某些平臺上能進(jìn)行 JIT編譯 )。代碼編譯過一次后,得到的內(nèi)部可執(zhí)行代碼就存儲起來,直到退出該應(yīng)用程序?yàn)橹?,這樣在下次運(yùn)行這部分代碼時(shí),就不需要重新編譯了。使用 JIT 編譯器,從來都