TypeScript (以下簡稱 TS)是一個非常強大的語言,其編譯器源碼超過 10000 行。
源碼在 Github 可以找到:https://github.com/Microsoft/TypeScript/tree/master/src/compiler
基礎概念
只讀(immutable)對象
TS 源碼大量應用了只讀對象來提升解析性能。只讀對象即一個普通對象,但無法修改其內部任意屬性,如果需要修改,則必須創建一個新的副本。
這個設計使得程序可以只在需要的時候再處理對象,並且把處理的結果緩存起來。因為對象是只讀的,所以緩存的數據始終是正確的,不會因為對象更改導致緩存失效。
編譯器概念
通用的編譯器都需要了解以下概念:
- 語法樹(Abstract Syntax Tree):表示源碼的基本結構。所有提到編譯器原理的地方都會提到語法樹,這里不多解釋。
- 符號(Symbol):符號表示是一個變量、一個字段或一個函數之類屬於“定義”范疇的概念,符號一般會屬於某個詞法作用域(Scope),且符號可以計算其類型。
- 類型(Type):表示一個數值類型,類型擁有父類型、子成員。
- 流程分支(FlowNode):表示代碼從上往下執行的分支情況,通過流程分支可以掌握到從頭到當前位置的執行步驟,當然也可以檢測到無法執行的代碼(比如 return 之后的代碼)。
- 函數簽名(Signature):表示一個函數的一種參數方式,通過簽名可以確定函數的參數類型和返回類型。一個函數可以有多個簽名。
教程見:https://www.cnblogs.com/xuld/p/12180913.html 。