fbpx

為程式語言建構虛擬機器

低階直譯的要點

從這 4.5 小時的課程,你會學到

  • 虛擬機器的實現
  • 基於堆疊與基於暫存器的虛擬機器
  • 位元組碼( Bytecode  )直譯器
  • 編譯器的構造
  • 呼叫堆疊和堆疊框架
  • 低階的直釋
  • 物件導向的程式設計
  • 函數( Functional  )程式設計
  • 閉包( Closures  )實現
  • 垃圾收集
  • 標記-清掃( Mark-Sweep ) 垃圾收集
  • 瞭解程式語言如何在引擎蓋下工作
  • 位元組碼( Bytecode  )最佳化

要求

課程說明

課程概覽

程式語言如何在引擎蓋下工作?編譯器和直譯器之間有什麼區別?什麼是虛擬機器,以及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

報名參加課程更新 coupon code

Sponsored by Udemy

讓 LN+ 協助你提升 udemy 線上課程的使用體驗

LN+ 會幫助你將課程影片與 notion 筆記關聯起來,所以你也不用去煩惱筆記在哪裡?或是要如何整理寫過的筆記

來自使用者的真實體驗

除此之外, LN+ 也可以幫助你提升觀看 udemy 課程體驗,有興趣可以參考以下的文章說明

LN+ 是 chrome 瀏覽器的外掛程式,是 Soft & Share 針對線上課程平台不足的地方所開發出來的輔助工具,可到 chrome 應用程式商店安裝安裝後不需要輸入信用卡,可以免費測試一週如果覺得好用再決定是否付費,收費方式可以參考這個網頁說明

以下的影片示範你會看到透過 LN+ 的幫助,讓 notion 筆記視窗跟你在觀看的課程影片同步切換

幫我們個小忙!

使用 e-mail 追蹤 Soft & Share

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料

Powered by WordPress.com.

Up ↑

%d 位部落客按了讚: