導航:首頁 > 源碼編譯 > 編譯技術何時出現

編譯技術何時出現

發布時間:2023-03-19 06:14:02

㈠ 把匯編源程序變成代碼程序的過程是()

把匯編源程序變成代碼程序的過程是編譯

編譯語言不像直譯語言一樣,由解釋器將代碼一句一句運行,而是以編譯器,先將代碼編譯為機器碼,再加以運行。理論上,任何編程語言都可以是編譯式,或直譯式的。它們之間的區別,僅與程序的應用有關。

編譯程序的語法分析器以單詞符號作為輸入,分析單詞符號串是否形成符合語法規則的語法單位,如表達式、賦值、循環等,最後看是否構成一個符合要求的程序,按該語言使用的語法規則分析檢查每條語句是否有正確的邏輯結構,程序是最終的一個語法單位。



(1)編譯技術何時出現擴展閱讀:

編譯技術的發展

在早期馮諾依曼計算機時期 (20世紀40年代) 程序都是以機器語言編寫,機器語言就是實際存儲的01代碼,編寫程序是十分枯燥乏味的。

後來匯編語言代替機器語言一符號形式該處操作指令和地址編碼。但匯編語言仍有許多缺點, 閱讀理解起來很難,而且必須依賴於特定的機器,如果想使編寫好的程序在另一台計算機上運行必須重寫。

在20世紀50年代IBM的John Backus帶領一個研究小組對FORTRAN高級語言及其編譯器進行開發。編譯程序的自動生成工具初現端倪,現在很多自動生成工具已經廣泛棚亂使用例如語法分析工具LEX,語言分析程序YACC等。

在20世紀尺戚60年代人們不斷的用自編譯技術構造編譯程序,即用被編譯的語言本身鏈困檔來實現該語言的編譯程序,但其基本原理和結構大體相同。



㈡ 編譯原理

C語言編譯過程詳解
C語言的編譯鏈接過程是要把我們編寫的一個C程序(源代碼)轉換成可以在硬體上運行的程序(可執行代碼),需要進行編譯和鏈接。編譯就是把文本形式源代碼翻譯為機器語言形式的目標文件的過程。鏈接是把目標文件、操作系統的啟動代碼和用到的庫文件進行組織形成最終生成可執行代碼的過程。過程圖解如下:

