綜合——前言(編譯)

1. 程序編譯

1.1 程序編譯的目的

????程序編譯的目的把源代碼變成目標代碼。如果源代碼在操作系統(tǒng)上運行:目標代碼就是“匯編代碼”。再通過匯編和鏈接的過程形成可執(zhí)行文件,然后通過加載器加載到操作系統(tǒng)執(zhí)行。

1.2 程序編譯流程

編譯流程

1.2.1 詞法分析

????源代碼程序被輸入到掃描器(Scanner),掃描器對源代碼進行簡單的詞法分析,運用類似于有限狀態(tài)機(Finite State Machine)的算法可以很輕松的將源代碼字符序列分割成一系列的記號(Token)。
????詞法分析產(chǎn)生的記號一般可以分為如下幾類:關(guān)鍵字、標識符、字面量(包含數(shù)字、字符串等)特殊符號(如加號、等號)。在識別記號的同時,掃描器也完成了其他工作,比如將標識符存放到符號表,將數(shù)字、字符串常量存放到文字表等,以備后面的步驟使用。
????????例如c代碼:

sum=3+2;

sum=3+2;詞法分析結(jié)果

????????詞法分析器通常不會關(guān)心記號之間的關(guān)系(屬于語法分析的范疇),舉例來說:詞法分析器能夠?qū)⒗ㄌ栕R別為記號,但并不保證括號是否匹配。
????????詞法分析器有兩大類實現(xiàn)方案及特點

  • 手動構(gòu)造
    ????????復(fù)雜,容易出錯;
    ????????比較可控,是主流的方案(GCC、LLVM 等采用此辦法);
  • 自動構(gòu)造
    ????????構(gòu)造速度快,工作量少;
    ????????細節(jié)難以控制;

1.2.2 語法分析

????語法分析器(Grammar Parser)將對由掃描器產(chǎn)生的記號進行語法分析,從而產(chǎn)生語法樹(Syntax Tree)。
????語法分析器的任務(wù)主要是確定是否可以以及如何從語法的起始符號推導(dǎo)出輸入符號串(輸入文本),主要可以通過兩種方式完成:

  • 自頂向下分析:根據(jù)形式語法規(guī)則,在語法分析樹的自頂向下展開中搜索輸入符號串可能的最左推導(dǎo)。單詞按從左到右的順序依次使用。
  • 自底向上分析:語法分析器從現(xiàn)有的輸入符號串開始,嘗試將其根據(jù)給定的形式語法規(guī)則進行改寫,最終改寫為語法的起始符號。

1.2.3 語義分析

????語義分析也稱為類型檢查、上下文相關(guān)分析。它負責(zé)檢查程序(抽象語法樹)的上下文
????????1. 相關(guān)的屬性,這是具體語言相關(guān)的,典型的情況包括:
????????2. 變量在使用前先進行聲明
????????3. 每個表達式都有合適的類型
????????4. 函數(shù)調(diào)用和函數(shù)的定義一致

1.2.4 中間代碼

????中間表示(intermediate representation),簡稱為IR。如果源語言語法結(jié)構(gòu)較為簡單,編譯器可能會用唯一的IR,如果源語言語法結(jié)構(gòu)比較復(fù)雜(eg:rust),則在轉(zhuǎn)換為目標語言的過程中可能會使用了一系列的IR。
????泛泛而言,IR從結(jié)構(gòu)上分為三類:
????????1. 圖IR, 將編譯器的知識編碼在圖中。算法通過圖中的對象來表述:結(jié)點、邊、列表、樹。
????????2. 線性IR, 類似于某些抽象機上的偽代碼。相應(yīng)的算法將迭代遍歷簡單的線性操作序列。本書使用的ILOC代碼就是一種線性IR。
????????3. 混合IR, 結(jié)合了圖IR和線性IR的要素,為的是獲取兩者的優(yōu)勢而避免其弱點。一種常見的混合表示使用底層的線性IR來表示無循環(huán)代碼的塊,使用圖來表示這些塊之間的控制流。
更多相關(guān)內(nèi)容參見中間代碼表示
????具體中間代碼的表示形式有多種具體請見12
????????逆波蘭表示
????????三地址碼(三元式、四元式)
????????抽象語法樹
????????P-代碼

1.2.5 中間代碼優(yōu)化

