以图灵的方式编程

  程序的设计模式往往与计算机的体系结构有很大关系,以函数作为协议的主要表现方式,语言具有简单严格的语法结构,应该与冯·诺依曼体系,或者更准确的说与代码线性循序执行的方式不无关系。

  冯·诺依曼体系是图灵机的实现,但从实现之初,两者便无多大交集,图灵机具有理想性质,是不考虑控制和执行成本的,而冯·诺依曼机器,最初的程序设计对计算成本是非常关注的,而且按照图灵机思想设计的程序,转换成通常的程序,会比较复杂而且显得不直观。正如lex与bison生成的程序代码,我们只会认为程序是对的,而很少会去阅读。

  以控制机器的思想设计程序,是图灵机程序设计的主要方式,而对于计算细节(主要是比较运算)和控制细节(主要是条件转移)的实现则基本不予关注。以机器的思想设计程序,以机器的思想而不是以库函数的方式构建系统的结构,其实在编译、业务逻辑表示、流程等很多方面都可以让问题得到简化。而用于执行的程序本身,则如数据一样,可以动态动态组装、动态执行。

  在本质上冯·诺依曼体系与图灵机并无大的区别,但在形式上却有比较大的区别,可以这样说,图灵机侧重规则的描述,而冯·诺依曼体系编程则侧重于规则的执行,在计算机的计算能力受限制的过去,我们关注于执行,关注于算法。而今我们是否是更应关注于我们所要解决的问题,及其这些问题的上下文,以及解决这些问题相关知识的描述。

  现在我们试着以图灵机的方式书写一个程序,掀开面纱,看看她的真容:

/*
 因为真实的图灵机过于原始,为方便编程,在程序中做了以下约定:
 1、图灵机有输入的条带,有输出的条带。
 2、非特别指定,匹配动作只在输入条带上执行。
 3、非特别指定,打印只在输出条带上执行。
 4、预定义匹配: =,>,< .。 
    =,>,< 操作语义,与序列比较的含义一致。
. 不匹配条件。 5、预定义状态:s0, e0 ,f0 s0 表示开始状态。 e0 表示正常结束状态。如未有跟随的动作,则自动在输出条带上打印字符 '1'。 f0 表示非正常结束状态。如未有跟随的动作,则自动在输出条带上打印字符 '0'。 6、预定义动作: -> <- # -> 表示条带指针右移一格。 <- 表示条带指针左移一格。 # 表示把输入条带当前指定的内容,打印到输出条带上,同时输出条带的指针右移。 ? 对整个输出条带的数据,做相应的转换。 7、句型: 定义: <标志符> <参数> <参数> ... 句子: <当前状态> <匹配表达式> <下一状态> <动作> <动作> ...
--: 函数用 '--' 间隔
*/ //>=操作 !>= x ------------- s0 x e0 s0 >x e0 -------------- //<=操作 !<= x -------------------------- s0 x e0 s1 <x e0 ------------------------- //范围操作 !.. x y --------------------------- s0 x e0 s0 y e0 s0 >x n1 n1 <y e0 --------------------------- //字母 !letter -------------------------- s0 'a'..'z' e0 s0 'A'..'Z' e0 -------------------------- //数字 !digital -------------------------- s0 '0'..'9' e0 -------------------------- //字母数字 !letterdigital ---------------------------- s0 letter e0 s0 digital e0 ---------------------------- //标志符 !indent ---------------------------- s0 letter n1 -> # n1 letterdigital n1 -> # n1 . e0 <- ?string ---------------------------- //数字 !number ---------------------------- s0 digital n1 -> # n1 digital n1 -> # n1 '.' n2 -> # n1 . e0 <- ?int n2 digital n2 -> # n2 'e' n3 -> # n2 'E' n3 -> # n3 digital n3 -> # n2 . e0 <- ?double n3 . e0 <- ?double ----------------------------

  

  上面只是一个伪程序,但可以看出,这样的编程方式比较适合于以规则为主体的各种应用,比如编译、业务规则、业务流程等方面,同时作为自动机的控制输入也是比较合适的。 

 

posted @ 2012-09-21 13:17  走在溪边  阅读(2308)  评论(0)    收藏  举报