從圖上可以看到,整個代碼的編譯過程分為編譯和鏈接兩個過程,編譯對應圖中的大括弧括起的部分,其餘則為鏈接過程。
一、編譯過程
編譯過程又可以分成兩個階段:編譯和匯編。
1、編譯
編譯是讀取源程序(字元流),對之進行詞法和語法的分析,將高級語言指令轉換為功能等效的匯編代碼,源文件的編譯過程包含兩個主要階段:
第一個階段是預處理階段,在正式的編譯階段之前進行。預處理階段將根據已放置在文件中的預處理指令來修改源文件的內容。如#include指令就是一個預處理指令,它把頭文件的內容添加到.cpp文件中。這個在編譯之前修改源文件的方式提供了很大的靈活性,以適應不同的計算機和操作系統環境的限制。一個環境需要的代碼跟另一個環境所需的代碼可能有所不同,因為可用的硬體或操作系統是不同的。在許多情況下,可以把用於不同環境的代碼放在同一個文件中,再在預處理階段修改代碼,使之適應當前的環境。
主要是以下幾方面的處理:
(1)宏定義指令,如 #define a b。
對於這種偽指令,預編譯所要做的是將程序中的所有a用b替換,但作為字元串常量的 a則不被替換。還有 #undef,則將取消對某個宏的定義,使以後該串的出現不再被替換。
(2)條件編譯指令,如#ifdef,#ifndef,#else,#elif,#endif等。
這些偽指令的引入使得程序員可以通過定義不同的宏來決定編譯程序對哪些代碼進行處理。預編譯程序將根據有關的文件,將那些不必要的代碼過濾掉
(3) 頭文件包含指令,如#include "FileName"或者#include <FileName>等。
在頭文件中一般用偽指令#define定義了大量的宏(最常見的是字元常量),同時包含有各種外部符號的聲明。採用頭文件的目的主要是為了使某些定義可以供多個不同的C源程序使用。因為在需要用到這些定義的C源程序中,只需加上一條#include語句即可,而不必再在此文件中將這些定義重復一遍。預編譯程序將把頭文件中的定義統統都加入到它所產生的輸出文件中,以供編譯程序對之進行處理。包含到C源程序中的頭文件可以是系統提供的,這些頭文件一般被放在/usr/include目錄下。在程序中#include它們要使用尖括弧(<>)。另外開發人員也可以定義自己的頭文件,這些文件一般與C源程序放在同一目錄下,此時在#include中要用雙引號("")。
(4)特殊符號,預編譯程序可以識別一些特殊的符號。
例如在源程序中出現的LINE標識將被解釋為當前行號(十進制數),FILE則被解釋為當前被編譯的C源程序的名稱。預編譯程序對於在源程序中出現的這些串將用合適的值進行替換。
預編譯程序所完成的基本上是對源程序的「替代」工作。經過此種替代,生成一個沒有宏定義、沒有條件編譯指令、沒有特殊符號的輸出文件。這個文件的含義同沒有經過預處理的源文件是相同的,但內容有所不同。下一步,此輸出文件將作為編譯程序的輸出而被翻譯成為機器指令。
第二個階段編譯、優化階段。經過預編譯得到的輸出文件中,只有常量;如數字、字元串、變數的定義,以及C語言的關鍵字,如main,if,else,for,while,{,}, +,-,*,\等等。
編譯程序所要作得工作就是通過詞法分析和語法分析,在確認所有的指令都符合語法規則之後,將其翻譯成等價的中間代碼表示或匯編代碼。
優化處理是編譯系統中一項比較艱深的技術。它涉及到的問題不僅同編譯技術本身有關,而且同機器的硬體環境也有很大的關系。優化一部分是對中間代碼的優化。這種優化不依賴於具體的計算機。另一種優化則主要針對目標代碼的生成而進行的。
對於前一種優化,主要的工作是刪除公共表達式、循環優化(代碼外提、強度削弱、變換循環控制條件、已知量的合並等)、復寫傳播,以及無用賦值的刪除,等等。
後一種類型的優化同機器的硬體結構密切相關,最主要的是考慮是如何充分利用機器的各個硬體寄存器存放的有關變數的值,以減少對於內存的訪問次數。另外,如何根據機器硬體執行指令的特點(如流水線、RISC、CISC、VLIW等)而對指令進行一些調整使目標代碼比較短,執行的效率比較高,也是一個重要的研究課題。
2、匯編
匯編實際上指把匯編語言代碼翻譯成目標機器指令的過程。對於被翻譯系統處理的每一個C語言源程序,都將最終經過這一處理而得到相應的目標文件。目標文件中所存放的也就是與源程序等效的目標的機器語言代碼。目標文件由段組成。通常一個目標文件中至少有兩個段:
代碼段:該段中所包含的主要是程序的指令。該段一般是可讀和可執行的,但一般卻不可寫。
數據段:主要存放程序中要用到的各種全局變數或靜態的數據。一般數據段都是可讀,可寫,可執行的。
UNIX環境下主要有三種類型的目標文件:
(1)可重定位文件
其中包含有適合於其它目標文件鏈接來創建一個可執行的或者共享的目標文件的代碼和數據。
(2)共享的目標文件
這種文件存放了適合於在兩種上下文里鏈接的代碼和數據。
第一種是鏈接程序可把它與其它可重定位文件及共享的目標文件一起處理來創建另一個 目標文件;
第二種是動態鏈接程序將它與另一個可執行文件及其它的共享目標文件結合到一起,創建一個進程映象。
(3)可執行文件
它包含了一個可以被操作系統創建一個進程來執行之的文件。匯編程序生成的實際上是第一種類型的目標文件。對於後兩種還需要其他的一些處理方能得到,這個就是鏈接程序的工作了。
二、鏈接過程
由匯編程序生成的目標文件並不能立即就被執行,其中可能還有許多沒有解決的問題。
例如,某個源文件中的函數可能引用了另一個源文件中定義的某個符號(如變數或者函數調用等);在程序中可能調用了某個庫文件中的函數,等等。所有的這些問題,都需要經鏈接程序的處理方能得以解決。
鏈接程序的主要工作就是將有關的目標文件彼此相連接,也即將在一個文件中引用的符號同該符號在另外一個文件中的定義連接起來,使得所有的這些目標文件成為一個能夠被操作系統裝入執行的統一整體。
根據開發人員指定的同庫函數的鏈接方式的不同,鏈接處理可分為兩種:
(1)靜態鏈接
在這種鏈接方式下,函數的代碼將從其所在地靜態鏈接庫中被拷貝到最終的可執行程序中。這樣該程序在被執行時這些代碼將被裝入到該進程的虛擬地址空間中。靜態鏈接庫實際上是一個目標文件的集合,其中的每個文件含有庫中的一個或者一組相關函數的代碼。
(2) 動態鏈接
在此種方式下,函數的代碼被放到稱作是動態鏈接庫或共享對象的某個目標文件中。鏈接程序此時所作的只是在最終的可執行程序中記錄下共享對象的名字以及其它少量的登記信息。在此可執行文件被執行時,動態鏈接庫的全部內容將被映射到運行時相應進程的虛地址空間。動態鏈接程序將根據可執行程序中記錄的信息找到相應的函數代碼。
對於可執行文件中的函數調用,可分別採用動態鏈接或靜態鏈接的方法。使用動態鏈接能夠使最終的可執行文件比較短小,並且當共享對象被多個進程使用時能節約一些內存,因為在內存中只需要保存一份此共享對象的代碼。但並不是使用動態鏈接就一定比使用靜態鏈接要優越。在某些情況下動態鏈接可能帶來一些性能上損害。
我們在linux使用的gcc編譯器便是把以上的幾個過程進行捆綁,使用戶只使用一次命令就把編譯工作完成,這的確方便了編譯工作,但對於初學者了解編譯過程就很不利了,下圖便是gcc代理的編譯過程:

從上圖可以看到:
預編譯
將.c 文件轉化成 .i文件
使用的gcc命令是:gcc –E
對應於預處理命令cpp
編譯
將.c/.h文件轉換成.s文件
使用的gcc命令是:gcc –S
對應於編譯命令 cc –S
匯編
將.s 文件轉化成 .o文件
使用的gcc 命令是:gcc –c
對應於匯編命令是 as
鏈接
將.o文件轉化成可執行程序
使用的gcc 命令是: gcc
對應於鏈接命令是 ld
總結起來編譯過程就上面的四個過程:預編譯、編譯、匯編、鏈接。了解這四個過程中所做的工作,對我們理解頭文件、庫等的工作過程是有幫助的,而且清楚的了解編譯鏈接過程還對我們在編程時定位錯誤,以及編程時盡量調動編譯器的檢測錯誤會有很大的幫助的。
是否可以解決您的問題?

㈢ 急需一篇有關「軟體技術」的發展歷史、現狀、存在問題等的論文!!!!!

一、「軟體技術」發展歷史
第一是軟體技術發展早期(20世紀50和60年代);第二是結構化程序和對象技術發展時期(70和80年代);第三是從90年代到現在,軟體工程技術發展新時期。
1、軟體技術發展早期
在計算機發展早期,應用領域較窄,主要是科學與工程計算,處理對象是數值數據。1956年在J.Backus領導下為IBM機器研製出第一個實用高級語言Fortran及其翻譯程序。此後,相繼又有多種高級語言問世,從而使設計和編製程序的功效大為提高。這個時期計算機軟體的巨大成就之一,就是在當時的水平上成功地解決了兩個問題:一方面從Fortran及Algol60開始設計出了具有高級數據結構和控制結構的高級程序語言,另一方面又發明了將高級語言程序翻譯成機器語言程序的自動轉換技術,即編譯技術。然而,隨著計算機應用領域的逐步擴大,除了科學計算繼續發展以外,出現了大量的數據處理和衡態如非數值計算問題。為了充分利用系統資源,出現了操作系統;為了適應大量數據處理問題的需要,開始出現資料庫及其管理系統。軟體規模與復雜性迅速增大。當程序復雜性增加到一定程度以後,軟體研製周期難以控制,正確性難以保證,可靠性問題相當突出。為此,人們提出用結構化程序設計和軟體工程方法來克服這一危機。軟體技術發展進入一個新的階段。

