使用Java实现一门简单的动态语言
原文地址:https://www.cnblogs.com/estrigriac/p/8612860.html
2018.8.4更新:
用Java写起来还是太繁琐了,直接用Python重写了。https://github.com/gcnyin/compiler
这次正确地实现了静态作用域,还添加了另外几门玩具语言。
原文:
项目地址:https://github.com/gcnyin/toy-lang
学习了EOPL后,不禁想自己写一门语言,同时还想学习下如何用静态类型语言实现动态类型语言,所以就选择了Java来写。
目前只写了后端,前端部分其实也可以手写,但之前已经写得够多了,再写下去也无法提高水平,而目前还不会使用Antlr这样的工具,所以就先不写了,反正也很简单。
最终的效果是这样的:
let x = 200 in let f = proc (z) -(z,x) in let x = 100 in let g = proc (z) -(z,x) in -((f 1), (g 1))
总结一下:
一、实现了“动态作用域”而非“静态作用域”。EOPL中将env传入exp中后,可以立即将identifier替换为绑定的值,能这样做是因为Scheme的动态性,所以Java做不到。目前的实现里,只能将exp完全展开后再进行idetifier的替换,那么后面的绑定覆盖了前面的绑定,所以成为了“动态作用域”。
二、体会到了Java实现动态语言的痛点,再也不想用动态类型语言来实现动态类型语言了。编写过程中,经常需要使用反射或者增加字段来确定运行时某一变量的类型,并做大量的强制类型转换。这样写完后自己感到很别扭,但问了下开源哥,好像也没有什么太好的办法了。
三、写大点的项目还是用Java好,有IDEA的加成,还有那么多可用的工具。瞧瞧DrRacket,代码补全和项目管理还是太弱,写起来好难受。