????優(yōu)化其實可以在編譯的各個階段進行,但最主要的一類優(yōu)化是在目標代碼生成以前,對語法分析、語義分析后產(chǎn)生的中間代碼進行優(yōu)化。這是因為中間代碼的形式不依賴于具體的計算機,它可以是三地址碼的形式,所以相應(yīng)的對于中間代碼的優(yōu)化也不依賴于具體的計算機。另一類優(yōu)化是在生成目標代碼時進行的,它很大程序上依賴于具體的計算機。

中間代碼優(yōu)化

????優(yōu)化過程中需要遵從的原則

  • 等價原則:經(jīng)過優(yōu)化后不應(yīng)該改變程序運行的結(jié)果。這是最不應(yīng)該也不能破壞的原則,試問程序結(jié)果都不正確了,優(yōu)化的意義何在?
  • 有效原則:優(yōu)化后的代碼運行快、存儲空間需求小。這也正是我們優(yōu)化代碼的目的,從時空兩個維度盡可能讓代碼效率高。
  • 合算原則:盡可能以較低的代價,取得較高的優(yōu)化效果。
    常見的代碼優(yōu)化技術(shù)有:刪除多余運算、合并已知量和復(fù)寫傳播,刪除無用賦值等。更多相關(guān)內(nèi)容請移步

1.2.6 目標代碼生成

以基本塊為單位生成目標代碼(龍書:把中間代碼劃分成為基本塊 (basic block)。每個基本塊是滿足下列條件的最大的連續(xù)三地址指令序列。 ①控制流只能從基本塊中的第 一個指令進人該塊。也就是說,沒有跳轉(zhuǎn)到基本塊中間的轉(zhuǎn)移指令。 ②除了基本塊的最后一個指令,控制流在離開基本塊之前不會停機或者跳轉(zhuǎn)。)更多請見

  • 依次把四元式的中間代碼變換成目標代碼
  • 在基本塊的范圍內(nèi)考慮如何充分利用寄存器
  • 進入基本塊時,所有寄存器空閑
  • 離開基本塊時,把存在寄存器中的現(xiàn)行的值存回主存中,釋放所有寄存器
  • 不特別說明,所有說明變量在基本塊出口之后均為非活躍變量

2. 編譯過程中涉及的技術(shù)

2.1 詞法分析

2.1.1 詞法分析過程中涉及的點

  • 詞法單元(Token):<詞法單元名、屬性值 (可選) >;單元名是表示詞法單位種類的抽象符號,語法分析器通過單元名即可確定詞法單元序列的結(jié)構(gòu);屬性值通常用于語義分析之后的階段。
  • 模式 (Pattern):描述了一類詞法單元的詞素可能具有的形式;
  • 詞素 (Lexeme):源程序中的字符序列; 它和某個詞法單元的模式匹配,被詞法分析器識別為該詞法單元的實例;
  • 狀態(tài)轉(zhuǎn)移圖:用于識別詞法單元;我們需要把模式轉(zhuǎn)換成狀態(tài)轉(zhuǎn)換圖。狀態(tài)轉(zhuǎn)換圖有一組被稱為狀態(tài)的結(jié)點。每個狀態(tài)代表一個可能和模式匹配的詞素。狀態(tài)圖中的邊從圖的一個狀態(tài)指向另一個狀態(tài)。每條邊的標號包含了一個或多個符號。更多請見詞法分析-南京大學(xué)例如:
    詞法單元relop狀態(tài)轉(zhuǎn)移圖
  • 非確定狀態(tài)的有限狀態(tài)自動機(NonDeterministic Finite Automata,NFA):
    NFA的定義與例子
  • 確定狀態(tài)的有限狀態(tài)自動機(Deterministic Finite Automata,DFA):將上圖中紅色的框框消除掉就完成DFA了,從NFA轉(zhuǎn)換為DFA為子集構(gòu)造的過程,轉(zhuǎn)換過程可以參考NFA轉(zhuǎn)DFA

2.1.2 詞法分析工具

  • flex詞法分析器:Lex 是 LEXical compiler 的縮寫,是一個詞法分析器(scanner)的生成工具,它使用正則表達式(regular expression)來描述各個詞法單元的模式,由此給出一個詞法分析器的規(guī)約,并生成相應(yīng)的實現(xiàn)代碼。 Lex 程序的輸入方法稱為 Lex 語言,而 Lex 程序本身被稱為 Lex 編譯器;flex是lex的開源版本。
    lex程序的結(jié)構(gòu)

    lex使用
  • ANTLR4詞法分析器:ANTLR4集詞法與語法分析與一身,其詞法分析的使用如下例所示,更多請見Antlr4簡易快速入門