2、結構化程序和對象技術發展時期
從70年代初開始,大型軟體系統的出現給軟體開發帶來了新問題。大型軟體系統的研製需要花費大量的資金和人力,可是研製出來的產品卻是可靠性差、錯誤多、維護和修改也很困難。一個大型操作系統有時需要幾千人年的工作量,而所獲得的系統又常常會隱藏著幾百甚至幾千個錯誤。程序可靠性很難保證,程序設計工具的嚴重缺乏也使軟體開發陷入困境。
結構程序設計的討論導致產生了由Pascal到Ada這一系列的結構化語言。這些語言具有較為清晰的控制結構,與原來常見的高級程序語言相比有一定的改進,但在數據類型抽象方面仍顯不足。面向對象技術的興起是這一時期軟體技術發展的主要標志。「面向對象」這一名詞在80年代初由Smalltalk語言的設計者開始提出,而後逐漸流行起來。
面向對象的程序結構將數據及其上作用的操作一起封裝,組成抽象數據或者叫做對象。具有相同結構屬性和操作的一組對象構成對象類。對象系統就是由一組相關的對象類組成,能夠以更加自然的方式模擬外部世界現實系統的結構和行為。對象的兩大基本特徵是信息封裝和繼承。通過信息封裝,在對閉渣象數據的外圍好像構築了咐啟一堵「圍牆」,外部只能通過圍牆的「窗口」去觀察和操作圍牆內的數據,這就保證了在復雜的環境條件下對象數據操作的安全性和一致性。通過對象繼承可實現對象類代碼的可重用性和可擴充性。可重用性使能處理父、子類之間具有相似結構的對象共同部分,避免代碼一遍又一遍的重復。可擴充性使能處理對象類在不同情況下的多樣性,在原有代碼的基礎上進行擴充和具體化,以求適應不同的需要。
傳統的面向過程的軟體系統以過程為中心。過程是一種系統功能的實現,而面向對象的軟體系統是以數據為中心。與系統功能相比,數據結構是軟體系統中相對穩定的部分。對象類及其屬性和服務的定義在時間上保持相對穩定,還能提供一定的擴充能力,這是十分重要的事情,這樣就可大為節省軟體生命周期內系統開發和維護的開銷。就像建築物的地基對於建築物的壽命十分重要一樣,信息系統以數據對象為基礎構築,其系統穩定性就會十分牢固。到20世紀80年代中期以後,軟體的蓬勃發展更來源於當時兩大技術進步的推動力:一是微機工作站的普及應用,另一是高速網路的出現。其導致的直接結果是:一個大規模的應用軟體,可以由分布在網路上不同站點機的軟體協同工作去完成。由於軟體本身的特殊性和多樣性,在大規模軟體開發時,人們幾乎總是面臨困難處境。軟體工程面臨許多新問題和新挑戰,而進入一個新的發展時期。
3、軟體工程技術發展新時期
自從軟體工程名詞誕生,歷經三十餘年的研究和開發,人們深刻認識到,軟體開發必須按照工程化的原理和方法來組織和實施。軟體工程技術在軟體開發方法和軟體開發工具方面,在軟體工程發展的早期,特別是20世紀70、80年代軟體蓬勃發展時期,已經取得了非常重要的進步。軟體工程作為一個學科方向,愈來愈受到人們的重視。但是,隨著大規模網路應用軟體的出現所帶來的新問題,使得軟體工程中,在如何協調合理預算、控制開發進度和保證軟體質量等方面,軟體人員面臨更加困難的境地。

進入20世紀90年代,Internet和WWW技術的蓬勃發展使軟體工程進入一個新的技術發展時期。以軟體組件復用為代表,基於組件的軟體工程技術正在使軟體開發方式發生巨大改變。早年軟體危機中提出的嚴重問題,有望從此開始找到切實可行的解決途徑。在這個時期軟體工程技術發展代表性標志在三個方面,即:
①基於組件的軟體工程和開發方法成為主流。組件是自包含的,具有相對獨立的功能特性和具體實現,並為應用提供預定義好的服務介面。組件化軟體工程是通過使用可復用組件來開發、運行和維護軟體系統的方法、技術和過程。

②軟體過程管理進入軟體工程的核心進程和操作規范。軟體工程管理應以軟體過程管理為中心去實施,貫穿於軟體開發過程的始終。在軟體過程管理得到保證的前提下,軟體開發進度和產品質量也就隨之得到保證。
③網路應用軟體規模愈來愈大,復雜性愈來愈高,使得軟體體系結構從兩層向三層或者多層結構轉移,使應用的基礎架構和業務邏輯相分離。應用的基礎架構由提供各種中間件系統服務組合而成的軟體平台來支持,軟體平台化成為軟體工程技術發展的新趨勢。軟體平台為各種應用軟體提供一體化的開放平台,既可保證應用軟體所要求基礎系統架構的可靠性、可伸縮性和安全性的要求;又可使應用軟體開發人員和用戶只要集中關注應用軟體的具體業務邏輯實現,而不必關注其底層的技術細節。當應用需求發生變化時,只要變更軟體平台之上的業務邏輯和相應的組件實施就行了。
以上這些標志象徵軟體工程技術已經發展上升到一個新階段。這個階段尚遠未結束。軟體技術發展日新月異,Internet的進步促使計算機技術和通信技術相結合,更使軟體技術發展呈五彩繽紛局面。軟體工程技術的發展也永無止境。
二、「軟體技術」發展中的問題
(一) 人才結構失衡。隨著總量供不應求這一矛盾的緩和,我國軟體人才結構不盡合理的問題進一步凸現,成為我國軟體人才體系的突出特點,主要體現在如下方面:
1、高端軟體人才缺乏。從經濟規律來看,一種工業化時代的產業結構,要求是一個金字塔型的人才梯隊,軟體業需要的不僅僅需要從事基礎開發的程序設計員作為智力基礎,更需要塔尖的高級人才。目前高級軟體人才仍是中國軟體企業最緊缺的軟體人才類型,在這種背景下,中國軟體人才的「金字塔」形的合理結構並未實現。我國軟體技術人員約有19萬人左右,此外,還有30萬人在從事計算機應用、科研與教育工作。但是,我國軟體技術人員中70%是從事程序開發、技術支持和服務的人員,軟體產業發展所急需的系統分析師、架構設計師、高級工程師、項目經理和技術工人的數量非常匱乏,無法滿足軟體產業發展對高層次人才的需求。
2、復合型軟體人才缺乏。高素質的復合型軟體人才正逐漸成為軟體人才中的新寵。復合型軟體人才有兩種類型:一種是既精通軟體又精通硬體的基礎理論和設計技能的人才;另一種是既精通軟體基礎理論和設計技能,同時又精通其他專業業務和應用知識的復合型人才,這類人才是軟體領域與其他應用領域交叉的復合型人才。目前我國軟體產業正處於產業化的進程中,產業化的一個要求就是資本的介入,在一個產業鏈中,資本是不可缺少的一個環節,這就需要我國培養出大批軟體類資本運作人才,為軟體企業的發展贏得資金。而產業鏈的下游是產品的銷售環節,又需要大批渠道及銷售、公關、宣傳人才以及軟體售後技術支持人才。另外,由於我國的軟體產業主要是發展採取外包模式,這就要求既懂得軟體知識,又能嫻熟地運用外語的復合型人才。
(二)自主知識產權的主流軟體產品較少,產品多為低端產品。我國的軟體產品,主要集中在產業鏈的低端、輔助型和外掛式的產品階段;在核心技術上有創新、自主設計的「重量級」軟體產品還比較缺乏;許多基礎性、關鍵性軟體還處於空白狀態。中國的軟體產業從上世紀八十年代開始發展,到今天雖然取得了長足的進步,但是國內很少有企業能夠達到承攬國際項目所需的嚴格的內部流程及質量控制。雖然有眾多優秀的軟體工程師,但多數外包企業尚未建立起正確的流程,也未能培養出准確掌握這些流程的開發人員。在中國軟體市場,國外品牌的產品仍然占據高端系統軟體、資料庫軟體的絕大部分市場份額,占據中間件、行業應用軟體、ERP軟體的大部分市場份額;國內品牌產品則在ERP和財務管理軟體、防殺毒軟體、中文信息處理軟體及部分行業應用領域占據優勢。
(三)核心技術缺乏,創新能力不足。我國大部分軟體生產企業在較低層面上進行著大量重復性的工作,是一種小作坊式的生產,這種生產方式為了眼前的生存,根本無力開展軟體技術創新,再加上盜版泛濫成災,企業缺乏技術創新的動力,很多企業幾乎沒有研發投入。軟體產業中發展較快的產品領域主要是游戲、財務及商務管理、教育領域,而技術含量較高的大型資料庫系統、管理信息系統的開發及發展較為緩慢。軟體企業創新能力不足,軟體產品的生命周期很短、產品更新升級頻繁、換代速度很快,軟體產品高利潤、高回報的主要源泉,應該來自於持續不斷的創新。而目前中國軟體企業的創新能力不足,特別是對軟體產業鏈上游產品的原始創新力不足。
三、「軟體技術」發展中問題的解決辦法及措施
1、改進教育模式培養人才,面向市場吸引人才。調查發現,教育體制的落後導致了軟體專業畢業生缺乏實際編程能力,無法適應企業的實際需要。而軟體企業自身又不願提供相應的培訓,這樣一來編程人員的數量幾乎是處在一種「凈減」狀態。所以,我們要從教育抓起,多為學生提供實踐機會,不斷加強學生的實際編程能力。同時,也應該提供專業的培訓,不斷提高員工的理論水平和實際操作水平,有助於滿足企業各層次的人才需求。由於我國的軟體外包發展模式,在人才培訓方面,要積極擴大國內軟體高級人才與國際軟體市場的聯系和交流,擴大面向出口的專業化二次培訓規模,重在加強項目經理和程序員的外語能力和過程管理能力,為軟體出口提供更廣泛的人才基礎。要將引進面向國際市場的人才作為我國引進人才的重點領域,使我國成為軟體國際化人才的高地。在吸引海外留學人員回國發展的工作中,重點吸引一批優秀的項目經理、系統分析師和軟體工程師。
2、不斷研發擁有自主知識產權的關鍵技術與核心技術。軟體產業必須強調自主知識技術,強調知識產權,這是因為它在很大程度上決定著一個國家信息安全和綜合國力。要發展具有自主知識產權的軟體產品,應該在軟體研究與開發上加大投入,注重跟蹤和模仿,獨立從事軟體自主核心技術的研發,逐步在操作系統、資料庫管理系統和關鍵應用軟體方面形成完整、系統的自主版權軟體產品。同時加快核心軟體技術和產品制度創新及產業化。集中支持核心技術軟體,基礎軟體工具和嵌入式軟體的開發和自主的軟體創新信息產業化。
3、推行軟體園建設。作為加快發展軟體技術、有效推進軟體產業發展而興起的軟體園,在研發與引進軟體新技術、創新開發軟體新產品、加速軟體成果轉化等方面,具有典型的示範與帶動作用。軟體園區集中提供了理想的軟體研發場地、良好的成果孵化環境、相當規模的軟體流通市場、完善的人才培訓場所、便利的交通與生活設施、良好的休閑娛樂場所,能充分發揮軟體園區的群體優勢和規模效應。
總之,軟體是信息產業的靈魂。我們應該加強人才培養,提高自主研發能力,不斷掌握核心技術,繼續做大軟體產業規模,使我國立足於世界信息強國之列。

