從零開始開發jvm語言(零)

目錄java

  1. 從零開始開發JVM語言(一)Latte
  2. 從零開始開發JVM語言(二)詞法分析
  3. 從零開始開發JVM語言(三)特殊的Token結構
  4. 從零開始開發JVM語言(四)四則運算
  5. 從零開始開發JVM語言(五)語法分析
  6. 從零開始開發JVM語言(六)語法分析的坑
  7. 從零開始開發JVM語言(七)語義分析的起步
  8. 從零開始開發JVM語言(八)從類型定義開始的語義分析
  9. 從零開始開發JVM語言(九)驗證有效性
  10. 從零開始開發JVM語言(十)指令與InvokeDynamic
  11. 從零開始開發JVM語言(十一)Lambda
  12. 從零開始開發JVM語言(十二)重載方法的選擇
  13. 從零開始開發JVM語言(十三)代碼生成與ASM
  14. 從零開始開發JVM語言(十四)Evaluator,REPL 與 Script

友情提示,可跳過本篇直接看(一)python

相信做爲IT工做者,都會有「實現一個本身的編程語言」的想法吧?c++

我也有這樣的想法。git

在一個無聊的下午突發奇想,要是能有一種編程語言,它可以重載運算符,學習成本低,語法簡潔,最好能模擬各類dsl,敲擊鍵盤次數少,編譯到jvm字節碼而且可以完美的與java互通該多好github

當時以爲scala語法太過複雜(雖然不難可是容易出錯),groovy的運算符重載有限,kotlin不錯,但他的運算符綁定規則甚至不能用在BigInteger上,不免產生一些重複類庫。算法

因此,在搞定了手上正在作的項目後,開始了編譯器之旅。編程


先上一個視頻,看看Latte長什麼樣 戳我swift

這是一個語法高亮的截圖
Latte長什麼樣閉包

這是它的Maven座標,若是你想把Latte看成腳本,用這個會很是方便jvm

<dependency>
    <groupId>org.latte-lang</groupId>
    <artifactId>latte-lang</artifactId>
    <version>LATEST</version>
</dependency>

這個系列講述了我在開發Latte語言的一系列歷程。重點並不在編譯原理和算法,可是包括了某些關鍵的工程實現思路。若是是想學習編譯原理,建議看一些理論書籍。若是是想寫一個編譯器,相信這系列文章會派上用場。

順便github 求watch求star~嘿嘿~


##取名

就算普通項目也得有個名字,編譯器可不是小工程,天然須要一個代號。 我一開始取名爲LessTyping,意爲「更少的打字」,理解爲「少那麼一點類型」也能夠,畢竟它是靜態動態類型混合的。(groovy也是,對於規定類型的地方和java字節碼並沒有差異,對於沒有規定的就是反射取各類值)。發佈時感受這個名字太長,音節也太多,周圍朋友也表示不像編程語言的名字。這個語言能夠內嵌在java中,也能夠與java無縫結合,語言特性也與java一致。因此更名爲Latte,拿鐵+咖啡。

##設計

第二步是語言的設計。先得有個概念,它大概長什麼樣

既然要少敲字符,並且可讀性還不能低,那麼「結束符」統統去掉(不是文法的結束符,只是一般意義的結束語句用的符號),僅僅爲了編譯方便的輔助字符統統去掉

最後光禿禿的,怎麼知道塊結構呢?怎麼消除歧義呢?因而我借鑑了python的強制縮進。

既然要可讀,那麼還得遵守主流編程語言留下的「約定」。因而乎

  • 借鑑了python的縮進
  • 包名借鑑了c++的命名空間
  • 繼承和實現借鑑了c++的冒號
  • 構造函數借鑑了scala的構造函數寫法
  • 變量使用了js/python無需專門定義符號便可定義,也借鑑了scala的val做爲final的替代
  • 方法定義借鑑了scala,等號後接返回值
  • 運算符使用了綁定而不是重載,這樣學習成本低不少並且解析方便。綁定的名稱借鑑了BigDecimal/BigInteger方法名
  • 借鑑了swift的「..」並依據scala的until/to設計了合理的range
  • 借鑑了groovy的dsl寫法(不帶括號的方法調用/不帶括號地使用逗號分割參數)
  • 借鑑了閉包。作了不太同樣的內部方法和「過程」(能夠捕獲任意參數,但對於本地變量,內部不會影響外面)
  • 借鑑了java8 lambda的思路設計了比j8更好的lambda(容許abstract類使用lambda)
  • 借鑑了c的define/undef,不過最好小範圍使用
  • 還有好多有趣的特性

這些是最終定下的比較有趣的特性,那些和java重複的沒寫在這兒。

有的在設計之初定下的特性本來想作後來以爲沒用或者看起來過於醜陋便放棄了,有的是後來修改的,有的特性是開發時突發奇想加上去的。

整個過程就是迷茫,思考和喜悅的交織。不管是知識仍是閱歷都收穫了不少。最終,歷時3個多月 (彷佛有點慢啊:( 總算是作出了第一個ALPHA版本,完成了全部計劃之初的設計,外加一個語法高亮和一個簡易的IDE。

從零開始開發jvm語言(一)開始,我將會把這個語言的實現思路和過程分享給你們,同時也推廣一下個人編譯器項目Latte,但願多多支持哦~

相關文章
相關標籤/搜索