编程语言背后的数学原理
首先,这个话题太厚重了,水平还远远达不到系统阐述它的能力,只是对最近零碎感悟以及学习所得的一点汇集。(大家谁有好的书或资料推荐一下?)
因为对.NET平台熟一点,所以命令式语言就以c#为例,函数式语言就以fsharp为例。
最近对函数式编程语言有些兴趣,通过网上资料,书籍了解了一些FP语言:像微软的fsharp以及haskell,与以前一直使用的命令式语言有许多的不同(当然一些语言既可以让你以命令式语言的思维去编写,又提供FP的编程范式,最明显的莫过于javascript了),这些不同之处体现在以下一些方面
immutable 不可变对象,(简单的说immutalbe就是一定声明定义后就不能更改其值了)在FP里immutable对象是主流,是默认的(当然像fsharp提供关键字可以让你定义可变对象),不同于c#等编程语言,虽然它们提供readonly,const等关键字让你定义immutable对象,但这种定义过程是可选的,在命令式语言的世界里mutable是主流。
很自然的会想,FP为什么会这样呢,是出于一种什么理念这么去实现?
原来是因为 “λ演算”(读作lambda演算),更准确的说正是为存在lambda演算这种形式系统,才会诞生FP,FP只是lambda演算的实践。以下是wiki里关于lambda演算的定义
λ演算(lambda calculus)是一套用于研究函数定义、函数应用和递归的形式系统。它由阿隆佐·邱奇和他的学生斯蒂芬·科尔·克莱尼在20世纪30年代引入。邱奇运用λ演算在1936年给出判定性问题(Entscheidungsproblem)的一个否定的答案。这种演算可以用来清晰地定义什么是一个可计算函数。关于两个lambda演算表达式是否等价的命题无法通过一个“通用的算法”来解决,这是不可判定性能够证明的头一个问题,甚至还在停机问题之先。Lambda演算对函数式编程语言有巨大的影响,比如Lisp语言、ML语言和Haskell语言。
从简单一点的角度去说就是对一个已存在的object赋值,命令式语言的处理方式就像我们人脑一样直观,简单的给它赋予新值就行了(当然像string这样从性能考虑需要interned的例外)而函数式语言则是应用一个函数到object上返回一个新的object,被作用的对象本身是没有状态改变的。
在知道了函数式语言和lambda演算的关系后,我就想像c#这种命令式语言背后也存在那么一个形式系统吗?
网上搜一下,真有,听着还很耳熟,那就是“图灵机”。
以下摘自wiki
图灵机,又称确定型图灵机,是英国数学家阿兰·图灵于1936年提出的一种抽象计算模型,其更抽象的意义为一种数学逻辑机,可以看作等价于任何有限逻辑数学过程的终极强大逻辑机器。
因为对.NET平台熟一点,所以命令式语言就以c#为例,函数式语言就以fsharp为例。
最近对函数式编程语言有些兴趣,通过网上资料,书籍了解了一些FP语言:像微软的fsharp以及haskell,与以前一直使用的命令式语言有许多的不同(当然一些语言既可以让你以命令式语言的思维去编写,又提供FP的编程范式,最明显的莫过于javascript了),这些不同之处体现在以下一些方面
immutable 不可变对象,(简单的说immutalbe就是一定声明定义后就不能更改其值了)在FP里immutable对象是主流,是默认的(当然像fsharp提供关键字可以让你定义可变对象),不同于c#等编程语言,虽然它们提供readonly,const等关键字让你定义immutable对象,但这种定义过程是可选的,在命令式语言的世界里mutable是主流。
很自然的会想,FP为什么会这样呢,是出于一种什么理念这么去实现?
原来是因为 “λ演算”(读作lambda演算),更准确的说正是为存在lambda演算这种形式系统,才会诞生FP,FP只是lambda演算的实践。以下是wiki里关于lambda演算的定义
λ演算(lambda calculus)是一套用于研究函数定义、函数应用和递归的形式系统。它由阿隆佐·邱奇和他的学生斯蒂芬·科尔·克莱尼在20世纪30年代引入。邱奇运用λ演算在1936年给出判定性问题(Entscheidungsproblem)的一个否定的答案。这种演算可以用来清晰地定义什么是一个可计算函数。关于两个lambda演算表达式是否等价的命题无法通过一个“通用的算法”来解决,这是不可判定性能够证明的头一个问题,甚至还在停机问题之先。Lambda演算对函数式编程语言有巨大的影响,比如Lisp语言、ML语言和Haskell语言。
从简单一点的角度去说就是对一个已存在的object赋值,命令式语言的处理方式就像我们人脑一样直观,简单的给它赋予新值就行了(当然像string这样从性能考虑需要interned的例外)而函数式语言则是应用一个函数到object上返回一个新的object,被作用的对象本身是没有状态改变的。
在知道了函数式语言和lambda演算的关系后,我就想像c#这种命令式语言背后也存在那么一个形式系统吗?
网上搜一下,真有,听着还很耳熟,那就是“图灵机”。
以下摘自wiki
图灵机,又称确定型图灵机,是英国数学家阿兰·图灵于1936年提出的一种抽象计算模型,其更抽象的意义为一种数学逻辑机,可以看作等价于任何有限逻辑数学过程的终极强大逻辑机器。
图灵的基本思想是用机器来模拟人们用纸笔进行数学运算的过程,他把这样的过程看作下列两种简单的动作:
在纸上写上或擦除某个符号;
把注意力从纸的一个位置移动到另一个位置;
图灵机,名字听着很高级啊,原来就是用机器模拟人脑做题 -_-b 当然这是个很通俗的说法,其背后所蕴含的数学知识,至少我是看那7个符号就已经晕了,等缓一缓再深入下。
ok,现在我们有了两组对应关系
图灵机:c, c#,java,等等
lamda演算: lisp, scheme, haskell, fsharp等等
那是否存在更多的计算模型或是形式系统及其实现了它们的编程语言呢?网上继续搜。。。。 还真有
更多部分请参见 http://www.yyliuliang.cn/posts/programming-language-underlying-math-theories-part-one/
posted on 2010-06-26 14:38 yyliuliang 阅读(1681) 评论(1) 编辑 收藏 举报