㈣ 編譯技術的介紹

編譯技術,就是把高級計算機語言編寫的程序代碼翻譯成為計算機可以運行的二進制機器語言代碼的技術。

㈤ 編譯程序出現在計算機時期的什麼時候

編譯程序出現的計算機時期是:第二代
編譯程序(Compiler,compiling program)也稱為編譯器,是指把用高級程序設計語言書寫的源程序,翻譯成等價的機器語言格式目標程序的翻譯程序。編譯程序屬於採用生成性實現途徑實現的翻譯程序。它以高級程序設計語言書寫的源程序作為輸入,而以匯編語言或機器語言表示的目標程序作為輸出。編譯出的目標程序通常還要經歷運行階段,以便在運行程序的支持下運行,加工初始數據,算出所需的計算結果。
20世紀80年代以後,程序設計語言在形式化、結構化、直觀化和智能化等方面有了長足的進步和發展,主要表現在兩個方面:①隨著程序設計理論和方法的發展,相繼推出了一系列新型程序設計語言,如結構化程序設計語言、並發程序設計語言、分布式程序設計語言、函數式程序設計語言、智能化程序設計語言、面向對象程序設計語言等;②基於語法、語義和語用方面的研究成果,從不同的角度和層次上深刻地揭示了程序設計語言的內在規律和外在表現形式。與此相應地,作為實現程序設計語言重要手段之一的編譯程序,在體系結構、設計思想、實現技術和處理內容等方面均有不同程度的發展、變化和擴充。另外,編譯程序已作為實現編程的重要軟體工具,被納入到軟體支援環境的基本層軟體工具之中。因此,規劃編譯程序實現方案時,應從所處的具體軟體支援環境出發,既要遵循整個環境的全局性要求和規定,又要精心考慮與其他諸層軟體 工具之間的相互支援、配合和銜接關系。

㈥ 編譯器的工作分為哪幾個階段

編譯器就是一個普通程序,沒什麼大不了的
什麼是編譯器?

編譯器是一個將高級語言翻譯為低級語言的程序。

首先我們一定要意識到編譯器就是一個普通程序,沒什麼大不了的。

在沒有弄明白編譯器如何工作之前你可以簡單的把編譯器當做一個黑盒子,其作用就是輸入一個文本文件輸出一個二進制文件。

基本上編譯器經過了以下幾個階段,等等,這句話教科書上也有,但是我相信很多同學其實並沒有真正理解這幾個步驟到底在說些什麼,為了讓你徹底理解這幾個步驟,我們用一個簡單的例子來講解。

假定我們有一段程序:

while (y < z) {
int x = a + b;
y += x;
}
那麼編譯器是怎樣把這一段程序人類認識的程序轉換為CPU認識的二進制機器指令呢?

提取出每一個單詞:詞法分析
首先編譯器要把源代碼中的每個「單詞」提取出來,在編譯技術中「單詞」被稱為token。其實不只是每個單詞被稱為一個token,除去單詞之外的比如左括弧、右括弧、賦值操作符等都被稱為token。

從源代碼中提取出token的過程就被稱為詞法分析,Lexical Analysis。

經過一遍詞法分析,編譯器得到了以下token:

T_While while
T_LeftParen (
T_Identifier y
T_Less <
T_Identifier z
T_RightParen )
T_OpenBrace {
T_Int int
T_Identifier x
T_Assign =
T_Identifier a
T_Plus +
T_Identifier b
T_Semicolon ;
T_Identifier y
T_PlusAssign +=
T_Identifier x
T_Semicolon ;
T_CloseBrace }
就這樣一個磁碟中保存的字元串源代碼文件就轉換為了一個個的token。

這些token想表達什麼意思:語法分析
有了這些token之後編譯器就可以根據語言定義的語法恢復其原本的結構,怎麼恢復呢?

原來,編譯器在掃描出各個token後根據規則將其用樹的形式表示出來,這顆樹就被稱為語法樹。

語法樹是不是合理的:語義分析
有了語法樹後我們還要檢查這棵樹是不是合法的,比如我們不能把一個整數和一個字元串相加、比較符左右兩邊的數據類型要相同,等等。

這一步通過後就證明了程序合法,不會有編譯錯誤。

㈦ 編譯技術的發展歷程

1954年至1957年間,IBM的John Backus帶領一個小組開發FORTRAN語言及其編譯器,使得上面的擔憂不必要了。
但由於當時處理中所涉及到的大多數程序設計語言的翻譯並不為人所掌握,所以這個項目的成功也伴隨著巨大的辛勞。
幾乎與此同時,人們也在開發著第一個編譯器,Noam Chomsky開始自然語言結構的研究。使得編譯器結構異常簡單,甚至還帶有了一些自動化。
Chomsky的研究導致了根據語言文法(grammar,結構規則)的難易程度以及識別它們所需的演算法來為語言分類。文法有4個層次:0型、1型、2型和3型文法,且其中的每一個都是其前者的專門化。2型(或上下文無關文法context-free grammar)是程序設計語言中最有用的,代表著程序設計語言結構的標准方式。
人們接著又深化了生成有效的目標代碼的方法,這就是最初的編譯器,它們被一直使用至今。人們通常將其誤稱為優化技術(optimization technique),但因其從未真正地得到過被優化了的目標代碼而僅僅改進了它的有效性,因此實際上應稱作代碼改進技術(code improvement technique)。
在70年代後期和80年代早期,大量的項目都關注於編譯器其他部分的生成自動化,這其中就包括了代碼生成。這些嘗試並未取得多少成功,這大概是因為操作太復雜而人們又對其不甚了解。

㈧ 編譯原理