// 表明SearchLexer.g4文件是詞法分析器(lexer)定義文件
// 詞法分析器的名稱一定要和文件名保持一致
lexer grammar SearchLexer;

channels {
    ESQLCOMMENT,
    ERRORCHANNEL
}

//SKIP 當(dāng)Antlr解析到下面的代碼時,會選擇跳過
// 遇到 \t\r\n 會忽略
SPACE: [ \t\r\n]+ -> channel(HIDDEN);
// 遇到 /*!  */ 會當(dāng)作注釋跳過
SPEC_ESSQL_COMMENT: '/*!' .+? '*/' -> channel(ESQLCOMMENT);
// 遇到 /* */ 會當(dāng)作注釋跳過
COMMENT_INPUT: '/*' .*? '*/' -> channel(HIDDEN);
// 遇到 -- 會當(dāng)作注釋跳過
// 遇到 # 會當(dāng)作注釋跳過
LINE_COMMENT: (
        ('-- ' | '#') ~[\r\n]* ('\r'? '\n' | EOF)
        | '--' ('\r'? '\n' | EOF)
    ) -> channel(HIDDEN);

// 定義Token,模式為 {field}:{value}
MINUS: '-';  //使MINUS和-等價,以下同理
STAR: '*';

COLON: ':'|'\uFF1A';
EQ: '=';
NE: '!=';
BOOLOR: '||'|'|';  // 使BOOLOR與||或者|等價
BOOLAND: '&&'|COMMA|'&';

//CONSTRUCTORS

DOT: '.' -> mode(AFTER_DOT);
LBRACKET: '[';
RBRACKET: ']';
LPAREN: '(';
RPAREN: ')';
COMMA: ','|'\uFF0C';  // 使COMMA與,或,等價(\uFF0C表示,的unicode編碼)
SEMI: ';';
GT: '>';

// 這里和以下代碼等價
// AFTER: 'after'  但是這種代碼只能表示小寫的after,是大小寫區(qū)分的,這樣不好
// 通過下面定義的fragment,將AFTER用A F T E R表示,一定要每個字母空一格,就可以不區(qū)分大小寫了
// 所有語法的關(guān)鍵字都建議使用這種方式聲明
AFTER: A F T E R;
SINGLE_QUOTE: '\'';
DOUBLE_QUOTE: '"';
REVERSE_QUOTE: '`';

UNDERLINE: '_';

CHINESE: '\u4E00'..'\u9FA5';  //表示所有中文的unicode編碼,以支持中文

ID: (CHINESE|ID_LETTER|DOT|MINUS|UNDERLINE|INT|FLOAT|REVERSE_QUOTE|DOUBLE_QUOTE|SINGLE_QUOTE)+;

// ? 表示可有可無
// + 表示至少有一個
// | 表示或的關(guān)系
// * 表示有0或者多個
INT: MINUS? DEC_DIGIT+;
FLOAT: (MINUS? DEC_DIGIT+ DOT DEC_DIGIT+)| (MINUS? DOT DEC_DIGIT+);

// 使用DEC_DIGIT代表0到9之間的數(shù)字
fragment DEC_DIGIT: [0-9]; 

// 使用ID_LETTER代表a-z的大寫小寫字母和_
fragment ID_LETTER: [a-zA-Z]| UNDERLINE;
// 表示用A代表a和A,這樣就可以不區(qū)分大小寫了,以下同理
fragment A: [aA]; 
fragment B: [bB];
fragment C: [cC];
fragment D: [dD];
fragment E: [eE];
fragment F: [fF];
fragment G: [gG];
fragment H: [hH];
fragment I: [iI];
fragment J: [jJ];
fragment K: [kK];
fragment L: [lL];
fragment M: [mM];
fragment N: [nN];
fragment O: [oO];
fragment P: [pP];
fragment Q: [qQ];
fragment R: [rR];
fragment S: [sS];
fragment T: [tT];
fragment U: [uU];
fragment V: [vV];
fragment W: [wW];
fragment X: [xX];
fragment Y: [yY];
fragment Z: [zZ];

mode AFTER_DOT;

