阅读王垠《怎样写一个解释器》一文后的一些体会
2016-05-27 12:30
323 查看
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++这类静态作用域语言实际上不支持闭包,——直接引用全局变量只能被看作动态作用域。
相关文章推荐
- 深入理解PHP之匿名函数
- 最后一次说说闭包
- Ruby中使用Block、Proc、lambda实现闭包
- LUA中的闭包(closure)浅析
- Lua中的闭包学习笔记
- 编程界主流脚本编程语言的比较和选择
- 什么是Perl?编程语言Perl详细介绍
- C#中函数的创建和闭包的理解
- 编程语言里的静态、动态、强类型、弱类型等概念介绍
- 简要解读Ruby面向对象编程中的作用域
- 编程趣事:当下流行编程语言的”讨厌”程度排行榜
- JavaScript 学习笔记之变量及其作用域
- 聊一聊JavaScript作用域和作用域链
- 深入理解javascript作用域和闭包
- javascript作用域和闭包使用详解
- 谈谈JavaScript中的函数与闭包
- 细品javascript 寻址,闭包,对象模型和相关问题
- 深入浅析JavaScript中的作用域和上下文