編譯原理是計算機專業的一門重要專業課,旨在介紹編譯程序構造的一般原理和基本方法。內容包括語言和文法、詞法分析、語法分析、語法制導翻譯、中間代碼生成、存儲管理、代碼優化和目標代碼生成。 編譯原理是計算機專業設置的一門重要的專業課程。編譯原理課程是計算機相關專業學生的必修課程和高等學校培養計算機專業人才的基礎及核心課程,同時也是計算機專業課程中最難及最挑戰學習能力的課程之一。編譯原理課程內容主要是原理性質,高度抽象[1]。

中文名
編譯原理[1]
外文名
Compilers: Principles, Techniques, and Tools[1]
領域
計算機專業的一門重要專業課[1]
快速
導航
編譯器

編譯原理課程

編譯技術的發展

編譯的基本流程

編譯過程概述
基本概念
編譯原理即是對高級程序語言進行翻譯的一門科學技術, 我們都知道計算機程序由程序語言編寫而成, 在早期計算機程序語言發展較為緩慢, 因為計算機存儲的數據和執行的程序都是由0、1代碼組合而成的, 那麼在早期程序員編寫計算機程序時必須十分了解計算機的底層指令代碼通過將這些微程序指令組合排列從而完成一個特定功能的程序, 這就對程序員的要求非常高了。人們一直在研究如何如何高效的開發計算機程序, 使編程的門檻降低。[2]
編譯器
C語言編譯器是一種現代化的設備, 其需要藉助計算機編譯程序, C語言編譯器的設計是一項專業性比較強的工作, 設計人員需要考慮計算機程序繁瑣的設計流程, 還要考慮計算機用戶的需求。計算機的種類在不斷增加, 所以, 在對C語言編譯器進行設計時, 一定要增加其適用性。C語言具有較強的處理能力, 其屬於結構化語言, 而且在計算機系統維護中應用比較多, C語言具有高效率的優點, 在其不同類型的計算機中應用比較多。[3]
C語言編譯器前端設計
編譯過程一般是在計算機系統中實現的, 是將源代碼轉化為計算機通用語言的過程。編譯器中包含入口點的地址、名稱以及機器代碼。編譯器是計算機程序中應用比較多的工具, 在對編譯器進行前端設計時, 一定要充分考慮影響因素, 還要對詞法、語法、語義進行分析。[3]
1 詞法分析[3]
詞法分析是編譯器前端設計的基礎階段, 在這一階段, 編譯器會根據設定的語法規則, 對源程序進行標記, 在標記的過程中, 每一處記號都代表著一類單詞, 在做記號的過程中, 主要有標識符、關鍵字、特殊符號等類型, 編譯器中包含詞法分析器、輸入源程序、輸出識別記號符, 利用這些功能可以將字型大小轉化為熟悉的單詞。[3]
2 語法分析[3]
語法分析是指利用設定的語法規則, 對記號中的結構進行標識, 這包括句子、短語等方式, 在標識的過程中, 可以形成特殊的結構語法樹。語法分析對編譯器功能的發揮有著重要影響, 在設計的過程中, 一定要保證標識的准確性。[3]
3 語義分析[3]
語義分析也需要藉助語法規則, 在對語法單元的靜態語義進行檢查時, 要保證語法規則設定的准確性。在對詞法或者語法進行轉化時, 一定要保證語法結構設置的合法性。在對語法、詞法進行檢查時, 語法結構設定不合理, 則會出現編譯錯誤的問題。前端設計對精確性要求比較好, 設計人員能夠要做好校對工作, 這會影響到編譯的准確性, 如果前端設計存在失誤, 則會影響C語言編譯的效果。[3]

㈨ 為什麼要學習編譯原理(轉)

