三个月写的基于JVM的DwKotlinScript编译器

9 篇文章 1 订阅
1 篇文章 0 订阅

最近自己花3个月时间写了个语法类似Kotlin的基于JVM字节码的小编译器,当然比起鼎鼎大名Kotlin编译器我的编译器还是迷你很多的。

写编译器其实就是自己先定义自己编程语言的语法,然后把基于该语法语言的代码转化成你的目标语言,我的目标语言是JVM字节码,还有很多其他目标语言,比如底层的汇编语言,相对高层的JVM字节码,还有更高层的JS代码,甚至你可以写一个从高层语言到高层语言的编译器,比如把Java代码转化成JS代码的编译器。可能有人会问,我能不能写一个从底层语言到高层语言的编译器,理论上可行,但是没人会这么做,因为底层语言对于人类来说复杂难懂,人们不可能本末倒置,写个复杂难懂的底层代码最后转化成通俗易懂的高层语言代码。

来聊聊我定义的语法,语法方面我大量参考了Kotlin的语法设计,实现了Kotlin的基本表达式,像加减乘除取余等运算,支持逻辑运算,比如与或非运算,数字只支持Int,函数定义,变量声明和Kotlin基本一样,但是不支持类与对象,目前只支持一维数组,声明方式和Kotlin类似,所以我的编译器是类似于C语言的面对过程的编程语言,还有我的编译器里面没有main函数,它就是运行代码里面的所有语句,你写了什么就运行什么,这点和JS很像,JS没有main函数,就运行你写的代码。详细的语法介绍你们可以参考文章最后的github仓库的readme介绍。编译器识别后缀为.ks的代码文件,编译为.class的JVM字节码,可以用java命令运行.class文件。

具体语法特性:

首先支持类型推论,声明变量就和Kotlin,JS一样,不需要定于变量的类型,编译器会根据赋值自动推断变量类型。

然后是断句,Java和C里面断句需要分号;否则会报错,我的编译器里断句就和Kotlin与JS一样,分号;不是必要的,分号可以不写。

再就是字符串插值,这个特性很有意思,我是看到Kotlin的打印字符串的语法受到的启发,所谓字符串插值就是可以把表达式直接写到字符串里面而不用打断字符串。例如我定义了变量a和b,a是1,b是2,现在我要打印字符串

print("a is " + a + ", b is " + b + ", a + b is " + a + b);

这是根据Java打印字符串规则打印a是多少b是多少a加b是多少,但是因为支持字符串插值我可以写成这样

print("a is $a, b is $b, a + b is ${a + b}")

字符串能识别里面的以$为前缀的表达式并插入到字符串中。

其他特性:

支持java注释格式的注释,也就是支持// 和 /* */格式的注释。

github地址:https://github.com/wangdong20/DWKotlinScriptCompiler 项目由Maven管理,可以自动引用类库,欢迎点击查看交流star。

来看看运行效果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值