<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      Fork me on GitHub

      [譯]C++, Java和C#的編譯過程解析

      1.1.1 摘要

      我們知道計算機不能直接理解高級語言,它只能理解機器語言,所以我們必須要把高級語言翻譯成機器語言,這樣計算機才能執行高級語言編寫的程序,在接下來的博文中,我們將介紹非托管和托管語音的編譯過程。

      1.1.2正文

      非托管環境的編譯過程(C/C++)

      純C/C++的程序通常運行在一個非托管環境中,類是由頭文件(.h)和實現文件(.cpp)組成,每個類形成了一個單獨的編譯單元,當我們編譯程序時,幾個基本組件會把我們的源代碼翻譯成二進制代碼,接下來我們通過以下圖片說明非托管環境的編譯過程:

      GCC_CompilationProcess

      圖1 C/C++編譯過程

      首先是預處理器,如果在項目中有頭文件和宏表達式,那么它將負責包含頭文件和翻譯所有的宏觀表達式。

      接下來是編譯器,它不是直接生成二進制代碼,而是生成匯編代碼(.s),這基本上是所有現代的非結構化語言的共同基礎。

      然后,匯編程序把匯編代碼翻譯成目標代碼(.o和.obj文件,機器指令)。

      最后鏈接器,它把所有彼此相關的目標文件和生成的可執行文件或庫鏈接起來。

      總而言之,在一般情況下,我們的代碼首先翻譯成匯編代碼,接著翻譯成機器指令(二進制代碼)。

      什么是宏?

      在C/C++中,宏是預處理指令,它有多種應用技術:包括預定義、創建關鍵字和條件編譯等等。在一般情況下,這些技術在C++中使用被認為是不好的做法,主要原因是有可能濫用C++提供的語法變化功能,甚至有可能在不知情情況下創建了非標準的語言,宏不遵循一般的源代碼編譯規則,由于它通過預處理來處理,而不是編譯器。

      托管環境的編譯過程(C#/Java)

      在托管環境中,編譯的過程略有不同,我們熟知的托管語言有C#和Java,接下來,我們將以C#和Java為例介紹在托管環境中的編譯過程。

      當我們在喜愛的IDE中編寫代碼時,第一個檢測我們代碼的就是IDE(詞法分析),然后,編譯成目標文件和鏈接到動態/靜態庫或可執行文件進行再次檢查(語法分析),最后一次檢查是運行時檢查。托管環境的共同特點是:編譯器不直接編譯成機器碼,而是中間代碼,在.NET中稱為MSIL - Microsoft Intermediate Language,Java是字節碼(Bytecode)

      在那之后,在運行時JIT(Just In Time)編譯器將MSIL翻譯成機器碼,這意味著我們的代碼在真正使用的時候才被解析,這允許在CLR(公共語言運行時)預編譯和優化我們的代碼,實現程序性能的提高,但增加了程序的啟動時間,我們也可以使用Ngen(Native Image Generator)預編譯我們的程序,從而縮短程序的啟動時間,但沒有運行時優化的優點。(JeffWong的補充Java是先通過編譯器編譯成Bytecode,然后在運行時通過解釋器將Bytecode解釋成機器碼;C#是先通過編譯器將C#代碼編譯成IL,然后通過CLR將IL編譯成機器代碼。所以嚴格來說Java是一種先編譯后解釋的語言,而C#是一門純編譯語言,且需要編譯兩次。)

       Dot_Net_Application_Compilation-707676

      圖2 C#的編譯過程

      .Net Framework就是在Win32 core上添加了一個抽象層,它提供的一個好處就是支持多語言、JIT優化、自動內存管理和改進安全性;另外一個完整解決方案是WinRT,但這涉及到另外一個主題了,這里不作詳細介紹。

      MicrosoftBoxologyDiagram

      圖3 Windows API

      JIT編譯的優點和缺點

      JIT編譯帶來了許多好處,最大的一個在我看來是性能的優勢,它允許CLR(通用語言運行時扮演Assembler組件)只執行需要的代碼,例如:假設我們有一個非常大的WPF應用程序,它不是立即加載整個程序,而是CLR開始執行時,我們代碼的不同部分將通過一個高效的方法翻譯成本地指令,因為它能夠檢查系統JIT和生成優化的代碼,而不是按照一個預定義的模式。不幸的是,有一個缺點就是啟動的過程比較慢,這意味著它不適用于加載時間長的包。

      JIT的替代方案使用NGen

      如果Visual Studio由JIT創建,那么它的啟動我們將需要等待幾分鐘,相反,如果它是使用Ngen(Native Image Generator)編譯,它將創建純二進制可執行文件,如果只考慮速度的問題,那是絕對是正確的選擇。

      1.1.3總結

      在非托管環境中,我們需要知道編譯的過程分成編譯和連接兩個階段,編譯階段將源程序(*.c,*.cpp或*.h)轉換成為目標代碼(*.o或*.obj文件),至于具體過程就是上面說的C/C++編譯過程的前三個階段;鏈接階段是把前面轉成成的目標代碼(obj文件)與我們程序里面調用的庫函數對應的代碼鏈接起來形成對應的可執行文件(exe文件)。

      托管環境中,編譯過程可以分為:詞法分析、語法分析、中間代碼生成、代碼優化和目標代碼生成等等過程;無論是.NET還是Java,它們都會生成中間代碼(MSIL或Bytecode),然后把優化后的中間代碼翻譯成目標代碼,最后在程序運行時,JIT將IL翻譯成機器碼。

      無論是托管或非托管語言,它們的編譯編譯過程是把高級語言翻譯成計算機能理解的機器碼,由于編譯過程涉及的知識面很廣(編譯的原理和硬件知識),而且本人的能力有限,也只能簡單的描述一下這些過程,如果大家希望深入了解編譯的原理,我推薦大家看一下《編譯原理》。

      參考

      [1] http://www.developingthefuture.net/compilation-process-and-jit-compiler/

      更新:07/31/2013

      posted @ 2013-06-25 21:38  JK_Rush  閱讀(10312)  評論(8)    收藏  舉報
      主站蜘蛛池模板: 国产精品一二区在线观看| 无人区码一码二码三码区| 国产无人区码一区二区| 国产在线精品一区二区三区| 久久日韩在线观看视频| 成人伊人青草久久综合网| 国产av一区二区午夜福利| 欧美白妞大战非洲大炮| 日韩中文字幕v亚洲中文字幕| 无码人妻丰满熟妇区毛片18| 久久国产一区二区三区| 亚洲精品tv久久久久久久久久| 国产精品亚洲综合网一区| 中国美女a级毛片| 久久99精品久久久久久9| 高中女无套中出17p| 伊人天天久大香线蕉av色| 欧美成本人视频免费播放| 久久99热成人精品国产| 国产在线乱子伦一区二区| 国产精品无遮挡又爽又黄| 最新亚洲人成网站在线影院| 大丰市| 少妇被粗大的猛烈xx动态图| 国产女人喷潮视频免费| 少妇粗大进出白浆嘿嘿视频| 久久婷婷五月综合色丁香花| 华人在线亚洲欧美精品| 浑源县| 北岛玲中文字幕人妻系列| 国产性色的免费视频网站| 少妇又爽又刺激视频| 国产在线观看免费观看不卡| 亚洲国产日韩精品久久| 亚洲国内精品一区二区| 漂亮人妻被强中文字幕久久| AV区无码字幕中文色| 久久99久国产精品66| 超碰伊人久久大香线蕉综合| 国产av中文字幕精品| 欧美一性一乱一交一视频|