从零开始开发jvm语言(零)
发布日期:2021-08-31 01:31:17 浏览次数:2 分类:技术文章

本文共 1707 字,大约阅读时间需要 5 分钟。

hot3.png

目录

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

相信作为IT工作者,都会有“实现一个自己的编程语言”的想法吧?

我也有这样的想法。

在一个无聊的下午突发奇想,要是能有一种编程语言,它能够重载运算符,学习成本低,语法简洁,最好能模拟各种dsl,敲击键盘次数少,编译到jvm字节码并且能够完美的与java互通该多好

当时觉得scala语法太过复杂(虽然不难但是容易出错),groovy的运算符重载有限,kotlin不错,但他的运算符绑定规则甚至不能用在BigInteger上,难免产生一些重复类库。

所以,在搞定了手上正在做的项目后,开始了编译器之旅。


先上一个视频,看看Latte长什么样

这是一个语法高亮的截图

Latte长什么样

这是它的Maven坐标,如果你想把Latte当作脚本,用这个会非常方便

org.latte-lang
latte-lang
LATEST

这个系列讲述了我在开发Latte语言的一系列历程。重点并不在编译原理和算法,但是包括了某些关键的工程实现思路。如果是想学习编译原理,建议看一些理论书籍。如果是想写一个编译器,相信这系列文章会派上用场。

顺便 求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语言(一)开始,我将会把这个语言的实现思路和过程分享给大家,同时也推广一下我的编译器项目,希望多多支持哦~

转载于:https://my.oschina.net/wkgcass/blog/685090

转载地址:https://blog.csdn.net/weixin_34056162/article/details/91921337 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Spring配置事务的五种方式
下一篇:易客 给脸不要脸,那我只好开扒图片了

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月03日 12时35分50秒