大學課程為什麼要開設編譯原理呢?這門課程關注的是編譯器方面的產生原理和技術問題,似乎和計算機的基礎領域不沾邊,可是編譯原理卻一直作為大學本科的必修課程,同時也成為了研究生入學考試的必考內容。編譯原理及技術從本質上來講就是一個演算法問題而已,當然由於這個問題十分復雜,其解決演算法也相對復雜。我們學的數據結構與演算法分析也是講演算法的,不過講的基礎演算法,換句話說講的是演算法導論,而編譯原理這門課程講的就是比較專註解決一種的演算法了。在20世紀50年代,編譯器的編寫一直被認為是十分困難的事情,第一Fortran的編譯器據說花了18年的時間才完成。在人們嘗試編寫編譯器的同時,誕生了許多跟編譯相關的理論和技術,而這些理論和技術比一個實際的編譯器本身價值更大。就猶如數學家們在解決著名的哥德巴赫猜想一樣,雖然沒有最終解決問題,但是其間誕生不少名著的相關數論。 推薦參考書 雖然編譯理論發展到今天,已經有了比較成熟的部分,但是作為一個大學生來說,要自己寫出一個像TurbocC,Java那樣的編譯器來說還是太難了。不僅寫編譯器困難,學習編譯原理這門課程也比較困難。 第一本書的原名叫《CompilersPrinciples,Techniques,andTools》,另外一個響亮的名字就是龍書。原因是這本書的封面上有條紅色的龍,也因為獗臼樵詒嘁朐?砘?嘴域確實?忻?所以很多國外的學者都直接取名為龍書。最近機械工業出版社已經出版了此書的中文版,名字就叫《編譯原理》。該書出的比較早,大概是在85或86年編寫完成的,作者之一還是著名的貝爾實驗室的科學家。裡面講解的核心編譯原理至今都沒有變過,所以一直到今天,它的價值都非凡。這本書最大的特點就是一開始就通過一個實際的小例子,把編譯原理的大致內容羅列出來,讓很多編譯原理的初學者很快心裡有了個底,也知道為什麼會有這些理論,怎麼運用這些理論。而這一點是我感覺國內的教材缺乏的東西,所以國內的教材都不是寫給願意自學的讀者,總之讓人看了半天,卻不知道裡面的東西有什麼用。 第二本書的原名叫《ModernCompilerDesign》,中文名字叫做《現代編譯程序設計》。該書由人民郵電出版社所出。此書比較關注的是編譯原理的實踐,書中給出了不少的實際程序代碼,還有很多實際的編譯技術問題等等。此書另外一個特點就是其現代而字。在傳統的編譯原理教材中,你是不可能看到如同Java中的垃圾回收等演算法的。因為Java這樣的解釋執行語言是在近幾年才流行起來的東西。如果你想深入學習編譯原理的理論知識,那麼你肯定得看前面那本龍書,如果你想自己動手做一個先進的編譯器,那麼你得看這本《現代編譯程序設計》。 第三本書就是很多國內的編譯原理學者都推薦的那本《編譯原理及實踐》。或許是這本書引入國內比較早吧,我記得我是在高中就買了這本書,不過也是在前段時間才把整本書看完。此書作為入門教程也的確是個不錯的選擇。書中給出的編譯原理講解也相當細致,雖然不如前面的龍書那麼深入,但是很多地方都是點到為止,作為大學本科教學已經是十分深入了。該書的特點就是注重實踐,不過感覺還不如前面那本《現代編譯程序設計》的實踐味道更重。此書的重點還是在原理上的實踐,而非前面那本那樣的技術實踐。《編譯原理及實踐》在講解編譯原理的各個部分的同時,也在逐步實踐一個現代的編譯器TinyC.等你把整本書看完,差不多自己也可以寫一個TinyC了。作者還對Lex和Yacc這兩個常用的編譯相關的工具進行了很詳細的說明,這一點也是很難在國內的教材中看到的。 推薦了這三本教材,都有英文版和中文版的。很多英文好的同學只喜歡看原版的書,不我的感覺是這三本書的翻譯都很不錯,沒有必要特別去買英文版的。理解理論的實質比理解表面的文字更為重要。 編譯原理的實質 幾乎每本編譯原理的教材都是分成詞法分析,語法分析(LL演算法,遞歸下降演算法,LR演算法),語義分析,運行時環境,中間代碼,代碼生成,代碼優化這些部分。其實現在很多編譯原理的教材都是按照85,86出版的那本龍書來安排教學內容的,所以那本龍書的內容格式幾乎成了現在編譯原理教材的定式,包括國內的教材也是如此。一般來說,大學裡面的本科教學是不可能把上面的所有部分都認真講完的,而是比較偏重於前面幾個部分。像代碼優化那部分東西,就像個無底洞一樣,如果要認真講,就是單獨開一個學期的課也不可能講得清楚。所以,一般對於本科生,對詞法分析和語法分析掌握要求就相對要高一點了。 詞法分析相對來說比較簡單。可能是詞法分析程序本身實現起來很簡單吧,很多沒有學過編譯原理的人也同樣可以寫出各種各樣的詞法分析程序。不過編譯原理在講解詞法分析的時候,重點把正則表達式和自動機原理加了進來,然後以一種十分標準的方式來講解詞法分析程序的產生。這樣的做法道理很明顯,就是要讓詞法分析從程序上升到理論的地步。 語法分析部分就比較麻煩一點了。現在一般有兩種語法分析演算法,LL自頂向下演算法和LR自底向上演算法。LL演算法還好說,到了LR演算法的時候,困難就來了。很多自學編譯原理的都是遇到LR演算法的理解成問題後就放棄了自學。其實這些東西都是只要大家理解就可以了,又不是像詞法分析那樣非得自己寫出來才算真正的會。像LR演算法的語法分析器,一般都是用工具Yacc來生成,實踐中完全沒有比較自己來實現。對於LL演算法中特殊的遞歸下降演算法,因為其實踐十分簡單,那麼就應該要求每個學生都能自己寫。當然,現在也有不少好的LL演算法的語法分析器,不過要是換在非C平台,比如Java,Delphi,你不能運用YACC工具了,那麼你就只有自己來寫語法分析器。 等學到詞法分析和語法分析時候,你可能會出現這樣的疑問:詞法分析和語法分析到底有什麼?就從編譯器的角度來講,編譯器需要把程序員寫的源程序轉換成一種方便處理的數據結構(抽象語法樹或語法樹),那麼這個轉換的過程就是通過詞法分析和語法分析的。其實詞法分析並非一開始就被列入編譯器的必備部分,只是我們為了簡化語法分析的過程,就把詞法分析這種繁瑣的工作單獨提取出來,就成了現在的詞法分析部分。除了編譯器部分,在其它地方,詞法分析和語法分析也是有用的。比如我們在DOS,Unix,Linux下輸入命令的時候,程序如何分析你輸入的命令形式,這也是簡單的應用。總之,這兩部分的工作就是把不規則的文本信息轉換成一種比較好分析好處理的數據結構。那麼為什麼編譯原理的教程都最終把要分析的源分析轉換成樹這種數據結構呢?數據結構中有Stack,Line,List這么多數據結構,各自都有各自的特點。但是Tree這種結構有很強的遞歸性,也就是說我們可以把Tree的任何結點Node提取出來後,它依舊是一顆完整的Tree。這一點符合我們現在編譯原理分析的形式語言,比如我們在函數裡面使用函樹,循環中使用循環,條件中使用條件等等,那麼就可以很直觀地表示在Tree這種數據結構上。同樣,我們在執行形式語言的程序的時候也是如此的遞歸性。在編譯原理後面的代碼生成的部分,就會介紹一種堆棧式的中間代碼,我們可以根據分析出來的抽象語法樹,很容易,很機械地運用遞歸遍歷抽象語法樹就可以生成這種指令代碼。而這種代碼其實也被廣泛運用在其它的解釋型語言中。像現在流行的Java,.NET,其底層的位元組碼bytecode,可以說就是這中基於堆棧的指令代碼的。 關於語義分析,語法制導翻譯,類型檢查等等部分,其實都是一種完善前面得到的抽象語法樹的過程。比如說,我們寫C語言程序的時候,都知道,如果把一個浮點數直接賦值給一個整數,就會出現類型不匹配,那麼C語言的編譯器是怎麼知道的呢?就是通過這一步的類型檢查。像C++語言這中支持多態函數的語言,這部分要處理的問題就更多更復雜了。大部編譯原理的教材在這部分都是講解一些比較好的處理策略而已。因為新的問題總是在發生,舊的辦法不見得足夠解決。 本來說,作為一個編譯器,起作用的部分就是用戶輸入的源程序到最終的代碼生成。但是在講解最終代碼生成的時候,又不得不講解機器運行環境等內容。因為如果你不知道機器是怎麼執行最終代碼的,那麼你當然無法知道如何生成合適的最終代碼。這部分內容我自我感覺其意義甚至超過了編譯原理本身。因為它會把一個計算機的程序的運行過程都通通排在你面前,你將來可能不會從事編譯器的開發工作,但是只要是和計算機軟體開發相關的領域,都會涉及到程序的執行過程。運行時環境的講解會讓你更清楚一個計算機程序是怎麼存儲,怎麼裝載,怎麼執行的。關於部分的內容,我強烈建議大家看看龍書上的講解,作者從最基本的存儲組織,存儲分配策略,非局部名字的訪問,參數傳遞,符號表到動態存儲分配(malloc,new)都作了十分詳細的說明。這些東西都是我們編寫平常程序的時候經常要做的事情,但是我們卻少去探求其內部是如何完成。 關於中間代碼生成,代碼生成,代碼優化部分的內容就實在不好說了。國內很多教材到了這部分都會很簡單地走馬觀花講過去,學生聽了也只是作為了解,不知道如何運用。不過這部分內容的東西如果要認真講,單獨開一學期的課程都講不完。在《編譯原理及實踐》的書上,對於這部分的講解就恰到好處。作者主要講解的還是一種以堆棧為基礎的指令代碼,十分通俗易懂,讓人看了後,很容易模仿,自己下來後就可以寫自己的代碼生成。當然,對於其它代碼生成技術,代碼優化技術的講解就十分簡單了。如果要仔細研究代碼生成技術,其實另外還有本叫做《》,那本書現在由機械工業出版社引進的,十分厚重,而且是英文原版。不過這本書我沒有把它列為推薦書給大家,畢竟能把龍書的內容搞清楚,在中國已經就算很不錯的高手了,到那個時候再看這本《》也不遲。代碼優化部分在大學本科教學中還是一個不太重要的部分,就是算是實踐過程中,相信大家也不太運用得到。畢竟,自己做的編譯器能正確生成執行代碼已經很不錯了,還談什麼優化呢? 編譯原理的課程畢竟還只是講解原理的課程,不是專門的編譯技術課程。這兩門課程是有很大的區別的。編譯技術更關注實際的編寫編譯器過程中運用到的技術,而原理的課

