目錄java
友情提示,可跳過本篇直接看(一)python
相信做爲IT工做者,都會有「實現一個本身的編程語言」的想法吧?c++
我也有這樣的想法。git
在一個無聊的下午突發奇想,要是能有一種編程語言,它可以重載運算符,學習成本低,語法簡潔,最好能模擬各類dsl,敲擊鍵盤次數少,編譯到jvm字節碼而且可以完美的與java互通該多好github
當時以爲scala語法太過複雜(雖然不難可是容易出錯),groovy的運算符重載有限,kotlin不錯,但他的運算符綁定規則甚至不能用在BigInteger上,不免產生一些重複類庫。算法
因此,在搞定了手上正在作的項目後,開始了編譯器之旅。編程
先上一個視頻,看看Latte
長什麼樣 戳我swift
這是一個語法高亮的截圖
閉包
這是它的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的強制縮進。
既然要可讀,那麼還得遵守主流編程語言留下的「約定」。因而乎
這些是最終定下的比較有趣的特性,那些和java重複的沒寫在這兒。
有的在設計之初定下的特性本來想作後來以爲沒用或者看起來過於醜陋便放棄了,有的是後來修改的,有的特性是開發時突發奇想加上去的。
整個過程就是迷茫,思考和喜悅的交織。不管是知識仍是閱歷都收穫了不少。最終,歷時3個多月 (彷佛有點慢啊:( 總算是作出了第一個ALPHA版本,完成了全部計劃之初的設計,外加一個語法高亮和一個簡易的IDE。
從從零開始開發jvm語言(一)
開始,我將會把這個語言的實現思路和過程分享給你們,同時也推廣一下個人編譯器項目Latte,但願多多支持哦~