❶ 編譯程序的工作過程
編譯程序必須分析源程序,然後綜合成目標程序。首先,檢查源程序的正確性,並把它分解成若干基本成分;其次,再根據這些基本成分建立相應等價的目標程序部分。為了完成這些工作,編譯程序要在分析階段建立一些表格,改造源程序為中間語言形式,以便在分析和綜合時易於引用和加工(圖1)。
數據結構分析和綜合時所用的主要數據結構,包括符號表、常數表和中間語言程序。符號表由源程序中所用的標識符連同它們的屬性組成,其中屬性包括種類(如變數、數組、結構、函數、過程等)、類型(如整型、實型、字元串、復型、標號等),以及目標程序所需的其他信息。常數表由源程序中用的常數組成,其中包括常數的機內表示,以及分配給它們的目標程序地址。中間語言程序是將源程序翻譯為目標程序前引入的一種中間形式的程序,其表示形式的選擇取決於編譯程序以後如何使用和加工它。常用的中間語言形式有波蘭表示、三元組、四元組以及間接三元組等。
分析部分源程序的分析是經過詞法分析、語法分析和語義分析三個步驟實現的。詞法分析由詞法分析程序(又稱為掃描程序)完成,其任務是識別單詞(即標識符、常數、保留字,以及各種運算符、標點符號等)、造符號表和常數表,以及將源程序換碼為編譯程序易於分析和加工的內部形式。語法分析程序是編譯程序的核心部分,其主要任務是根據語言的語法規則,檢查源程序是否合乎語法。如不合乎語法,則輸出語法出錯信息;如合乎語法,則分解源程序的語法結構,構造中間語言形式的內部程序。語法分析的目的是掌握單詞是怎樣組成語句的,以及語句又是如何組成程序的。語義分析程序是進一步檢查合法程序結構的語義正確性,其目的是保證標識符和常數的正確使用,把必要的信息收集和保存到符號表或中間語言程序中,並進行相應的語義處理。
❷ 什麼是預編譯,何時需要預編譯
預編譯又稱為預處理,是做些代碼文本的替換工作
預編譯又稱為預處理,是做些代碼文本的替換工作
處理#開頭的指令,比如拷貝#include包含的文件代碼,#define宏定義的替換,條件編譯等
就是為編譯做的預備工作的階段
主要處理#開始的預編譯指令
預編譯指令指示了在程序正式編譯前就由編譯器進行的操作,可以放在程序中的任何位置。常見的預編譯指令有:
(1)#include 指令
該指令指示編譯器將xxx.xxx文件的全部內容插入此處。若用<>括起文件則在系統的INCLUDE目錄中尋找文件,若用" "括起文件則在當前目錄中尋找文件。一般來說,該文件是後綴名為"h"或"cpp"的頭文件。
注意:<>不會在當前目錄下搜索頭文件,如果我們不用<>而用""把頭文件名擴起,其意義為在先在當前目錄下搜索頭文件,再在系統默認目錄下搜索。
(2)#define指令
該指令有三種用法:
第一種是定義標識,標識有效范圍為整個程序,形如#define XXX,常與#if配合使用;
第二種是定義常數,如#define max 100,則max代表100(這種情況下使用const定義常數更好,原因見注1);
第三種是定義"函數",如#define get_max(a, b) ((a)>(b)?(a):(b)) 則以後使用get_max(x,y)就可以得到x和y中較大的數(這種方法存在一些弊病,見注2)。
第四種是定義"宏函數",如#define GEN_FUN(type) type max_##type(type a,type b){return a>b?a:b;} ,使用時,用GEN_FUN(int),則此處預編譯後就變成了 max_int(int a,int b){return a>b?a:b;},以後就可以使用max_int(x,y)就可以得到x和y中較大的數.比第三種,增加了類型的說明。
(3)#if、#else和#endif指令
這些指令一般這樣配合使用:
#if defined(標識) //如果定義了標識
要執行的指令
#else
要執行的指令
#endif
在頭文件中為了避免重復調用(比如說兩個頭文件互相包含對方),常採用這樣的結構:
#if !(defined XXX) //XXX為一個在你的程序中唯一的標識符,
//每個頭文件的標識符都不應相同。
//起標識符的常見方法是若頭文件名為"abc.h"
//則標識為"abc_h"
#define XXX
真正的內容,如函數聲明之類
#endif
❸ 什麼是編譯程序 編譯程序的工作過程
編譯程序是變成語言在計算機上面運行的一種方式。
比如你現在編寫(編譯型語言)了你個程序文件並要運行它,但是計算機是不認識這個文件裡面的東西的(其實計算機只認識0和1這樣的數字),所以這里就需要把你自己寫的程序文件翻譯一遍,翻譯過後並生成一個計算機能夠識別的文件,把你原來的源文件翻譯成計算機能夠識別的文件的過程就叫編譯,其實計算機運行的真正文件是編譯過後的編譯文件。
❹ 編譯程序有哪些主要構成成分它們各自的主要功能是什麼
編譯過程分為分析和綜合兩個部分,並進一步劃分為詞法分析、語法分析、語義分析、代碼優化、存儲分配和代碼生成等六個相繼的邏輯步驟。這六個步驟只表示編譯程序各部分之間的邏輯聯系,而不是時間關系。
編譯過程既可以按照這六個邏輯步驟順序地執行,也可以按照平行互鎖方式去執行。在確定編譯程序的具體結構時,常常分若干遍實現。對於源程序或中間語言程序,從頭到尾掃視一次並實現所規定的工作稱作一遍。每一遍可以完成一個或相連幾個邏輯步驟的工作。
例如,可以把詞法分析作為第一遍;語法分析和語義分析作為第二遍;代碼優化和存儲分配作為第三遍;代碼生成作為第四遍。
反之,為了適應較小的存儲空間或提高目標程序質量,也可以把一個邏輯步驟的工作分為幾遍去執行。例如,代碼優化可劃分為代碼優化准備工作和實際代碼優化兩遍進行。
(4)什麼工作需要編譯程序擴展閱讀
從左至右逐個字元地對源程序進行掃描,產生一個個的單詞符號,把作為字元串的源程序改造成為單詞符號串的中間程序。執行詞法分析的程序稱為詞法分析程序或掃描器。
源程序中的單詞符號經掃描器分析,一般產生二元式:單詞種別;單詞自身的值。單詞種別通常用整數編碼,如果一個種別只含一個單詞符號,那麼對這個單詞符號,種別編碼就完全代表它自身的值了。若一個種別含有許多個單詞符號,那麼,對於它的每個單詞符號,除了給出種別編碼以外,還應給出自身的值。
詞法分析器一般來說有兩種方法構造:手工構造和自動生成。手工構造可使用狀態圖進行工作,自動生成使用確定的有限自動機來實現。
編譯程序的語法分析器以單詞符號作為輸入,分析單詞符號串是否形成符合語法規則的語法單位,如表達式、賦值、循環等,最後看是否構成一個符合要求的程序,按該語言使用的語法規則分析檢查每條語句是否有正確的邏輯結構,程序是最終的一個語法單位。編譯程序的語法規則可用上下文無關文法來刻畫。
❺ 計算機編譯程序主要是做什麼工作
編譯程序就是將高級語言程序設計語言源程序翻譯成計算機可執行代碼的軟體
❻ 請問匯編程序, 解釋程序, 編譯程序分別指
1、匯編程序
把匯編語言書寫的程序翻譯成與之等價的機器語言程序的翻譯程序。匯編程序輸入的是用匯編語言書寫的源程序,輸出的是用機器語言表示的目標程序。匯編語言是為特定計算機或計算機系列設計的一種面向機器的語言,由匯編執行指令和匯編偽指令組成。
採用匯編語言編寫程序雖不如高級程序設計語言簡便、直觀,但是匯編出的目標程序佔用內存較少、運行效率較高,且能直接引用計算機的各種設備資源。它通常用於編寫系統的核心部分程序,或編寫需要耗費大量運行時間和實時性要求較高的程序段。
2、解釋程序
解釋程序是一種語言處理程序,在詞法、語法和語義分析方面與編譯程序的工作原理基本相同,但在運行用戶程序時,它直接執行源程序或源程序的內部形式(中間代碼)。因此,解釋程序並不產生目標程序,這是它和編譯程序的主要區別。
3、編譯程序
編譯程序也稱為編譯器,是指把用高級程序設計語言書寫的源程序,翻譯成等價的機器語言格式目標程序的翻譯程序。編譯程序屬於採用生成性實現途徑實現的翻譯程序。
它以高級程序設計語言書寫的源程序作為輸入,而以匯編語言或機器語言表示的目標程序作為輸出。編譯出的目標程序通常還要經歷運行階段,以便在運行程序的支持下運行,加工初始數據,算出所需的計算結果。
(6)什麼工作需要編譯程序擴展閱讀:
工作過程
1、匯編程序
輸入匯編語言源程序。檢查語法的正確性,如果正確,則將源程序翻譯成等價的二進制或浮動二進制的機器語言程序,並根據用戶的需要輸出源程序和目標程序的對照清單;如果語法有錯,則輸出錯誤信息,指明錯誤的部位、類型和編號。最後,對已匯編出的目標程序進行善後處理。
2、解釋程序
由總控程序完成初始化工作。依次從源程序中取出一條語句進行語法檢查,如有錯,輸出錯誤信息;如果通過了語法檢查,則根據語句翻澤成相應的指令並執行它。檢查源程序是否已經全部解釋執行完畢,如果未完成則繼續解釋並執行下一條語句,直到全部語句都處理完畢。
3、編譯程序
先進行詞法分析與語法分析,然後生成中間代碼,接著對程序進行多種等價變換來代碼優化,最後生成目標代碼。
❼ 編譯程序是什麼意思編譯是什麼意思
編譯程序(Compiler,compiling program)也稱為編譯器,是指把用高級程序設計語言書寫的源程序,翻譯成等價的機器語言格式目標程序的翻譯程序。
解釋程序是一種語言處理程序,在詞法、語法和語義分析方面與編譯程序的工作原理基本相同,但在運行用戶程序時,它直接執行源程序或源程序的內部形式(中間代碼)。
(7)什麼工作需要編譯程序擴展閱讀:
結構:
編譯過程分為分析和綜合兩個部分,並進一步劃分為詞法分析、語法分析、語義分析、代碼優化、存儲分配和代碼生成等六個相繼的邏輯步驟。這六個步驟只表示編譯程序各部分之間的邏輯聯系,而不是時間關系。
編譯過程既可以按照這六個邏輯步驟順序地執行,也可以按照平行互鎖方式去執行。在確定編譯程序的具體結構時,常常分若干遍實現。對於源程序或中間語言程序,從頭到尾掃視一次並實現所規定的工作稱作一遍。每一遍可以完成一個或相連幾個邏輯步驟的工作。
可以把詞法分析作為第一遍;語法分析和語義分析作為第二遍;代碼優化和存儲分配作為第三遍;代碼生成作為第四遍。反之,為了適應較小的存儲空間或提高目標程序質量,也可以把一個邏輯步驟的工作分為幾遍去執行。
❽ 編譯程序和解釋程序都是什麼意思
1、編譯程序是把用高級程序設計語言或計算機匯編語言書寫的源程序,翻譯成等價的機器語言格式目標程序的翻譯程序,屬於採用生成性實現途徑實現的翻譯程序。編譯程序以高級程序設計語言書寫的源程序作為輸入,而以匯編語言或機器語言表示的目標程序作為輸出;編譯出的目標程序通常還要經歷運行階段,以便在運行程序的支持下運行,加工初始數據,算出所需的計算結果。
2、解釋程序是高級語言翻譯程序的一種,它將源語言書寫的源程序作為輸入,解釋一句後就提交計算機執行一句,並不形成目標程序。就像外語翻譯中的「口譯」一樣,說一句翻一句,不產生全文的翻譯文本。
(8)什麼工作需要編譯程序擴展閱讀:
編譯程序的實現演算法較為復雜。這是因為它所翻譯的語句與目標語言的指令不是一一對應關系,而是一多對應關系;同時也因為它要處理遞歸調用、動態存儲分配、多種數據類型,以及語句間的緊密依賴關系。但是,由於高級程序設計語言書寫的程序具有易讀、易移植和表達能力強等特點,編譯程序廣泛地用於翻譯規模較大、復雜性較高、且需要高效運行的高級語言書寫的源程序。
❾ 一個典型的編譯程序通常由哪些部分組成各部分的主要功能是什麼
通常由七個部分組成。分別是:詞法分析、語法分析、語義分析和中間代碼生成、優化、目標代碼生成以及表格和表格管理、出錯處理。
各自功能是:
1.詞法分析:輸入源程序,對構成源程序的字元串進行掃描和分解,識別出一個個單詞(也稱單詞符號,或簡稱符號)。在詞法分析階段工作所依循的是語言的詞法規則;描述詞法規則的有效工具是正規式和有限自動機。
2.語法分析:在詞法分析的基礎上,根據語言的語法規則,把單詞符號串組成各類語法單位。具體的說,語法分析是在單詞流的基礎上建立一個層次結構——建立語法樹。
3.語義分析和中間代碼生成:語義分析利用語法分析階段確定的層次結構來識別表達式和語句中的操作信息及類型信息;中間代碼生成階段將產生的源程序的一個顯式中間表示,這種中間表示可以看成是某種抽象程序,通常是與平台無關的,(可用三地址碼和四元式表示)。
4.優化:試圖改進中間代碼,以產生執行速度較快的機器代碼。
5.目標代碼生成:生成可重定位的機器代碼或匯編代碼。
6.表格和表格管理:編譯程序在工作過程中需要保持一系列的表格,以登記源程序的各類信息和編譯各階段的進展情況。
7.出錯處理:編譯程序對源程序中的錯誤進行處理,應最大限度地發現源程序中的各種錯誤,准確地指出錯誤的性質和發生錯誤的地點,並且將錯誤所造成的影響限制在盡可能小的范圍內,使得源程序的其餘部分能繼續被編譯下去,以便進一步發現其他可能的錯誤。通常編譯過程中每個階段都可能檢測出錯誤,其中,絕大多數數錯誤可以在編譯的前三階段檢測出來。且源程序中的錯誤通常分為語法錯誤和語義錯誤兩大類。出錯處理就是為了處理以上的錯誤情況。