孟岩ID:myan
[修改头像]
1552954次访问,排名6好友1人,关注者32
总是在思考存在的问题
myan的文章
原创 146 篇
翻译 0 篇
转载 3 篇
评论 5196 篇
最近评论
lschou520:怎么会忘记印度、日本和欧洲呢?
daijunhua:支持,中华儿女,互相护持地走!
ranzj:我只抱怨自己的努力不够。
ranzj:我毫不怀疑 SilverLight 是个“钱”途无量的玩意儿。
winvc:还有 之前已经看到过一篇署名孟岩的文章了 也是自称学计算机的 在MOP发的文章 题目是《不知名的程序员写给想学编程的朋友》(最后署名前还特别声明了下自己是初中文化全靠自学的 大哥 这样的人全国有几千万 没几个比你这种货色差的)

那文章是看的我想吐 不知道是你还是重名了 不过咋跟你这篇文章风格这么像呢 都是不懂 逻辑混乱 瞎喷
你是自己想不明白问题 但认为自己想……
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes
文章分类
收藏
    相册
    测试
    友情链接
    老赵的博客
    存档

    原创 Functional Programming应译为“泛函程序设计”

    新一篇: GNU Fortran 95编译器将被融入GCC 3.5中

    一直以来,functional programming在程序设计领域里被翻译为“函数式程序设计”。这种译法非常不精确,所以即使是历来对翻译不太讲究的软件技术界,也不大情愿接受。

    由于在C等语言中,没有过程(procedure),只有函数,所以“函数式程序设计”会令人误解为C所代表的过程化程序设计。与functional programming的本意也有很大的出入。

    Functional programming的本意是,将一个或一组函数作为另一个函数的参数,从而复合出新的函数,以这种方式进行的程序设计,成为functional programming。

    在数学上,以函数为自变量(称为自变函数)的函数,称为泛函。泛函的英文正是functional。比如在弹性力学中,弯曲梁的广义势能M是挠度w的函数,而挠度w又是梁长度x的函数。我们可以说M就是一个泛函。这与Lisp中的functional意义是一致的。

    我建议将functional programming译为“泛函程序设计”,不仅与其数学含义一致,而且与已经得到认可的“泛型程序设计”相对应,利于大家交流。

     

     

    发表于 @ 2004年06月11日 12:12:00|评论(loading...)|编辑

    旧一篇: C语言宏定义中的一个奇技淫巧

    评论

    #g9 发表于2005-03-01 03:34:00  IP:
    TrackBack来自《关于孟岩一扁文章的讨论》

    Ping Back来自:blog.csdn.net
    #大脸猫 发表于2004-06-15 15:59:00  IP: 218.107.132.*
    如果你只是以这个定义来理解泛函或者泛函分析,只能说明你并没有完整的学习过数学系课程实变函数、泛函分析等一系列课程。数学上的泛函分析从重新界定距离的概念开始,引入函数(更好的名称是算子)作为论集范围内的基本元素,然后讨论在这个论集之上的各种性质,试图发现更深入的数学规律。它不仅仅是拿一个函数当作另一个函数的参数这么简单(更加严格的说,这种函数作为参数的情况根本还包含在初等数学范畴内)。实变函数和泛函分析所引入的勒贝格积分,基本测度理论,群理论,彻底的改变了高等数学看问题出发点,使得初等数学中不可解(比如非连续函数的积分问题),所以具有重要意义。

    Functional Programming是最早产生的两种计算模型之一,以Lisp语言为代表,由麦卡希在其著名的70年的论文中提出。其目的是为了从公理化的角度建立计算模型,实质是lambda演算理论的应用。它只有7条初始规则(或称公理),然后由此建立起完备的理论体系。它不同于Fortran提出的编译计算理论的方面在于,它没有背离图灵提出的基本计算理论(Fortran及其后裔如C/C++均背离了这个基本理论),它本质上就是图灵的理论的具体实现,在Lisp语言中经常用来举例的图灵机实现就是一个有力支持。

    至于说道翻译问题,Functional Programming译为函数式程序设计已经很长时间,可以说盖馆定论了(在高校教育中应用了十几年);一方面或许是为了和数学中的泛函理论有所区分,另一方面学习过函数式程序设计理论的人一般也知道英文的原文和确切含义。所以结论应该是:现在更改成为泛函程序设计实在没有什么必要,强行更改只会造成新一轮的概念混淆。
    #myan 发表于2004-06-16 14:51:00  IP: 218.247.132.*
    to 大脸猫:
    我的确没有完整的学习过数学系的课程,因为我本来就不是数学系的学生 :-) 而且连我们本专业的数学基础都忘了不少 :-( 确实需要好好补补。

    看来你对于这方面的理论理解比较深,希望你能正面的、完整的对这个问题谈谈自己的看法。也许是回复的仓促,我并没有从你的三段文字中看到清楚的逻辑。

    另外,关于泛函,我并没有真的研究过,只是有限元法的基础理论中涉及到变分法,里面谈到一点点泛函。对我来说,这是一个非常容易理解的定义,远比你的叙述给我的印象清晰得多。也许这个定义不正确或者不完整,我非常愿意了解到正确的定义。但是你应该给我一个同样清晰的、容易理解的叙述。在你的第一段叙述里,坦白的说我只看到了罗列性的和评价性的文字,没看到任何实质性的东西。

    如果你有兴趣并且有能力把你对于这方面的理解和观点清晰、浅显、朴实地表达出来,我很愿意看到并且推荐给《程序员》杂志。
    #大脸猫 发表于2004-06-16 16:40:00  IP: 218.107.132.*
    OK,我来解释我的话。

    第一段我的意思是强调泛函分析的理论基础和实际作用,当然我似乎用了太多的术语。现在我换一个更加连贯的解释方式。人们在面对不符合黎曼假定的函数(也就说不是传统微积分意义上的连续函数),经典数学分析的理论很多并不适用。这时产生了实变函数论,它以勒贝格测度的形式重新定义了集合的大小这个概念,或者说是给了各种集合一个数的概念。由此人们可以研究广泛的多的实变函数(即以实数为自变量域的函数),它们通常在测度的概念下是可积分的。在实变函数论的基础上,诞生了泛函分析。泛函分析满足了现代数学要求在任意集合之间建立对应关系的要求(初等函数通常在数集上建立对应关系),这里的任意集合可能是初等数集,还可能是高等数学中的向量空间,幂集等等。它首先提出算子的概念,即将一个集合映射到另一个集合的对应关系(初等数学中通常以函数称之),然后将所有算子的集合为抽象空间或者函数空间,一个算子可以看作这个空间里面的一个点,算子的组合即可以看作函数空间中的向量组合。由于算子所作用的集合并没有维数的限制,在函数空间集础上所研究出来算子的各种性质,成为处理用有穷维或者线性空间逼近无穷维集合问题的有力武器。如果从研究方法的角度来说,泛函分析的实质还是古典数学分析理论的一般化,而使用了实变函数论所提出的新的数学武器(将可探求的论域进一步扩大了),函数套函数的做法只是一个现象,不代表本质。

    第二段话我想意思比较明白,毕竟数学的术语我想大家都不太清楚一些。我还想说明的是如同Lisp语言族所代表的正是从数学角度出发的计算模型。“程序与数据等同”,lambda演算,是其中的精髓。从研究方法的角度来说,lambda演算从符号演算的基本理论出发定义了基本计算模型。

    对于你的倡议更改翻译的术语,我报如下的观点:如果现在还没有人翻译过来“函数式编程”,那么我认为你的倡议似乎是一个不错的译法;但是既然已经有了,那么维持现状似乎并不是一个坏主意。

    另外,如果“Functional Programming”没有翻译为中文,到底做何解释好?我不认为“x型程序设计”这样的译文就很合适。原因是首先我们找不到一个很好的译文来表达出隐藏在其背后的基本观点;其次原文也没有从字面上体现出来,它仅仅是用了这种方法中最有特点的东西来命名而已。在这种情况下,个人认为老一辈学者的翻译是比较好的:既然不能做的更好,那就至少不比原文差(这一点上我认为《泛函分析》真的是一个好译法)。

    对于C++的“泛型程序设计”,我也抱有微辞。从其本质上来说,“Generic Programming”和“泛型程序设计”还是有差距的。原文所体现出来的,也仅仅是最通用的做法的罢了(在C++中经常用来实现通用数据结构)。实质上,我想你也会赞同,“Generic Programming”真正的实质是,它将编译期或者说静态语法的能力大大扩充,使得我们可以在这个时期编程,把一些可以在静态语法层面就决定下来的事情决定下来,以提升效率,作为对运行时多态的一个补充。但是这个意思“泛型程序设计”表达出来了吗?我想没有,至少如我一般的很多人,在最开始接触这些概念时,“通用的,四海皆准的程序片断”是第一想法。但是既然这个术语已经出现很长时间,我个人觉得:那还是维持现状好吧!

    我从数学系转到了计算机,也有一段时间了,所以可能数学那部分有些东西仍然说的不清不楚的,请见谅。
    #Solstice 发表于2004-06-11 14:27:00  IP: 202.84.17.*
    支持!
    好译法!
    #周星星 发表于2004-06-11 15:00:00  IP: 218.2.111.*
    :)严谨是做学问的首要态度!
    #皮呷客(PigArk) 发表于2004-06-11 16:04:00  IP: 211.161.162.*
    完全同意!绝对支持!举双手赞成!
    #nomatter 发表于2004-06-11 16:27:00  IP: 220.167.40.*
    支持,坚决支持
    #g9yuayon 发表于2004-06-26 22:53:00  IP: 69.192.42.*
    大脸猫,能不能具体说说为什么C++和Fortran等语言背离了图灵的基本计算理论啊?据我所知,图灵并没有说基本计算理论是以lambda演算为基础的。C++也好,Fortran也好都是Turing complete。也就是说,他们和图灵机的计算模型是等价的。Church-Turing Thesis也说了,一个机械算法(mechanical method)总能被转化为等价的图灵机,反之亦然。图灵的模型并没有规定计算模型具体的操作方式啊(比如说到底一个表达式有没有副作用什么的)。当然,言有易,言无难。所以还请指教一下。:)
    #大脸猫 发表于2004-07-03 21:00:00  IP: 218.107.132.*
    to g9yuayon

    Church-Turing Thesis的确说了,一个机械算法(mechanical method)总能被转化为等价的图灵机。但是这并不是是说一切机械算法都是从图灵计算理论出发的,冯。诺依曼体系结构下的机械算法也可以转化为图灵机,但是它绝对不是图灵计算模型。简言之,就是它们可能是两套完备的体系,都能用来描述世界。

    图灵计算模型,或者说图灵机的精髓在于模拟人的计算过程。一根无限长的纸带,一个读写头和一个状态,就能够模拟人的基本计算过程。在计算的过程中,以一套公理体系为基础,不加以区分程序或者数据。然而,假想一条无限长的纸带是不现实的,计算机尚不能拥有无限的寄存器和内存,因此冯。诺依曼体系以“存储程序”的方式提供一个另外的选择,使得计算机能够被实际制造出来。正是因为计算机的存储限制,程序需要和数据区分开来,才能够在合适的时间调入合适的程序。

    Lisp无疑是最根本遵循图灵计算模型的语言,其本身就是计算公理化的结果。Lisp语言族所注重的是通过统一的数据结构使得程序和数据之间再没有界限(它们都是S表达式),从而能够以公理体系的方式得到演进并解决问题。而从Fortran开始的编译语言采用的模型正是强类型系统,数据结构和算法分离,以及程序与数据分离,追求的是速度和效率。著名的紫皮书中谈到Lisp和Pascal的区别时也说:“Pascal是为了建造金字塔...Lisp是为了建造有机体...”“作为Lisp的内在数据结构,表对于这种可用性起着重要的提升作用...”“采用100函数在一个数据结构上操作,远远优于采用10个操作在十个数据结构上工作”“金字塔矗立在那里千年不变,而有机体则必须演化,否则就会消亡”。

    OK,结论就是,我说C++和Fortran等语言背离了图灵的基本计算理论,并不是说它们有什么不好的地方,它们正是最贯彻执行了冯。诺依曼这一经典体系结构的东西。但是在讨论到函数式编程的时候,如果不这样区分清楚,就根本不能触及到函数式编程的本质。
    #fsht 发表于2004-12-09 17:03:00  IP: 218.192.126.*
    我也是从数学系转到了计算机,看到大脸猫的大论,佩服啊,向大脸猫学习。
    #黄冈 发表于2004-12-30 06:19:00  IP: 68.34.199.*
    我个人认为数学中最主要的idea大都是很符合人类的直观的。从而,我赞成从抓住数学idea的最直观意义来着手。换句话,对某个数学思想,你能够记住的部分,就是它最符合人类直觉的部分。

    孟岩对泛函的提法,我认为是比较合理的。最朴素的泛函概念来源于伯努利和牛顿的变分法,而此一方法的提出则是归因于最速降线问题的解决。这是真实的历史,也就是问题推动的方式。当然,调和分析(把复杂函数分解成简单/正交函数的线性组合)也是一个重要的发端。

    至于大脸猫说的从实变函数到泛函分析,我想这是泛函分析的成熟阶段和抽象阶段了。实际上它并不能反映泛函最基本的思想。

    我们国内的数学教科书大多数过于严谨,过于模仿布尔巴基的风格。而缺乏对基本思想发展的交代。这固然能够让大家的思想很严谨,但是不能让大家领略事物发展的真实过程。更严重的,面对美轮美奂的数学大厦,大家成了没有自信的应声虫。

    如果我们知道牛顿的微积分并不是建立在严格的极限定义基础上,是不是我们会自信的多?的确,国内有少数教材是先讲微积分再讲极限的。

    很多思想的提出都是由于解决实际问题的需要,而从开始的朴素思想进化到严谨的理论,则是要经过许多人上百年的努力。

    大家不妨看看牛顿的 原理 和 傅立叶的 热的解析。就会发觉,这些伟大的思想在最初提出的时候,都是很粗糙的。

    好的数学教师应该对数学问题,思想的历史脉络十分了解。固然我们不大可能把教科书写成牛顿原理那样的松散结构,然而,教师在课堂里面,完全可以提出原始问题--尝试用最直觉方式解决--介绍历史发展梗概--给出完备理论的方式来教学。很可惜的是,国内具有这样素养和认识的老师还不多见。

    顺便提一句,我在数学方法论上是倾向于 牛顿 - poincare 这个路子的, 比较喜欢用直觉和,几何形象思维。 而不太喜欢 莱布尼茨 - hilbert-布尔巴基这条代数,严密化的路子。虽然这两种路子是缺一不可的,也是可以互相印证的。

    关于这个名词的译法,我想二者都可以,你译为泛函,实际上绝大多数人并不会去考究它的真实含义。只要,在提到这个名词的同时,加上一个简短的注释也就可以了。名字是重要的,但是如果光有名字,而不能加以解释,同样让人无从理解。

    在计算机中,我理解 数据就是能够在存储器中能够被不加运算存取的实体。而 函数是需要经过运算存取的实体。这样来看,所谓函数,不过是间接的数据罢了。

    一个题外话,面前国内数学教学强调证明的风气很重,往往一节课都是抽象的证明,而学生只能被动跟着。而往往对证明也是缺乏透彻的理解。我推荐大家看看MIT Gilbert Strang 教授讲的线性代数录像,看看什么是真正重要的数学内容:
    http://web.mit.edu/18.06/www/Video/video-fall-99-new.html.
    老先生上课基本没有严谨的证明,但是基本的数学思想都是通过例子和短而不严谨的说明来介绍的。从这里或许可以看出国内数学教学不太成功的一个原因。

    #g9yuayon 发表于2005-03-01 03:35:00  IP: 199.246.40.*
    还是不太明白为什么大脸猫说Imperative语言违背了图灵机的计算模型。

    冯.诺依曼的模型并不是计算模型吧?它只是计算模型的一种具体实现而已。而且可以说这个模型恰恰有效率地实现了图灵机的计算模型。简单对比一下,两者都依赖于状态的改变。我记得图灵机不就是用读写头去改变带子上的状态么?而带子上的状态也可以指示读写头到底怎么操作。这个和冯的模型完全一致吧:存储单元里的数据既可以是纯的数据,也可以是指示机器操作的命令。只不过一台冯。诺依曼机器有两条带子,一条读写数据,一条模拟操作。不过我们在本科学了图灵机后第一作业不就是证明两条带子的图灵机和一条带子的图灵机完全等价么? 其实看我们证明不同类型图灵机等价问题时用的方法,基本就是模拟。也就是说,带子上的数据配合读写头的移动模拟了某个计算。这也是纯粹的状态改变嘛。机器里的存储单元恰恰模拟了图灵机里无限长的带子。看不出有什么公理系统在背后呢?所以把冯的理论和图灵的理论对立起来说不过去。而且图灵机模型里面哪里提到了完全依赖公理,不分数据和操作的(不是质问,而且请教哈。)?能不能提供一篇论文以做佐证啊?再说到语言层面,imperative的语言,C++也好,Fortran也好,都是依靠改变系统的状态来进行计算的,所以也不存在违背图灵机原理一说吧?再回过来看Lambda理论,倒真是建立在几个简单的公理上,而且强调不依靠状态改变来进行计算。当然,Lambda caulucs和图灵机也是等价的。我总觉得大脸猫说的是“背离了图灵机计算”应该改成“背离了Lambda Calculus的理论”才对的说。
    #jijidao 发表于2005-04-17 03:43:00  IP: 213.105.224.*
    看到大家讨论functional programming,我也很感兴趣,不过不知道现在FP在实际中优美有甚么运用呢?如果没有,这样的语言不就是没有意义的?
    #baiyanning 发表于2006-02-25 08:55:00  IP: 61.50.187.*
    --在数学上,以函数为自变量(称为自变函数)的函数,称为泛函。
    对于中学所学的函数而言,其自变量和因变量都是数,所以说函数建立了一种数到数的映射关系;对于泛函而言,因变量仍然必须是一个数,但是自变量的范围得到了扩充,可以是矢量,矩阵,函数,级数等等。函数的自变量只能是一个数,相当于是在一维空间上进行分析;泛函对自变量进行了扩充,导致自变量可能是无限维空间中的一个元素(比如无穷级数),因此泛函分析也被成为无限维空间上的分析学。在无限维空间上,很多概念与有限维空间有极大的不同,个人认为这才是泛函分析的核心与魅力所在。
    “以函数为自变量(称为自变函数)的函数,称为泛函。”这也是我在学习泛函分析这门课之前对泛函概念的理解,忘了是从哪里听过来的了,后来还在宿舍中跟同学们大谈过这一概念,现在想来真是惭愧。
    我是学电子工程的,方向是信号处理,研究生期间选学的泛函分析这门课,深为它的魅力所吸引,那个学期一半的时间基本上都花在这门课上了。从中加深了我对很多概念的理解:最小二乘法不就是求空间中一个向量到另一个向量的投影向量之间的距离嘛;傅里叶变换之所以能够统治整个线性时不变分析领域不就是因为它是所有线性时不变算子的特征向量嘛......
    "Functional Programming"的概念我并不知道,但是根据孟老师的解释:“Functional programming的本意是,将一个或一组函数作为另一个函数的参数,从而复合出新的函数,以这种方式进行的程序设计,称为functional programming。”个人觉得“泛函程序设计”的翻译是合适的。但我以为,如果"Functional Programming"是指某种语言所包含的各种有形实体(占用存储器空间,如值变量,函数等等)都可以作为函数的参数,那么称作Functional Programming才更为合适,也更符合"functional"的本意。:)
    个人的一点浅薄见解,欢迎赐教。
    #mathjp 发表于2006-06-05 15:10:00  IP: 218.79.61.*
    我到是从计算机转到了数学~~~
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 孟岩