论坛首页 综合技术版 Erlang

探讨一下数据驻留模型

浏览 9618 次
该帖已经被评为良好帖
作者 正文
时间:2008-04-28
下面我谈一下我的理解:

正如刚才所谈到的, 实际上图灵机在解决 io 问题时必须纳入到冯诺依曼体系或其它如哈佛体系等进行研究, 那么在使用 lambda 演算解决 io 问题时, 我想我们同样需要将 lambda 演算放到一个计算机体系里来看.

在图灵机处理时它有一个纸带, 关机后下次再开机可以接着运行. 那么在 lambda 体系如果要做到同样的事情,我们或许需要:

放一个一次写多次读的纸带, 以便将函数保存下来.下次从此处再开启运算即可.

需要注意的是, 和图灵机里的纸带不同, 这个纸带是供控制器用的, 而不是给运算器用的, 不是 lambda 演算的标配.

不知道我这样说能不能解释的通.
   
0 请登录后投票
时间:2008-04-28
图灵机和 lambda 演算都是一种数学模型,拿来描述抽象的计算过程的,它们的本质是描述一个定义在字符集合上的函数。最好不要把一个图灵机对应于一台实际存在的机器或是实际机器中的一个部件,这么做貌似能够帮助理解,实际上只会带来混乱。
   
0 请登录后投票
时间:2008-04-29
T1 兄久不回应, 考虑到马上要放假了, 我急不可耐的公布最后结论:

erlang vm 实际上是一个函数式语言的虚拟机, 其体系大概可以理解为以 lambda 演算为运算器, 自己实现了控制器.

我们编写的代码, 如 fun() -> 1+1 这种指令由运算器执行, 而 receive 指令则由控制器执行, 当调用 receive 后, 控制器就将函数挂起, 挂起的实质是将函数写到控制器用的内存, 当有输入(input)后, 控制器恢复函数.

关于挂起的解释:

函数式语言巧妙之处体现在函数持有自己的上下文(参数栈, 闭包), 由于函数的这个有趣特性, 我们可以将函数(连同它的上下文)转到另一个机器上执行.

挂起后, 函数的上下文全部放在此函数私有的内存中. 需要注意的是, 挂起意味着这轮演算已经彻底完结, 而不是暂停.

btw. 在函数式语言中, 函数可理解为数据, 数据也可以理解为函数, 故函数是可以持久化的.

关于收数据后的解释:

控制器负责将输入数据填在下次调用的函数上下文中(编译时确定填在哪个内存位置),之后再次恢复现场. 在这个步骤, 控制器将会操作记录在内存上的函数的上下文.之后调用内存中的函数. 这次调用是重新启动新的演算, 而不是继续上次的演算.

例:
(- 1) 的过程, 编译之后的伪代码大致如:
mov param1, 1   // 填写函数上下文(参数) 由控制器执行
mov func1, (- param1)         // 负运算. 由运算器执行. 过程是调用负函数.
// 运算器执行完后, 产生(归约?)出一个新的函数(这次是一个数字) -1, 放于 func1 处, 由运算器执行
mov out, func1    // 输出函数


一个(+ 1 1) 的过程
mov param1, 1   // 填写函数上下文(参数) 由控制器执行
mov func1,(+ 1)           // 按第一个参数展开函数, 由运算器执行. 按函数式程序原理, (+ a b) 解释为 ((+ a) b). 
mov param2, 2   // 填写函数上下文(参数) 由控制器执行
mov func2,((+1) 2)         // 加法运算. 由运算器执行.
mov out, func2  // 输出函数


一个有 receive 的加法机演算过程

receive         // 收取数据
mov param1, input   // 填写函数上下文(参数) 由控制器执行, 设 input = 1
mov func1,(+ 1)           // 按第一个参数展开函数, 由运算器执行. 按函数式程序原理, (+ a b) 解释为 ((+ a) b). 
receive
mov param2, input   // 填写函数上下文(参数) 由控制器执行, 设 input = 2
mov func2,((+1) 2)          // 加法运算. 由运算器执行.
mov out,func2      // 输出函数


需要注意的是,一次函数归约实际上会对应若干条指令, 这里这样写只是为了突出控制器和运算器的合作关系.

可以说, 图灵机的模型只记忆纸笔运算中的数据, 而 lambda 演算则连带每一步公式推导都记下来了, 这样看来 lambda 演算似乎更适合符号处理问题.
   
0 请登录后投票
论坛首页 综合技术版 Erlang

跳转论坛:
JavaEye推荐