使用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,代码补全和项目管理还是太弱,写起来好难受。 

posted @ 2018-03-20 21:38  banxiangzideren  阅读(1195)  评论(0编辑  收藏  举报