Contents
低階直譯的要點
從這 4.5 小時的課程,你會學到
- 虛擬機器的實現
- 基於堆疊與基於暫存器的虛擬機器
- 位元組碼( Bytecode )直譯器
- 編譯器的構造
- 呼叫堆疊和堆疊框架
- 低階的直釋
- 物件導向的程式設計
- 函數( Functional )程式設計
- 閉包( Closures )實現
- 垃圾收集
- 標記-清掃( Mark-Sweep ) 垃圾收集
- 瞭解程式語言如何在引擎蓋下工作
- 位元組碼( Bytecode )最佳化
要求
- 基礎C++
- 基本資料結構(map、列表、堆疊、樹)。
- “從頭開始建立一個直譯器 “課(如果需要的話)
課程說明
課程概覽
程式語言如何在引擎蓋下工作?編譯器和直譯器之間有什麼區別?什麼是虛擬機器,以及JIT-編譯器?函數語言程式設計和指令式程式設計之間的區別又是什麼呢?
當涉及到實現一種程式語言時,有太多的問題了!
學校裡的 “編譯器課程 “的問題是,這類課程通常被表述為一些 “硬核火箭科學”,只適合高階工程師。
此外,經典的編譯器書籍從最不重要的話題開始,如詞法分析,直接進入形式化語法的理論層面。而到了實現第一個 Tokenizer 模組的時候,學生就會對這個主題失去興趣,沒有機會真正開始實現一種程式語言本身。而這一切都被分散到整個學期的標記器和 BNF 語法的混亂中,而沒有理解程式語言的實際語義。
我相信我們應該能夠在4-6個小時內建立並理解一個完整的程式語言語義,內容直奔主題,在現場編碼課程中以配對程式設計的方式展示,並以可理解的方式描述。
在建構虛擬機器課程中,我們特別關注執行時語義,並為一種非常類似於 JavaScript 或 Python 的程式語言建構一個基於堆疊的虛擬機器。透過與位元組碼( Bytecode )級別的緊密合作,你將瞭解今天生產的虛擬機器中低階的直譯是如何工作的。
實現一種程式語言也會使你在其他程式語言中的實踐水平更加專業。
前提條件
這門課有兩個先決條件。
建構虛擬機器課程是前一門課的自然延伸–從頭開始建立一個直譯器(又稱解釋要點),在這門課上,我們也建構了一個完整的程式語言,但在更高的 AST 級別。除非你已經瞭解了程式語言在這個層次上的工作方式,即什麼是 eval、閉包( closure )、範圍鏈( scope chain )、環境和其他結構,否則你必須把直譯器課程作為先決條件。
此外,如果要進入生產虛擬機器所在的低階(位元組碼)層次,我們需要有基本的 C++ 經驗。然而,這門課不是關於 C++ 的,所以我們只使用非常基本的(可轉移的)其他語言結構。
請觀看介紹影片瞭解詳情。
這門課適合誰?
這門課是為任何好奇的工程師準備的,他們想獲得建構複雜系統的技能(建構程式語言是一項高階工程任務!),並獲得建構此類系統的可轉移知識。
如果你對編譯器、位元組碼直譯器、虛擬機器和原始碼轉換特別感興趣,那麼本課也適合你。
用什麼來實現?
由於低階的虛擬機器是關於效能的,它們通常用低階的語言來實現,如 C 或 C++。這也正是我們所使用的,但主要是來自 C++ 的基本功能,而不是分心到 C++ 的具體內容。程式碼應該很容易轉換和移植到任何其他語言,例如 Rust 或甚至更高階的語言,如 JavaScript–利用型別化的陣列來模仿記憶體概念。使用C++也使得進一步實現 JIT-編譯器更加容易。
注意:我們希望我們的學生能夠真正遵循、理解並自己實現虛擬機器的每一個細節,而不是僅僅從最終解決方案中複製貼上。儘管在影片講座中介紹了該語言的完整原始碼,但專案的程式碼庫中包含/在此實施/作業,學生必須解決這些問題。
這門課有什麼具體內容?
這些講座的主要特點是。
- 簡明扼要,直奔主題。每個講座都是自成一體,簡明扼要,描述與主題直接相關的資訊,不會在不相關的材料或講座上分散注意力。
- 動畫演示與現場編輯筆記相結合。這使得對主題的理解更加容易,並顯示出物件結構是如何連線的。靜態的幻燈片對複雜的內容根本不起作用。
- 現場編碼會議端到端,有作業。完整的原始碼,從零開始,一直到最後都在影片講座中呈現
課程中有哪些內容?
該課程分為五個部分,共29個講座,每個講座都有許多子課題。下面是內容和課程表。
第一部分:虛擬機器基本操作
在這一部分,我們描述了編譯和直譯管道,開始建構我們的語言。討論了堆疊和暫存器虛擬機器、堆分配的物件和位元組碼的編譯等主題。
第二部分:控制流程和變數
在這一部分中,我們實現了控制流程結構,如 if 表示式和 while 迴圈,討論了全域性物件和全域性變數、巢狀塊和區域性變數,還實現了一個反組譯器。
第3.1部分。函式和呼叫堆疊
在這一部分,我們開始討論和實現函式抽象和函式呼叫。我們描述了呼叫棧的概念,本地和使用者定義的函式,以及IIL(立即呼叫的 lambda 表示式)。
第3.2部分:閉包的實現
在這一部分中,我們重點討論閉包的實現,談論範圍和 escape 分析,捕獲自由變數,以及為閉包新增執行時支援。
第四部分:垃圾回收
這一部分專門討論被稱為垃圾收集的自動記憶體管理。我們討論了跟蹤堆和實現Mark-Sweep垃圾收集器。
第五部分:物件導向程式設計
在最後一部分,我們增加了對物件導向程式設計的支援,實現了類別和實體。此外,我們還建構了最終的虛擬機器可執行程式。
目標受眾
- 任何好奇的工程師
- 程式語言的實現者
講師簡介
Dmitry Soshnikov 軟體工程師和講師 ( 更多講師線上課程介紹 )
Dmitry Soshnikov 是一名軟體工程師,也是一名有不同於電腦科學主題的講師。
他對教育充滿熱情,注重高品質的教育內容: 簡明扼要,並使用現場編輯筆記的動畫講座。
你會從 Dimitry 的課程學到:
- 編譯器和直譯器: 建立一個程式語言
- 垃圾收集器(自動記憶體管理)
- 程式設計語言理論
- Automata Theory: Building a RegExp machine
- 自動機理論: 建立一個 RegExp 機器
- 解析器理論: 實現一個編譯器編譯程式
英文字幕:有
- 想要了解如何將英文字幕自動翻譯成中文? 請參考這篇 How-To