㈩ 語言處理系統的發展過程

隨著程序設計語言的變化和發展,語言處理系統也跟著由小到大、由簡單到復雜的變化和發展。最初人們直接用機器語言來描述問題的解法,這種程序無需任何處理就能直接在計算機上運行。但是這樣的編程方式太繁瑣,極易出錯,效率極低,是非常不可取的。在計算機發展的早期,人們就在努力設法改變這種編程方式。開始時傾向於准備好一個由一些常用的常式程序組成的庫,並借用一些代碼來引用該庫中的例行程序。後來改用一些字元或語言來表示這些代碼,這樣就成了符號語言的雛形。在此基礎上,人們努力使機器語言符號化。機器語言發展成了匯編語言。語言的這一發展導致要求有一翻譯程序把匯編語言程序翻譯成機器語言程序,這種翻譯程序稱為匯編程序。
緊隨匯編語言和匯編程序之後發展的是自動編譯器。在自動編譯器中,程序人員用的語言更接近通常的數學表示體系。20世紀50年代初出現的第一批自動編譯器都十分初步,它們只允許簡單的單目運算,數據元素的命名方式有很多限制,然而它們促進了對高級語源殲鬧言處理系統和通用的翻譯過程的研究。 20世紀50年代中期出現了FORTRAN等一批高級語言,與此相適用的語言處理程序、解釋程序和編譯程序也相繼開發成功。
隨著編譯技術的進步和社會對編譯程序需求的不斷增長,50年代末有人開始研究編譯程序的自動生成工具,提出並研製編譯程序的編譯程序,它的功能是從任一語言的詞法規則、語法規則和語義解釋出發,自動產生該語言的編譯程序。研製一個功能完全且實用的編譯程序的編譯程序是很困難的。多數編雹罩譯程序的編譯程序都是一些專用編程序生成系統,如自動生成詞法分析程序的掃描程序生成系統,自動生成語法分析程序的語法分析程序生成系統。
60年代起,不斷有人開始使用自展技術來構造編譯程序。自展的主要特徵是用被編譯的語言來書寫該語言自身的編譯程序。自展的思想最早在50年代中間就有人提出,到1971年,PASCAL的編譯程序用改帆自展技術生成後,其影響越來越大。
隨著並行技術和並行語言的發展,處理並行語言的並行編譯技術正在深入研究之中,將串列程序轉換成並行程序的自動並行編譯技術也正在深入研究之中。

閱讀全文

與編譯技術何時出現相關的資料

熱點內容
java快遞介面 瀏覽:385
哪個app可以教新爸爸 瀏覽:206
如何查看伺服器系統版本信息 瀏覽:524
成都市土地出讓金演算法 瀏覽:702
鋼筋加密標記 瀏覽:575
ps中擴展功能在文件夾的什麼位置 瀏覽:903
雙極壓縮機為什麼要先高壓 瀏覽:527
蘋果手機伺服器填什麼 瀏覽:832
android移動動畫效果 瀏覽:691
電子和伺服器是什麼意思 瀏覽:691
phpurl中文亂碼問題 瀏覽:893
程序員那麼可愛大結局陸漓產子 瀏覽:538
java如何從雲伺服器讀取本地文件 瀏覽:923
壓縮空氣軟管製作方法 瀏覽:911
天河三號演算法 瀏覽:924
php隊列教程 瀏覽:632
洪水命令 瀏覽:529
安卓怎麼弄成蘋果在線 瀏覽:435
谷歌web伺服器地址 瀏覽:900
安卓鎖屏圖片如何刪除 瀏覽:721