阅读王垠《怎样写一个解释器》一文后的一些体会

来源:互联网 发布:sql update多条数据 编辑:程序博客网 时间:2024/05/21 08:46

http://www.yinwang.org/blog-cn/2012/08/01/interpreter 怎样写一个解释器

R2语言实现了表达式解释器,支持单变量let绑定、函数调用、函数作为参数传递(对于FP解释器而言这实际上不是问题),讲解了文法作用域与闭包的概念。

缺点:直接利用了Racket语言的match语言,这有点偷懒,不过作者确实也说了不考虑parser的一些琐碎问题,比如优先级、歧义处理什么的。

另外,继承自LISP的[(? number? x) x][`(,e1 ,e2) ... 什么的,让人看着很不爽。

下面是我真正想说的一些东西:

 
(1)闭包捕获的是函数定义时的环境,而不是调用时的。解决了函数定义里的自由变量在调用时如何获取的问题。

(2)但是,对于解释型的脚本语言,区分文法作用域和动态作用域有点奇怪。难道说编译型语言是静态作用域?但是前者也支持JIT啊

(3)这样的话,推论:JIT解决的其实上是函数内的自由变量的运行时、也就是调用时的查找效率问题

(4)比如说,支持FP+OOP的一些脚本语言,比如Python、Ruby、JavaScript,对于类的成员方法,称method而不是function的,其隐式this实际上就可以认为是这里的函数的自由变量。所以JIT的重点就在于优化自由变量的查找效率,这个说法看起来一点问题都没有。令人豁然开朗。

(5)考虑到C++当初发明出来的时候,所谓的C++编译器实际上就是一个CFront前端转换宏程序,它将C++成员方法里的隐式this转换成了C语言里的显式参数。C/C++这类静态作用域语言实际上不支持闭包,——直接引用全局变量只能被看作动态作用域。
0 0
原创粉丝点击