當前位置:首頁 » 編程軟體 » 編譯過程中為什麼採用中間語言

編譯過程中為什麼採用中間語言

發布時間: 2022-09-06 20:10:29

❶ 什麼叫中間語言

中間語言MSIT
在.Net框架中,公共語言基礎結構使用公共語言規范來綁定不同的語言。通過要求不同的語言至少要實現公共類型系統(CTS)包含在公共語言規范中的部分,公共語言基礎結構允許不同的語言使用.Net框架。因此在.Net框架中,所有的語言(C#,VB.Net,Effil.Net等)最後都被轉換為了一種通用語言:微軟中間語言(MSIL)。
MSIL是將.Net代碼轉化為機器語言的一個中間過程。它是一種介於高級語言和基於Intel的匯編語言的偽匯編語言。當用戶編譯一個.Net程序時,編譯器將源代碼翻譯成一組可以有效地轉換為本機代碼且獨立於CPU 的指令。當執行這些指令時,實時(JIT)編譯器將它們轉化為CPU特定的代碼。由於公共語言運行庫支持多種實時編譯器,因此同一段MSIL代碼可以被不同的編譯器實時編譯並運行在不同的結構上。從理論上來說,MSIL將消除多年以來業界中不同語言之間的紛爭。在.Net的世界中可能出現下面的情況:一部分代碼可以用Effil實現,另一部分代碼使用C#或VB完成的,但是最後這些代碼都將被轉換為中間語言。這給程序員提供了極大的靈活性,程序員可以選擇自己熟悉的語言,並且再也不用為學習不斷推出的新語言而煩惱了。
解密微軟中間語言的系列文章將通過一些簡單易懂的方式來揭示中間語言的復雜原理。這些原理通過詳細的例子來闡述。在一些例子中同時給出了源代碼和中間代碼,通過比較源代碼和中間代碼,我們可以更好地理解編譯器的局限性,指導我們編寫出更好更快的代碼。
微軟中間語言概述 1.用中間語言編寫的一個簡單程序
讓我們從經典的Hello World例子開始。首先在一個文本編輯器中輸入以下的代碼,並保存為HelloWorld.il:
.assembly HelloWorldIL {}
.method static void HelloWorld() {
.entrypoint
ldstr "Hello World."
call void [mscorlib]System.Console::WriteLine(class System.String)
ret
}
在一個中間語言程序中,如果某一行以「.」開始,則代表這是一個傳輸給匯編工具的指令,該指令要求匯編工具執行某些操作,例如生成一個函數或類。而沒有以「.」開始的行是中間語言的代碼。在中間語言中方法通過匯編命令method來定義,匯編命令後跟方法的返回值、名稱和參數。方法體被包含在{}中。例子中的ret代表該方法的結束。
一個中間語言文件可以包含很多函數,匯編工具沒有辦法分辨應該首先執行哪一個方法。在諸如C#或VB這一類高級語言中,程序的入口方法通常都有特定的名稱,例如在C#中的public static void Main()。這就是上面的匯編工具發出錯誤提示的原因。在中間語言中,第一個被執行的方法被稱為入口函數(EntryPoint Function)。為了告訴匯編工具HelloWorld是入口函數,我們需要在代碼中增加一條匯編命令entrypoint,該命令可以放在方法體中的任何位置。需要注意的是在一個程序集中只能有一個入口函數。
中間語言代碼通常被編譯成一個模塊,該模塊隸屬於一個程序集。在.Net中模塊和程序集的概念非常重要,因此開發人員需要很清楚地了解它們。在後面的文章中我們將詳細討論.Net程序的結構。通過在代碼中加入assembly命令,可以告訴匯編工具中間代碼隸屬於那個程序集。assembly命令的格式如下:
.assembly <程序集名稱> {}
需要注意在method命令後加入了static關鍵字,這是因為每個入口函數必須是靜態的,例如在C#中我們將Main方法定義為public static void Main()。
接下來我們需要調用WriteLine方法將HelloWorld字元串輸出到屏幕。通過使用call指令(Instruction)我們可以達到這個目的。指令的格式如下:
call <return type> <namespace>.<class name>::<method name>
這里我們可以看到當調用一個方法時,中間語言和其他的編程語言有很大的區別。在中間語言中,如果需要調用一個方法,需要指定方法的全名,包括他的名稱域(namespace)、類名、返回值類型和參數的數據類型。這樣就保證了匯編工具能夠找到正確的方法。
在調用WriteLine方法時需要一個字元串參數。所有傳遞給方法或函數的參數都被保存在內存的堆棧中。在中間語言中有一個指令ldstr可以從堆棧中載入一個字元串。(堆棧是內存中的一塊區域,它被用於將參數傳輸給方法,在後面我們會詳細討論堆棧的問題)。所有的方法都從堆棧中獲取它們的參數,因此ldstr指令是必不可少的。ldstr指令的格式如下所示:
ldstr <parameter string>
我們可以用ILAsm.exe來編譯這個程序。在運行ILAsm.exe之前,首先需要確認一下該程序已經包含在了Windows操作系統的Path環境變數中。ILAsm.exe 可在下面的路徑中找到:
%windir%\Microsoft.NET\Framework\v1.0.xxxx
其中xxxx是正在使用的.NET框架的內部版本號。例如我使用的版本號是3705,則應該如下設置Path環境變數:
Set Path = %Path%;c:\Windows\Microsoft.NET\Framework\v1.0.3705
然後運行cmd.exe(開始->運行->輸入cmd->按下確認鍵)。在彈出的命令窗口中輸入:
J:\Testcode>ilasm HelloWorld.il
匯編代碼後運行程序就可以看到Hello World.的輸出。
通過上面的例子,我們了解了中間語言的程序結構,一些命令和指令。同時需要提醒大家的是中間語言是區分大小寫的。
2.改進的HelloWorld例子
在.Net中的所有語言都是面向對象的語言,但是上面的HelloWorld例子是一個結構化的例子。下面讓我們來看一下如何將它轉化為面向對象的代碼。在面向對象的編程中,我們將操作定義在類中。為了將上面的HelloWorld例子轉化為面向對象的代碼,可以使用class命令:
.class HelloWorld { }
class命令後緊跟的是類的名稱。類的名稱在中間語言中是可選的。同時我們還需要為該指令添加一些屬性,例如存取控制類在內存中的布局和互用性等。這樣代碼就變成了:
.assembly HelloWorldIL {}
.class public auto ansi HelloWorld extends [mscorlib]System.Object {
.method public hidebysig static void HelloWorld() cil managed {
.entrypoint
ldstr "Hello World."
call void [mscorlib]System.Console::WriteLine(class System.String)
ret
}
.method public hidebysig specialname rtspecialname instance void .ctor() cil managed {
ldarg.0
call instance void [mscorlib]System.Object::.ctor()
ret
}
}
在代碼中用到了三個屬性:
· public:public是訪問控制屬性,它表明了對於訪問該類的成員沒有限制。
· auto:auto屬性表明了當類被載入到內存中時,在內存中的布局是由公共運行庫而不是程序決定的。
· ansi:指定ansi屬性是為了在沒有被管理和被管理的代碼之間實現無縫的轉化。在.Net中,那些不可直接應用在公共語言基礎設施之上的代碼被稱為沒有被管理的代碼,例如C、C++和VB6的代碼。我們需要一個屬性來處理被管理的代碼和沒有被管理的代碼之間的互用性。在被管理的代碼中,字元串用雙位元組的Unicode字元表示,而在被管理的代碼中,字元串有可能用單位元組的ANSI字元表示。指定了ansi屬性就可以在不同的代碼間轉化字元串了。
我們知道在.Net框架中,所有的類都直接或間接地繼承了System.Object類。在代碼中我們明確指定了HelloWorld繼承了System.Object。
在HelloWorld方法中加入了public、hidebysig、cil managed屬性,下面是對這些屬性的解釋:
· public:在C#或VB.Net中,當我們定義一個方法時,需要指定方法的訪問修飾符。訪問修飾符可以是public、protected、internal或private 。
· hidebysig:一個類可以繼承其他的類,hidebysig屬性保證當前類中的方法在作為父類時不會被子類繼承。例如如果HelloWorldChild類繼承了HelloWorld類,在HelloWorldChild中不會看到HelloWorld方法。
· cil managed:該屬性將在後面討論。
在高級語言中(C#,VB.Net等),每個類必須有構造函數,而且構造函數的第一行需要調用基類的構造函數。如果類中沒有構造函數,基類的構造函數將被自動調用。通常這是由編譯器自動完成的,現在我們要在的代碼中加入構造函數,該構造函數通過.ctor命令調用基類的構造函數。
小結
本文我們從經典的Hello World例子開始,通過實例了解了微軟中間語言的基本語法規則以及中間語言與其他開發語言的關系。在下一篇文章中,我們將在此基礎上,運用實常式序講述.net應用程序的格式和結構等內容。

❷ 什麼是中間語言(IL)它的作用

IL是.NET框架中中間語言(Intermediate Language)的縮寫。使用.NET框架提供的編譯器可以直接將源程序編譯為.exe或.dll文件,但此時編譯出來的程序代碼並不是CPU能直接執行的機器代碼,而是一種中間語言IL(Intermedate Language)的代碼。
使用中間語言的優點有兩點,一是可以實現平台無關性,既與特定CPU無關;二是只要把.NET框架某種語言編譯成IL代碼,就實現.NET框架中語言之間的交互操作。(《C#程序設計及應用教程》(第2版),馬駿 主編)

參考:http://ke..com/view/2278922.htm

❸ 編譯程序是不是一定要產生中間代碼

是的,中間代碼的意義就是微軟推出.NET平台的意義
NET是Microsoft面向XMLWeb服務的平台,這種下一代的軟體將使用一種統一、個性化的方式將我們的信息、設備和人員緊密聯系在一起。

❹ 中間語言的名詞解釋

中間語言 ,在計算機科學中,是指一種應用於抽象機器 的編程語言,它設計的目的,是用來幫助我們分析計算機程序。這個術語源自於編譯器,在編譯器將源代碼編譯為目的碼的過程中,會先將源代碼轉換為一個或多個的中間表述,以方便編譯器進行最佳化,並產生出目的機器的機器語言。通常,中間語言的設計與一般的機器語言有三個不同之處:
1、每個指令代表僅有一個基本的操作。舉例來說,在微處理器中出現的shift-add定址模式在中間語言不會出現。
2、指令集內可能不會包含控制流程的資訊。
3、暫存器可用的數量可能會很大,甚至沒有限制。

❺ 編譯過程中,源程序為什麼要通過中間代碼生成目標程序

源程序是指程序員編寫的代碼,可以被編譯程序編譯為目標程序。
如果是c++,那麼後綴為.cpp
目標程序是編譯程序將源程序編譯後的結果,如果是c++,那麼後綴是.o
編譯程序一般是編譯器公司(比如微軟
intel他們都生產編譯器)做的,它將源代碼轉化為機器可識別的文件,經過鏈接,生成可執行程序。
解釋程序即解釋器,它不需要經過編譯階段即可根據用戶源程序執行。
程序語言分編譯類和解釋類語言。

❻ 編譯程序中安排中間代碼生成的目的是哪3個

1.中間代碼生成是為優化和移植而進行的
2.中間代碼表示包含的符號的屬性信息
3..

c語言編譯的時候會不會先生成中間語言

C語言編譯時,會生成中間語言叫做匯編語言,再由匯編生成機器語言!同時,C語言程序編譯的過程經過4個階段:預處理(Preprocessing)、編譯(Compilation)、匯編(Assembly)、鏈接(Linking)。
1)預處理階段在該階段主要完成對源代碼的預處理工作,主要包括對宏定義指令,頭文件包含指令,預定義指令和特殊字元的處理,如對宏定義的替換以及文件頭中所包含的文件中預定義代碼的替換等,總之這步主要完成一些替換工作,輸出是同源文件含義相同但內容不同的文件。
2)編譯、優化階段編譯就是將第一階段處理得到的文件通過詞法語法分析等轉換為匯編語言。優化包括對中間代碼的優化,如刪除公共表達式,循環優化等;和對目標代碼的生成進行的優化,如如何充分利用機器的寄存器存放有關變數的值,以減少內存訪問次數。
3)匯編階段將匯編語言翻譯成機器指令
4)鏈接階段鏈接階段的主要工作是將有關的目標文件連接起來,即將在一個文件中引用的符號同該符號在另外一個文件中的定義連接起來,使得所有的目標文件成為一個能夠被操作系統裝入執行的統一整體。
具體詳情可以參照:
http://wenku..com/link?url=-

