|
@@ -62,6 +62,17 @@ output(sqrt(2), square(sqrt(2)))
|
|
|
|
|
|
## 即时解释式虚拟机
|
|
## 即时解释式虚拟机
|
|
|
|
|
|
|
|
+第一个实现照例先做一个最朴素的, 就像第一节的四则运算器一样, 之后再用业界常用手段来做.
|
|
|
|
+
|
|
|
|
+这样的一个虚拟机实现起来非常简单, 只需要记录当前已定义的函数, 就是全部的运行环境了, 函数调用时先看参数里有没有指定的函数, 然后找到就用, 找不到就再往上看, 都找不到就报错. 上面的语法里, 虽然有函数参数, 但是函数参数是不可变的, 也是无类型的, 因此这样的代码也并没有超出框架
|
|
|
|
+
|
|
|
|
+```
|
|
|
|
+add_one(x) = x + 1
|
|
|
|
+g(f, x) = f(f(x))
|
|
|
|
+add_two(x) = g(add_one, x)
|
|
|
|
+
|
|
|
|
+output(add_two(1))
|
|
|
|
+```
|
|
|
|
|
|
## 鸣谢
|
|
## 鸣谢
|
|
|
|
|
|
@@ -73,7 +84,7 @@ output(sqrt(2), square(sqrt(2)))
|
|
|
|
|
|
上节写的「在JavaScript里实现的同样功能的解析器和虚拟机」先叉掉
|
|
上节写的「在JavaScript里实现的同样功能的解析器和虚拟机」先叉掉
|
|
|
|
|
|
-上面的语言非常函数式, 以及同样有对应的几乎一比一等价的 C++ 模板表示, 当然现在有更简化的 constexpr 了, 这种奇技淫巧能用的地方减少了很多, 以前用起来模板元, 起手一个递归式2333.
|
|
|
|
|
|
+上面的语言非常函数式, 以及同样有对应的几乎一比一等价的 C++ 模板表示, 当然现在有更简化的 constexpr 了, 这种奇技淫巧能用的地方减少了很多, 以前用起来模板, 起手一个递归式2333.
|
|
## 下节预告
|
|
## 下节预告
|
|
|
|
|
|
- 基于栈或者基于寄存器的虚拟机
|
|
- 基于栈或者基于寄存器的虚拟机
|