關於外部無法訪問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;
-
Lexical analysis (詞義分析
- keywords:關鍵詞
- Identifier: position, initial, rate(識別符號)
- operator::=, +, *
- Constant: 60
- Separators:空格符,tab鍵,換行符
- Delimiters:(),:;=>;>>
-
Syntax analysis (語法分析
生成語法樹,個人感覺有點像中綴表示式對應的樹
-
Semantic analysis (語義分析
分析檢查程式中的每個操作是否實際可執行,比如運算子的兩個運算元的型別是否一致(可做型別轉換),if是否有else與其匹配(報錯誤資訊,除錯資訊)etc...
-
Intermediate code generator
生成三地址碼(最多三個地址),可以看出和機器指令很接近。
-
大致過程如下:
-
-
Compiler-Construction Tools:
-
Scanner generator: Lex(生成詞法分析器的工具,輸入是描述詞法分析器的檔案,輸出經過編譯生成詞法分析器)
-
Parser generator: Yacc(生成語法分析器的工具,同上)
-
Syntax-directed translation engines
-
Automatic code generators
-
Data-flow engines
-