• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 297,  comments - 15,  trackbacks - 0
            編譯器,是將便于我們編寫(xiě),閱讀,維護(hù)的高級(jí)計(jì)算機(jī)語(yǔ)言翻譯為計(jì)算機(jī)能識(shí)別,運(yùn)行的低級(jí)機(jī)器語(yǔ)言的程序。編譯器將源程序(Source program)作為輸入,翻譯產(chǎn)生使用目標(biāo)語(yǔ)言(Target language)的等價(jià)程序。源程序一般為高級(jí)語(yǔ)言(High-level language),如Pascal,C++等,而目標(biāo)語(yǔ)言則是匯編語(yǔ)言或目標(biāo)機(jī)器的目標(biāo)代碼(Object code),有時(shí)也稱(chēng)作機(jī)器代碼(Machine code)。

            一個(gè)現(xiàn)代編譯器的主要工作流程如下:
            源程序(source code)→預(yù)處理器(preprocessor)→編譯器(compiler)→匯編程序(assembler)→目標(biāo)程序(object code)→連接器(鏈接器,Linker)→可執(zhí)行程序(executables
             
            工作原理
             
            翻 譯是從源代碼(通常為高級(jí)語(yǔ)言)到能直接被計(jì)算機(jī)或虛擬機(jī)執(zhí)行的目標(biāo)代碼(通常為低級(jí)語(yǔ)言或機(jī)器言)。然而,也存在從低級(jí)語(yǔ)言到高級(jí)語(yǔ)言的編譯器,這類(lèi)編 譯器中用來(lái)從由高級(jí)語(yǔ)言生成的低級(jí)語(yǔ)言代碼重新生成高級(jí)語(yǔ)言代碼的又被叫做反編譯器。也有從一種高級(jí)語(yǔ)言生成另一種高級(jí)語(yǔ)言的編譯器,或者生成一種需要進(jìn) 一步處理的的中間代碼的編譯器(又叫級(jí)聯(lián))。

             
            典型的編譯器輸出是由包含入口點(diǎn)的名字和地址以及外部調(diào)用的機(jī)器代碼所組成的目標(biāo)文件。一組目標(biāo)文件,不必是同一編譯器產(chǎn)生,但使用的編譯器必需采用同樣的輸出格式,可以鏈接在一起并生成可以由用戶(hù)直接執(zhí)行的可執(zhí)行程序。

            編譯器種類(lèi)
             
            編 譯器可以生成用來(lái)在與編譯器本身所在的計(jì)算機(jī)和操作系統(tǒng)(平臺(tái))相同的環(huán)境下運(yùn)行的目標(biāo)代碼,這種編譯器又叫做“本地”編譯器。另外,編譯器也可以生成用 來(lái)在其它平臺(tái)上運(yùn)行的目標(biāo)代碼,這種編譯器又叫做交叉編譯器。交叉編譯器在生成新的硬件平臺(tái)時(shí)非常有用。“源碼到源碼編譯器”是指用一種高級(jí)語(yǔ)言作為輸 入,輸出也是高級(jí)語(yǔ)言的編譯器。例如: 自動(dòng)并行化編譯器經(jīng)常采用一種高級(jí)語(yǔ)言作為輸入,轉(zhuǎn)換其中的代碼,并用并行代碼注釋對(duì)它進(jìn)行注釋?zhuān)ㄈ?/span>OpenMP)或者用語(yǔ)言構(gòu)造進(jìn)行注釋?zhuān)ㄈ?/span>FORTRANDOALL指令)。

            預(yù)處理器(preprocessor
             
            作用是通過(guò)代入預(yù)定義等程序段將源程序補(bǔ)充完整。

            編譯器前端(frontend
             
            前端主要負(fù)責(zé)解析(parse)輸入的源程序,由詞法分析器和語(yǔ)法分析器協(xié)同工作。詞法分析器負(fù)責(zé)把源程序中的‘單詞’(Token)找出來(lái),語(yǔ)法分析器把這些分散的單詞按預(yù)先定義好的語(yǔ)法組裝成有意義的表達(dá)式,語(yǔ)句,函數(shù)等等。例如“a = b + c;”前端詞法分析器看到的是“a, =, b , +, c;”,語(yǔ)法分析器按定義的語(yǔ)法,先把他們組裝成表達(dá)式“b + c”,再組裝成“a = b + c”的語(yǔ)句。前端還負(fù)責(zé)語(yǔ)義(semantic checking)的檢查,例如檢測(cè)參與運(yùn)算的變量是否是同一類(lèi)型的,簡(jiǎn)單的錯(cuò)誤處理。最終的結(jié)果常常是一個(gè)抽象的語(yǔ)法樹(shù)(abstract syntax tree,或 AST),這樣后端可以在此基礎(chǔ)上進(jìn)一步優(yōu)化,處理。

            編譯器后端(backend
             
            編譯器后端主要負(fù)責(zé)分析,優(yōu)化中間代碼(Intermediate representation)以及生成機(jī)器代碼(Code Generation)。

             
            一般說(shuō)來(lái)所有的編譯器分析,優(yōu)化,變型都可以分成兩大類(lèi):函數(shù)內(nèi)(intraprocedural)還是函數(shù)之間(interprocedural)進(jìn)行。很明顯,函數(shù)間的分析,優(yōu)化更準(zhǔn)確,但需要更長(zhǎng)的時(shí)間來(lái)完成。

             
            編譯器分析(compiler analysis)的對(duì)象是前端生成并傳遞過(guò)來(lái)的中間代碼,現(xiàn)代的優(yōu)化型編譯器(optimizing compiler)常常用好幾種層次的中間代碼來(lái)表示程序,高層的中間代碼(high level IR)接近輸入的源程序的格式,與輸入語(yǔ)言相關(guān)(language dependent),包含更多的全局性的信息,和源程序的結(jié)構(gòu);中層的中間代碼(middle level IR)與輸入語(yǔ)言無(wú)關(guān),低層的中間代碼(Low level IR)與機(jī)器語(yǔ)言類(lèi)似。不同的分析,優(yōu)化發(fā)生在最適合的那一層中間代碼上。

             
            常見(jiàn)的編譯分析有函數(shù)調(diào)用樹(shù)(call tree),控制流程圖(Control flow graph),以及在此基礎(chǔ)上的變量定義-使用,使用-定義鏈(define-use/use-define or u-d/d-u chain),變量別名分析(alias analysis),指針?lè)治觯?/span>pointer analysis),數(shù)據(jù)依賴(lài)分析(data dependence analysis)等等。

             
            上述的程序分析結(jié)果是編譯器優(yōu)化(compiler optimization)和程序變形(compiler transformation)的前提條件。常見(jiàn)的優(yōu)化和變新有:函數(shù)內(nèi)嵌(inlining),無(wú)用代碼刪除(Dead code elimination),標(biāo)準(zhǔn)化循環(huán)結(jié)構(gòu)(loop normalization),循環(huán)體展開(kāi)(loop unrolling),循環(huán)體合并,分裂(loop fusion,loop fission),數(shù)組填充(array padding),等等。優(yōu)化和變形的目的是減少代碼的長(zhǎng)度,提高內(nèi)存(memory),緩存(cache)的使用率,減少讀寫(xiě)磁盤(pán),訪問(wèn)網(wǎng)絡(luò)數(shù)據(jù)的頻率。更高級(jí)的優(yōu)化甚至可以把序列化的代碼(serial code)變成并行運(yùn)算,多線程的代碼(parallelized,multi-threaded code)。

             
            機(jī)器代碼的生成是優(yōu)化變型后的中間代碼轉(zhuǎn)換成機(jī)器指令的過(guò)程?,F(xiàn)代編譯器主要采用生成匯編代碼(assembly code)的策略,而不直接生成二進(jìn)制的目標(biāo)代碼(binary object code)。即使在代碼生成階段,高級(jí)編譯器仍然要做很多分析,優(yōu)化,變形的工作。例如如何分配寄存器(register allocatioin),如何選擇合適的機(jī)器指令(instruction selection),如何合并幾句代碼成一句等等。


            編譯語(yǔ)言與解釋語(yǔ)言對(duì)比
             
            許多人將高級(jí)程序語(yǔ)言分為兩類(lèi): 編譯型語(yǔ)言解釋型語(yǔ)言。然而,實(shí)際上,這些語(yǔ)言中的大多數(shù)既可用編譯型實(shí)現(xiàn)也可用解釋型實(shí)現(xiàn),分類(lèi)實(shí)際上反映的是那種語(yǔ)言常見(jiàn)的實(shí)現(xiàn)方式。(但是,某些解釋型語(yǔ)言,很難用編譯型實(shí)現(xiàn)。比如那些允許在線代碼更改的解釋型語(yǔ)言。)
            posted on 2008-07-21 08:57 chatler 閱讀(210) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): Compiling Theorem

            只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            <2025年8月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            常用鏈接

            留言簿(10)

            隨筆分類(lèi)(307)

            隨筆檔案(297)

            algorithm

            Books_Free_Online

            C++

            database

            Linux

            Linux shell

            linux socket

            misce

            • cloudward
            • 感覺(jué)這個(gè)博客還是不錯(cuò),雖然做的東西和我不大相關(guān),覺(jué)得看看還是有好處的

            network

            OSS

            • Google Android
            • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
            • os161 file list

            overall

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久婷婷人人澡人人爽人人爱| av色综合久久天堂av色综合在| 亚洲狠狠久久综合一区77777| 国产精品久久永久免费| 国产高清美女一级a毛片久久w| 久久精品国产亚洲Aⅴ香蕉| 亚洲精品无码久久毛片| 无码人妻久久一区二区三区 | 7国产欧美日韩综合天堂中文久久久久| 亚洲综合精品香蕉久久网97| 久久伊人五月天论坛| 久久久久久人妻无码| 日韩亚洲国产综合久久久| 熟妇人妻久久中文字幕| 欧洲国产伦久久久久久久| 69SEX久久精品国产麻豆| 日韩人妻无码一区二区三区久久99| 久久精品aⅴ无码中文字字幕重口 久久精品a亚洲国产v高清不卡 | 久久996热精品xxxx| 亚洲AV无码久久寂寞少妇| 久久久久久国产精品免费免费| 久久香综合精品久久伊人| 久久久噜噜噜久久中文字幕色伊伊 | 99久久国产精品免费一区二区| 香蕉久久一区二区不卡无毒影院| 中文字幕无码av激情不卡久久| 激情五月综合综合久久69| 国产精品一久久香蕉国产线看观看 | 久久精品成人国产午夜| 亚洲熟妇无码另类久久久| 综合久久精品色| 色悠久久久久久久综合网| 国产视频久久| 国产精品综合久久第一页| 久久久久久免费一区二区三区| 国内精品久久久久影院一蜜桃| .精品久久久麻豆国产精品| 久久精品亚洲一区二区三区浴池| 亚洲狠狠婷婷综合久久蜜芽| 亚洲AV无码1区2区久久| 久久婷婷五月综合97色一本一本 |