1. 程式人生 > 其它 >關於外部無法訪問reader.onload內生成值的解決辦法

關於外部無法訪問reader.onload內生成值的解決辦法

  • 編譯器是軟體,將源程式編譯成目標程式,學習編譯原理有助於理解程式內部如何執行,設計出更高效的程式,同時也有助於除錯程式碼,分析錯誤原因。

  • 原始碼經過詞義分析,語法分析生成語法樹,再經過翻譯生成中間程式碼,編譯器會優化,然後再生成目的碼。這一步工作就是編譯。

  • Compiler vs Interpreter

    Compiler 將源程式轉為目標程式,並輸出錯誤除錯資訊,轉換過程是對所有的程式碼進行轉換並做優化。編譯執行的程式碼更快。

    Interpreter也是將源程式轉為目標程式,但不同的是,轉換過程是一句一句的轉換並且沒有做優化。動態執行易於除錯,可移植性好。

  • Phases of Compiler

    主要分為兩個階段,分別是分析階段和程式碼生成階段。

    分析階段:Source program \(\rightarrow\) Lexical analyzer \(\rightarrow\) Syntax analyzer \(\rightarrow\) Semantic analyzer \(\rightarrow\)

    程式碼生成階段: Intermediate code generator \(\rightarrow\) Code optimizer \(\rightarrow\) Code generator \(\rightarrow\) Target program

  • 編譯過程小例子:position := initial + rate * 60;

    1. Lexical analysis (詞義分析

      • keywords:關鍵詞
      • Identifier: position, initial, rate(識別符號)
      • operator::=, +, *
      • Constant: 60
      • Separators:空格符,tab鍵,換行符
      • Delimiters:(),:;=>;>>
    2. Syntax analysis (語法分析

      生成語法樹,個人感覺有點像中綴表示式對應的樹

    3. Semantic analysis (語義分析

      分析檢查程式中的每個操作是否實際可執行,比如運算子的兩個運算元的型別是否一致(可做型別轉換),if是否有else與其匹配(報錯誤資訊,除錯資訊)etc...

    4. Intermediate code generator

      生成三地址碼(最多三個地址),可以看出和機器指令很接近。

    5. 大致過程如下:

  • Compiler-Construction Tools:

    1. Scanner generator: Lex(生成詞法分析器的工具,輸入是描述詞法分析器的檔案,輸出經過編譯生成詞法分析器)

    2. Parser generator: Yacc(生成語法分析器的工具,同上)

    3. Syntax-directed translation engines

    4. Automatic code generators

    5. Data-flow engines