以图灵的方式编程
程序的设计模式往往与计算机的体系结构有很大关系,以函数作为协议的主要表现方式,语言具有简单严格的语法结构,应该与冯·诺依曼体系,或者更准确的说与代码线性循序执行的方式不无关系。
冯·诺依曼体系是图灵机的实现,但从实现之初,两者便无多大交集,图灵机具有理想性质,是不考虑控制和执行成本的,而冯·诺依曼机器,最初的程序设计对计算成本是非常关注的,而且按照图灵机思想设计的程序,转换成通常的程序,会比较复杂而且显得不直观。正如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
----------------------------
上面只是一个伪程序,但可以看出,这样的编程方式比较适合于以规则为主体的各种应用,比如编译、业务规则、业务流程等方面,同时作为自动机的控制输入也是比较合适的。