//DEFAULT_MODE是Antlr中默認定義好的mode
DOTINTEGER: ( '0' | [1-9] [0-9]*) -> mode(DEFAULT_MODE);
DOTID: [_a-zA-Z] [_a-zA-Z0-9]* -> mode(DEFAULT_MODE);

2.2 語法分析

語法分析過程

2.2.1 文法

????????文法G 定義為四元組(VN ,VT ,P,S)
????????????VN :非終結(jié)符集
????????????VT :終結(jié)符集
????????????P :產(chǎn)生式集合(規(guī)則集合)
????????????S :開始符號(識別符號

  • 0型文法:0型文法也稱為短語文法,0型文法的能力相當(dāng)于圖靈機(Turing)?;蛘哒f,任何0型語言都是遞歸可枚舉的;反之,遞歸可枚舉集必定是一個0型語言。 對0型文法產(chǎn)生式的形式作某些限制,以給出1,2和3型文法的定義。
  • 1型文法(上下文有關(guān)文法):此文法對應(yīng)于線性有界自動機。它是在0型文法的基礎(chǔ)上每一個α→β,都有|β|>=|α|。這里的|β|表示的是β的長度
  • 2型文法(上下文無關(guān)文法,context-free grammar,CFG):它對應(yīng)于下推自動機。2型文法是在1型文法的基礎(chǔ)上,再滿足:每一個α→β都有α是非終結(jié)符。
  • 3型文法(右線性/左線性/正規(guī)文法):它對應(yīng)于有限狀態(tài)自動機。它是在2型文法的基礎(chǔ)上滿足:A→α|αB(右線性)或A→α|Bα(左線性);


    文法之間的包含關(guān)系

2.2.2 語法分析中的技術(shù)

  • 自頂向下分析算法
  • 遞歸下降分析算法(自頂向下)
  • LL (1) 分析算法(自頂向下)
  • 自底向上分析算法
    ????????自頂向下分析就是從起始符號開始,不斷的挑選出合適的產(chǎn)生式,將中間句子中的非終結(jié)符的展開,最終展開到給定的句子。它的核心思想在于,當(dāng)我們從左往右匹配這個句子的時候,每匹配一次需要從上往下遍歷一次這個 CFG 從而找到合適的產(chǎn)生式,所以被稱為自頂向下分析算法。


    自頂向下例程

    ????????遞歸下降分析算法本質(zhì)也是一種自頂向下分析算法,其基本思想如下:(1)對每一個非終結(jié)符構(gòu)造一個分析函數(shù);(2)用前看符號指導(dǎo)產(chǎn)生式規(guī)則的選擇。遞歸下降分析算法使用 “分治法” 來提高分析的效率,對于每一個產(chǎn)生式規(guī)則,都應(yīng)該定義一個自己函數(shù)。因為在上下文無關(guān)文法中,終結(jié)符不可能出現(xiàn)在產(chǎn)生式的左邊(可以在產(chǎn)生式左邊出現(xiàn)終結(jié)符的文法叫做上下文有關(guān)文法),上下文無關(guān)文法中所有的產(chǎn)生式左邊只有一個非終結(jié)符。所以我們在調(diào)用產(chǎn)生式規(guī)則的函數(shù)后,就分為兩種情況:(1)遇到終結(jié)符,因為終結(jié)符本質(zhì)上是 token,所以直接把這個終結(jié)符和句子中對應(yīng)位置的 token 進行比較,判斷是否符合即可;符合就繼續(xù),不符合就返回;(2)遇到非終結(jié)符,此時只需要調(diào)用這個非終結(jié)符對應(yīng)的函數(shù)即可。在這里函數(shù)可能會遞歸的調(diào)用,這也是算法名稱的來源。同上例

EOF = '\n'  # 用換行符作為EOF符號

class Parser(object):

    def __init__(self, sentence):
        self.sentence = sentence
        self.current_pos = 0  # 當(dāng)前的token下標

    def parse_S(self):
        self.parse_A()
        self.parse_B()

    def parse_A(self):
        token = self.get_next_token()   # 從句子中取出一個Token
        if token == 'a':                # 和CFG中的Token進行比較
            self.parse_A()              # 執(zhí)行非終結(jié)符所對應(yīng)的函數(shù)
        elif token != 'a':
            self.put_token_back()

    def parse_B(self):
        token = self.get_next_token()
        if token == 'b':
            token = self.get_next_token()
            if token == EOF:
                pass
            else:
                self.parse_B()
        else:
            raise Exception('非終結(jié)符 B 解析異常')

    def get_next_token(self):
        if self.current_pos == len(self.sentence):
            raise Exception('數(shù)組越界')

        next_token = self.sentence[self.current_pos]
        self.current_pos += 1
        return next_token

    def put_token_back(self):
        self.current_pos -= 1


if __name__ == '__main__':
    sentence = 'aab'
    parser = Parser(sentence + EOF)
    parser.parse_S()

????????以上代碼只要能正常運行結(jié)束而不出現(xiàn)異常,就說明句子’aab’符合此文法。(1)因為 S 的產(chǎn)生式是非終結(jié)符 A 和 B,所以只需要調(diào)用 A 和 B 的函數(shù)即可;(2)A 產(chǎn)生式涉及到了終結(jié)符,所以我們需要先從句子取一個 Token,然后根據(jù) Token 的值進行邏輯判斷:如果 token 是 a,則獲取到非終結(jié)符 A,繼續(xù)遞歸執(zhí)行 A 的函數(shù);如果不是 a,那么不做任何操作,還要把當(dāng)前的 token 放回到句子中;(3)B 產(chǎn)生式第一個 token 是一樣的,無法進行區(qū)分,我們可以用第二個 token 判斷:如果已經(jīng)到了句子結(jié)尾(也就是說此 token 不是 b),不做任何操作;如果還有 token,則繼續(xù)執(zhí)行。
????????LL (1) 算法也是一個自頂向下的分析算法,它的定義為:從左(L)向右讀入一個程序,最左(L)推導(dǎo),采用一個(1)前看符號。LL (1) 算法和自頂向下分析算法本質(zhì)上是一致的,它們的區(qū)別就在于 LL (1) 算法使用了一種稱為分析表的工具來避免了回溯操作,提高了效率。在現(xiàn)實中,我們可以根據(jù)某種 LL (1) 分析器來生成分析表,之后根據(jù)分析表來進行語法分析操作,我們可以認為這種方法是一種半自動的語法分析方法。LL (1) 的總體工作方式如下所示:

LL(1)

????????例如對于文法:1.S → F,2.S → ( S + F ),3.F → 1,分析“( 1 + 1 )”
????????最開始棧中的元素為:S;執(zhí)行 else 中的代碼,把 S pop 出去。此時第一個 token 為 (,查閱分析表可得我們應(yīng)該執(zhí)行產(chǎn)生式 2,所以被 push 進行 stack 的值為 (S + F)
????????此時棧為: (S + F);棧頂元素 (等于當(dāng)前的 token,( 被 pop,token 向后移一位
????????棧:S + F);當(dāng)前 token 為 1,棧頂元素 S,查分析表可得產(chǎn)生式 1,棧變?yōu)?F + F)
????????棧:F + F);棧頂 F,token 1
????????棧:1 + F);棧頂 1,token 1
????????棧:+ F);棧頂 +,token +
????????棧:F);棧頂 F,token 1
????????棧:1);棧頂 1,token 1
????????棧:);棧頂 ),token )
????????棧:None;token 為空。流程結(jié)束
????????自底向上分析算法是語法分析的另一類重要算法,它包含了 LR (0) 算法、SLR 算法和 LR (1) 算法。自底向上分析算法的主要方式是根據(jù)句子的 Token,使用產(chǎn)生式來自右向左進行分析,即把右側(cè)的內(nèi)容 “收縮” 為左側(cè)的非終結(jié)符,這種行為我們稱為規(guī)約(reduce)。自底向上語法分析算法是從語法分析樹的葉子節(jié)點開始,逐漸向上到達根節(jié)點,反向構(gòu)造出一個最右推導(dǎo)序列,從而構(gòu)建完整的語法分析樹,適用于LR(k)文法。LR(k)文法的L是輸入從左到右,R是反向最右推導(dǎo)(rightmost derivation in reverse),k是前瞻符號數(shù)量。更多解釋請移步語法分析