❽ 中間語言有什麼用

把編程語言轉變為計算機CPU可以識別的底層語言,也即匯編語言。例如C#.net和VB.net經過中間語言的轉換都轉換成了相同的底層語言。這也就是為什麼很多不同的語言編程卻能實現相當的效果

❾ C# 為什麼要弄成中間代碼

1、因為c語言也不能說真正的跨平台,只是這種語言比較低級,各個平台的實現相對一致。
c語言的東西下載時還是會分平台的,比如for linux, for windows, for Mac等,不同平台的編譯器對c的解釋都有差異,所以只能說跨平台容易一些。
2、按微軟的規劃,以後的應用程序要從網上付費下載來使用,這樣就帶來下載軟體的安全與否的問題,而C#經編譯後形成的是中間代碼,不可以在本地機器上直接執行,必須經過CLR轉換成本地代碼後才能執行。
這樣,中間碼可以順利通過防火牆,而且安全性又有CLR來保證。

❿ 使用中間代碼表示有哪些優點

1、中間代碼是源程序的一種內部表示,或稱中間語言。
2、中間代碼的作用是可使編譯程序的結構在邏輯上更為簡單明確,特別是可使目標代碼的優化比較容易實現中間代碼,即為中間語言程序,中間語言的復雜性介於源程序語言和機器語言之間。
3、中間語言有多種形式,常見的有逆波蘭記號、四元式、三元式和樹。

熱點內容
家長申述驗證的密碼是什麼 發布:2025-03-20 18:55:27 瀏覽:7
編譯原理與技術第二版下載 發布:2025-03-20 18:55:26 瀏覽:936
怎麼寫編程語言 發布:2025-03-20 18:42:52 瀏覽:687
我去密碼是多少 發布:2025-03-20 18:12:28 瀏覽:541
方舟編譯器啥時候開始 發布:2025-03-20 18:11:40 瀏覽:958
常用java類 發布:2025-03-20 18:07:06 瀏覽:201
怎麼查看安卓大屏使用的什麼協議 發布:2025-03-20 18:03:07 瀏覽:704
好用的linux系統 發布:2025-03-20 17:51:15 瀏覽:648
n1網路存儲 發布:2025-03-20 17:51:11 瀏覽:634
mysql資料庫更改密碼 發布:2025-03-20 17:50:33 瀏覽:775