从零开始开发jvm语言(零)
2016-05-31 19:02
267 查看
摘要: 编译器 JVM语言
目录
从零开始开发JVM语言(一)Latte
从零开始开发JVM语言(二)词法分析
从零开始开发JVM语言(三)特殊的Token结构
从零开始开发JVM语言(四)四则运算
从零开始开发JVM语言(五)语法分析
从零开始开发JVM语言(六)语法分析的坑
从零开始开发JVM语言(七)语义分析的起步
从零开始开发JVM语言(八)从类型定义开始的语义分析
从零开始开发JVM语言(九)验证有效性
从零开始开发JVM语言(十)指令与InvokeDynamic
从零开始开发JVM语言(十一)Lambda
从零开始开发JVM语言(十二)重载方法的选择
从零开始开发JVM语言(十三)代码生成与ASM
从零开始开发JVM语言(十四)Evaluator,REPL 与 Script
友情提示,可跳过本篇直接看(一)
相信作为IT工作者,都会有“实现一个自己的编程语言”的想法吧?
我也有这样的想法。
在一个无聊的下午突发奇想,要是能有一种编程语言,它能够重载运算符,学习成本低,语法简洁,最好能模拟各种dsl,敲击键盘次数少,编译到jvm字节码并且能够完美的与java互通该多好
当时觉得scala语法太过复杂(虽然不难但是容易出错),groovy的运算符重载有限,kotlin不错,但他的运算符绑定规则甚至不能用在BigInteger上,难免产生一些重复类库。
所以,在搞定了手上正在做的项目后,开始了编译器之旅。
先上一个视频,看看
戳我
这是一个语法高亮的截图
这是它的Maven坐标,如果你想把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
从零开始开发JVM语言(二)词法分析
从零开始开发JVM语言(三)特殊的Token结构
从零开始开发JVM语言(四)四则运算
从零开始开发JVM语言(五)语法分析
从零开始开发JVM语言(六)语法分析的坑
从零开始开发JVM语言(七)语义分析的起步
从零开始开发JVM语言(八)从类型定义开始的语义分析
从零开始开发JVM语言(九)验证有效性
从零开始开发JVM语言(十)指令与InvokeDynamic
从零开始开发JVM语言(十一)Lambda
从零开始开发JVM语言(十二)重载方法的选择
从零开始开发JVM语言(十三)代码生成与ASM
从零开始开发JVM语言(十四)Evaluator,REPL 与 Script
友情提示,可跳过本篇直接看(一)
相信作为IT工作者,都会有“实现一个自己的编程语言”的想法吧?
我也有这样的想法。
在一个无聊的下午突发奇想,要是能有一种编程语言,它能够重载运算符,学习成本低,语法简洁,最好能模拟各种dsl,敲击键盘次数少,编译到jvm字节码并且能够完美的与java互通该多好
当时觉得scala语法太过复杂(虽然不难但是容易出错),groovy的运算符重载有限,kotlin不错,但他的运算符绑定规则甚至不能用在BigInteger上,难免产生一些重复类库。
所以,在搞定了手上正在做的项目后,开始了编译器之旅。
先上一个视频,看看
Latte长什么样
戳我
这是一个语法高亮的截图
这是它的Maven坐标,如果你想把Latte当作脚本,用这个会非常方便
<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,希望多多支持哦~
相关文章推荐
- 浅谈汇编器、编译器和解释器
- 让我们做个简单的解释器(三)
- 让我们做个简单的解释器(一)
- 用 350 行代码从零开始,将 Lisp 编译成 JavaScript
- 基于JSP编译器基本语法的使用详解
- C#命令行编译器配置方法
- Java虚拟机JVM性能优化(二):编译器
- AngularJS HTML编译器介绍
- 实现接口时@Override注解问题
- 条款06:若不想使用编译器自动生成的函数,就该明确拒绝
- g++编译 参数 .
- 关于 ndk和jni的区别
- vim中的杀手级插件: YouCompleteMe
- Google C++ unit test 在ARM Android 2.3 上的编译与使用
- 从代码示例了解ECMAScript5新特性
- Java的可移植性受到广泛使用
- C++ .H .CPP
- Windows Server 2003远程桌面多用户连接问题
- centos下安装nginx