2.2.3 語法分析工具

  • yacc是一個LALR(1)分析器自動生成器,是貝爾實驗室在UNIX上首次實現(xiàn),與LEX有直接的接口,一般使用是 Yacc + Lex 或 Bison + Flex;其使用介紹可以移步高效解析器 Lex&YACC(Flex&Bison) 使用教程或者yacc
  • ANTLR4:ANTLR(全名:ANother Tool for Language Recognition)是基于LL(*)算法實現(xiàn)的語法解析器生成器(parser generator),用Java語言編寫,使用自上而下(top-down)的遞歸下降LL剖析器方法。由舊金山大學(xué)的Terence Parr博士等人于1989年開始發(fā)展。使用例程請移步Antlr4簡易快速入門

2.3 語義分析

????????語法分析基于CFG(Context-Free Grammar)上下文無關(guān)文法,因此無法做語義分析;語義分析往往與語法元素的上下文密切相關(guān)。

2.3.1 語義分析的具體內(nèi)容

????????檢查程序是否符合語言的語義規(guī)則:

  • 類型規(guī)則
  • 變量使用規(guī)則
  • 函數(shù)調(diào)用 (foo(…)) 規(guī)則
  • 屬性訪問 (x.f) 規(guī)則
  • ...
    ????????Syntax-Directed Definition n (SDD) 是上下文無關(guān)文法和屬性/規(guī)則的結(jié)合:(1)屬性和文法符號相關(guān)聯(lián),按照需要來確定各個文法符號需要哪些屬性;(2)規(guī)則和產(chǎn)生式相關(guān)聯(lián)。SDD三要素:文法、屬性、規(guī)則,其中屬性可視為語義的具象化表示:類型、值、名字、地址。一個分析樹結(jié)點和它的分支對應(yīng)一個產(chǎn)生式規(guī)則,而對應(yīng)的語義規(guī)則確定了這些結(jié)點上屬性的取值和計算。
  • 綜合屬性 (Synthesized Attribute)(自底向上):結(jié)點N的屬性值由N的產(chǎn)生式所關(guān)聯(lián)的語義規(guī)則來定義;通過N的子結(jié)點或N本身的屬性值來定義
  • 繼承屬性 (Inherited Attribute)(自頂向下):結(jié)點N的屬性值由N的父結(jié)點所關(guān)聯(lián)的語義規(guī)則來定義;依賴于N的父結(jié)點、N本身和N的兄弟結(jié)點上的屬性值;
  • 不允許N的繼承屬性通過N的子結(jié)點上的屬性來定義,但允許N的綜合屬性依賴于N本身的繼承屬性;終結(jié)符號有綜合屬性 (來自詞法分析),但無繼承屬性;
  • 只包含綜合(Synthesized)屬性的SDD稱為S屬性的SDD:每個語義規(guī)則都根據(jù)產(chǎn)生式體中的屬性值來計算頭部,非終結(jié)符號的屬性值
  • S屬性的SDD可以和LR語法分析器一起實現(xiàn):棧中的狀態(tài)/文法符號可以附加相應(yīng)的屬性值;歸約時,按照語義規(guī)則計算歸約得到的符號的屬性值;沒有副作用的SDD稱為屬性文法 (Attribute Grammar)。

3 參考

(1)一篇文章理解編譯全過程
(2)GCC編譯器原理
(3)詞法分析維基百科
(4)詞法分析
(5)語法分析
(6)語法分析維基百科
(7)語義分析
(8)文法分類
(9)編譯原理之文法分類
(10)語法分析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 編譯的主要任務(wù)是將源代碼文件作為輸入,最終輸出目標文件,這期間發(fā)生了什么?便是我們本篇文章要介紹的。在開始之...
    沐靈洛閱讀 3,404評論 0 2
  • 一、什么是編譯器 簡單講,編譯器就是將“一種語言(通常為高級語言)”翻譯為“另一種語言(通常為低級語言)的程序。一...
    希爾羅斯沃德_董閱讀 2,257評論 0 3
  • 前言 編譯的主要任務(wù)是將源代碼文件作為輸入,最終輸出目標文件,這期間發(fā)生了什么?便是我們本篇文章要介紹的。在開始之...
    QiShare閱讀 4,710評論 0 7
  • 前言 語言類型 我們有很多維度可以將計算機語言進行分類,其中以編譯/執(zhí)行方式為維度,可以將計算機語言分為: 編譯型...
    AiLearn閱讀 2,634評論 1 6
  • 在我們介紹 LLVM 之前我們先通過一個案例來了解一下編譯器。 編譯器 python 示例 首先打開終端,cd 到...
    晨曦的簡書閱讀 793評論 0 1

友情鏈接更多精彩內(nèi)容