01.從0實現一個JVM語言之架構總覽

01.從0實現一個JVM語言之架構總覽

文章集合以及項目展望html

源碼github倉庫, 若是這個系列對您有幫助, 但願得到您的一個star!

致親愛的讀者:

    我的的文字組織和寫文章的功底屬實通常, 寫的也比較趕時間, 因此係列文章的文字可能比較粗糙,
不免有詞不達意或者寫的很迷惑抽象的地方 

    若是您看了有疑問或者以爲我寫的實在亂七八糟, 這個很抱歉, 確實是個人問題, 您若是有不懂的地方
的地方或者發現個人錯誤(文字錯誤, 邏輯錯誤或者知識點錯誤都有可能), 能夠直接留言, 我看到都會回覆您!

系列食用方法建議

因爲時間緣由, 目前測試並不完善, 因此推薦以下方式根據您的目的進行閱讀

    若是您是學習用, 建議您先將整個項目clone到本地, 而後把感興趣的章節刪除, 本身重寫對照着重寫
    書寫完每一步測試一下可否正常運行(在指定的路徑去讀取源碼測試可否編譯成功並在命令行執行

    java Application(類名)

嘗試可否輸出指望結果, 我沒有研究Junit對編譯器輸出class文件進行測試, 因此目前可能須要您手動測試)

    按照以上步驟, 等您將全部模塊重寫一遍, 大概也對這個系列的脈絡有深入理解了! 若是您重頭開始重寫, 
每每可能因爲出現某些低級錯誤致使長時間debug才找獲得錯誤, 因此對於初學者, 推薦採用本身補寫替換模塊的
方式

    對於但願貢獻代碼的朋友或者對Cva感興趣的朋友, 歡迎貢獻您的源碼與看法, 或者對於該系列一些錯誤/
bug願意提出指正的朋友, 您能夠留言或者在github發issue, 我看到後必定及時處理!

本節提綱

  1. 文章目錄前端

  2. 架構簡介及設想java

文章目錄

00.一個JVM語言的誕生

01.從0實現一個JVM語言之架構總覽

02.從0實現一個JVM語言之詞法分析器-Lexer

03.從0實現一個JVM語言系列之語法分析器-Parser

04.從0實現一個JVM語言系列之語義分析-Semantic

05.從0實現一個JVM語言之目標平臺代碼生成-CodeGenerator

項目架構構想

項目其實已經寫完成了一個能實現簡單功能的框架, 每一個模塊的功能標註以下
若是有地方沒有寫清楚對您形成了困惑, 歡迎留言, 我看到後會回覆!git

├─src
│  ├─main
│  │  ├─go // 暫時被這個小項目遺棄的go們
│  │  │  └─golang
│  │  │      ├─handler
│  │  │      └─main
│  │  ├─java
│  │  │  ├─cn
│  │  │  │  └─misection
│  │  │  │      └─cvac
│  │  │  │          ├─ast // 前端抽象語法樹
│  │  │  │          │  ├─clas // Cva類
│  │  │  │          │  ├─decl // Cva 聲明
│  │  │  │          │  │  └─nullobj // 全部nullobj package都是空對象模式的空對象 下同
│  │  │  │          │  ├─entry // Cva 主類, Cva程序的入口
│  │  │  │          │  ├─expr // Cva 表達式
│  │  │  │          │  │  ├─nonterminal // 非終結符
│  │  │  │          │  │  │  ├─binary // 二元表達式
│  │  │  │          │  │  │  ├─ternary // 三元表達式
│  │  │  │          │  │  │  └─unary // 一元表達式
│  │  │  │          │  │  ├─nullobj // 空對象
│  │  │  │          │  │  └─terminator // 終結符
│  │  │  │          │  ├─method // Cva 方法
│  │  │  │          │  ├─program // Cva 語法樹根節點
│  │  │  │          │  ├─statement // Cva聲明
│  │  │  │          │  │  └─nullobj 
│  │  │  │          │  └─type // Cva類型
│  │  │  │          │      ├─advance // 進階類型, String, array && 指針, 目前只實現了string
│  │  │  │          │      ├─basic // 基礎類型, Java基本類型
│  │  │  │          │      └─reference // 引用類型, 其實string和array也是
│  │  │  │          ├─codegen
│  │  │  │          │  └─bst // backend syntax tree 編譯器後端抽象語法樹
│  │  │  │          │      ├─bclas
│  │  │  │          │      ├─bdecl
│  │  │  │          │      ├─bentry
│  │  │  │          │      ├─bmethod
│  │  │  │          │      ├─bprogram
│  │  │  │          │      ├─btype
│  │  │  │          │      │  ├─advance
│  │  │  │          │      │  ├─basic
│  │  │  │          │      │  └─reference
│  │  │  │          │      └─instructor
│  │  │  │          │          └─write
│  │  │  │          ├─config // 主要是條件編譯的宏常量等
│  │  │  │          ├─constant // 常數池, TODO 將全部常數池以及package-info的常量用枚舉重構
│  │  │  │          ├─io // 文件流讀寫
│  │  │  │          ├─lexer // 詞法分析
│  │  │  │          ├─optimize // 編譯優化
│  │  │  │          ├─parser // 語法分析
│  │  │  │          ├─pkg // Cva包管理
│  │  │  │          └─semantic // 語義分析
│  │  │  └─META-INF // 打包jar入口
│  │  └─resources
│  └─test // 單元測試
│      └─java
│          └─cn
│              └─misection
│                  └─cvac
│                      ├─ast
│                      ├─codegen
│                      │  └─bst
│                      │      └─instructor
│                      ├─lexer
│                      │  └─report
│                      └─unit
└─target
    // ... .class 文件...

以上是對項目源碼各部分的功能解析, 通常的編譯器完成就那麼幾個步驟, 詞法分析, 語法分析, 語義分析,
中間代碼生成, 編譯器優化, 咱們也不能免俗, 文章的章節會大體以這些展開, 以後可能會介紹怎麼去生成
打包文件, 方便製做發行版分發給其餘用戶, 在過程當中若是有你們疑問比較多或者我說的很不詳細的地方,
歡迎你們留言, 若是是大的問題, 我將專門爲其寫一篇隨筆解決這些技術或者配置問題github

因爲方纔才獲悉博客園文章默認不放在首頁的, 原創文章主要經過隨筆顯示, 因此將文章遷移到隨筆;
這篇帖子將後續更新, 歡迎關注! 這段時間要忙着春招實習, 因此項目更新會慢一點,
語言組織也會比較隨意, 畢竟時間有限, 限於我的文筆和水平, 沒辦法太過雕琢了. 若是您有什麼疑問,
或者看到我有什麼錯誤, 歡迎留言指出, 我看到都會回覆!golang

相關文章
相關標籤/搜索