从零开始开发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,但愿多多支持哦~