为什么函数式编程没有流行起来?

为什么函数式编程没有流行起来?,第1张

但是对于很多编写应用程序的编程人员来说,函数式编程仍显得那么陌生和遥远。对此Confusion在tweakblognet上发起了一场关于“为什么函数式编程语言没有流行起来”的大讨论。Confusion认为函数式编程语言之所以没有流行起来,原因是其文档及示例都显得过于复杂难懂,让人望而却步:软件工程领域的一些权威对于函数编程(functional programming——FP)事实上不怎么流行深表遗憾。支持者这一观点的人通常责怪听众短视或其老板无能,认为不同意他们意见的人根本不懂函数式编程为何物。而这反过来却可能说明一点:他们没有给出恰当的解释。我想限制FP语言被采用的实际原因是:真正吸引大家的是函数式编程语言的一些优点,但是这些优点并没有被很好地阐述和示例。同样,这些解释和样例在说服软件工程师方面显得非常失败,因为它们没有回答软件工程师们在日常工作中所关心的问题。 接着Confusion用一个有关定义reduce的例子进一步说明了这一点:(reduce f x) nil = x(reduce f x) (cons a l) = f a ((reduce f x) l)……这很抽象,多数人并不熟悉。可是,FP语言的文档只包含了这类非常数学化的例子。难道没有人写一个用来证明FP强大功能的宠物店的例子吗?这才是我们大多数人的常规工作。 对于Confusion的这一看法,引来了众多读者的讨论,大家就这一问题纷纷发表了自己的看法。 RayNbow对于FP例子过于抽象的看法就表达了不同意见:斐波纳契数列(Fibonacci )的例子(还有阶乘)通常被用作说明语言语法的具体例子。因为函数式编程语言以函数为中心,还有什么更好的方法展示如何定义它们的么?你可以把斐波纳契数列和阶乘的例子看作函数世界的Hello World。 Tubbie认为FP的特长就在于计算方面,因此编写数据库或用户界面应用的程序员根本不需要使用它:FP支持者之所以展示计算例子,是因为FP擅长此道。问题是大多数程序员每天编写的大多数代码都是关于与数据库、用户界面等交互的,并不包含复杂的数学运算或算法。FP语言是非常不同的的语言,如果只解决边界条件问题,就不需要学习它。 Dooievriend非常赞同Tubbie的说法:……我很喜欢函数式语言,它非常适合解决要解决复杂的运算问题。……但是关于用它来构建GUI并访问数据库,我没有任何思路。对我来说,只在复杂和经常变化的问题出现时,才会用到FP,但它是嵌入到其他语言中使用。这是FP语言应被使用的方式,我至少知道Mercury是这么用的…… 有不少人表示同意Dooievriend的这一说法,他们认为只有混合了命令式语言(imperative languages )与函数式语言(Ffunctional languages )才能做到两全其美。就函数式语言没有很好的说明和例子这一说法,虽然Morton也表示同意,但是他并不认为FP没有流行起来:……我没觉得FP不流行。我经常发现同事在代码中使用了函数模式,可是他们自己都没有意识到。现在也很难找到不支持FP的语言。在Java和Net都开始支持FP概念的时候,你们居然还担心FP不流行。 Alex更是现身说法,说自己已经把函数式编程当作了“秘密武器”:你的意思是还没人写出一篇能让人信服的说明函数编程好处的文章吗? …… 我和我的团队已经用F#开发了一个稳定的、现实的、商用的业务应用,而且已经被大公司买走了。函数式编程最成功之处是,根据任务的特性,代码量可以减少4到10倍,对此我十分确信,因为我们用F#重写了一些老代码,所写的代码也更加易于维护和扩展。 因此,它给了我们竞争优势。或许说服不了大多数人对我们来说是好事:),我们已经拥有这一秘密武器了。 虽然大家看法各不相同,但是有一点可以看得出来,函数式编程特长和优点是大家有目共睹的。

python的用途:

python也是一门程序语言。能写各种各样的程序。

优点:

1支持OOP编程从根本

上讲Python仍是一种面向对象的语言,支持多态、继承等高级概念,在Python里使用OOP十分容易没有C++、Java那样复杂,但不必做Python下OOp高手,够用即可。

2免费Python的使用是完全免费的,您可以从网络上免费下载、安装使用,Python上的其他程序包,也可下载安装使用。Python的免费的同时又有很多的的社区对用户的提问提出快速的技术支持,学习和使用Python技术不再是一个人在战斗!

3可移植性Python的实现是用ansic编写的,可以运行在目前所有主流平台上,手机、pad上均可运行Python程序,其下的程序包也具有可移植性。

4功能强大从特性的观点上看,Python是一个混合体,他丰富的工具集使得他介于传统的脚本语言和系统语言之间。

设计定位

Python的设计哲学是"优雅"、"明确"、"简单"。因此,Perl语言中"总是有多种方法来做同一件事"的理念在Python开发者中通常是难以忍受的。Python开发者的哲学是"用一种方法,最好是只有一种方法来做一件事"。

在设计Python语言时,如果面临多种选择,Python开发者一般会拒绝花俏的语法,而选择明确的没有或者很少有歧义的语法。由于这种设计观念的差异,Python源代码通常被认为比Perl具备更好的可读性,并且能够支撑大规模的软件开发。这些准则被称为Python格言。在Python解释器内运行importthis可以获得完整的列表。

Python开发人员尽量避开不成熟或者不重要的优化。一些针对非重要部位的加快运行速度的补丁通常不会被合并到Python内。所以很多人认为Python很慢。不过,根据二八定律,大多数程序对速度要求不高。在某些对运行速度要求很高的情况,Python设计师倾向于使用JIT技术,或者用使用C/C++语言改写这部分程序。可用的JIT技术是PyPy。

Python是完全面向对象的语言。函数、模块、数字、字符串都是对象。并且完全支持继承、重载、派生、多继承,有益于增强源代码的复用性。Python支持重载运算符和动态类型。相对于Lisp这种传统的函数式编程语言,Python对函数式设计只提供了有限的支持。有两个标准库(functools,itertools)提供了Haskell和StandardML中久经考验的函数式程序设计工具。

虽然Python可能被粗略地分类为"脚本语言"(scriptlanguage),但实际上一些大规模软件开发计划例如Zope、Mnet及BitTorrent,Google也广泛地使用它。Python的支持者较喜欢称它为一种高级动态编程语言,原因是"脚本语言"泛指仅作简单程序设计任务的语言,如shellscript、VBScript等只能处理简单任务的编程语言,并不能与Python相提并论。

Python本身被设计为可扩充的。并非所有的特性和功能都集成到语言核心。Python提供了丰富的API和工具,以便程序员能够轻松地使用C语言、C++、Cython来编写扩充模块。Python编译器本身也可以被集成到其它需要脚本语言的程序内。

因此,很多人还把Python作为一种"胶水语言"(gluelanguage)使用。使用Python将其他语言编写的程序进行集成和封装。在Google内部的很多项目,例如GoogleEngine使用C++编写性能要求极高的部分,然后用Python或Java/Go调用相应的模块。

优点

简单:Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读英语一样。它使你能够专注于解决问题而不是去搞明白语言本身。

易学:Python极其容易上手,因为Python有极其简单的说明文档 [10]  。

易读、易维护:风格清晰划一、强制缩进

用途广泛

速度快:Python 的底层是用 C 语言写的,很多标准库和第三方库也都是用 C 写的,运行速度非常快。 [7] 

免费、开源:Python是FLOSS(自由/开放源码软件)之一。使用者可以自由地发布这个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。FLOSS是基于一个团体分享知识的概念。

高层语言:用Python语言编写程序的时候无需考虑诸如如何管理你的程序使用的内存一类的底层细节。

可移植性:由于它的开源本质,Python已经被移植在许多平台上(经过改动使它能够工作在不同平台上)。这些平台包括Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE、PocketPC、Symbian以及Google基于linux开发的android平台。

解释性:一个用编译性语言比如C或C++写的程序可以从源文件(即C或C++语言)转换到一个你的计算机使用的语言(二进制代码,即0和1)。这个过程通过编译器和不同的标记、选项完成。

运行程序的时候,连接/转载器软件把你的程序从硬盘复制到内存中并且运行。而Python语言写的程序不需要编译成二进制代码。你可以直接从源代码运行 程序。

在计算机内部,Python解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行。这使得使用Python更加简单。也使得Python程序更加易于移植。

面向对象:Python既支持面向过程的编程也支持面向对象的编程。在“面向过程”的语言中,程序是由过程或仅仅是可重用代码的函数构建起来的。在“面向对象”的语言中,程序是由数据和功能组合而成的对象构建起来的。

Python是完全面向对象的语言。函数、模块、数字、字符串都是对象。并且完全支持继承、重载、派生、多继承,有益于增强源代码的复用性。Python支持重载运算符和动态类型。相对于Lisp这种传统的函数式编程语言,Python对函数式设计只提供了有限的支持。有两个标准库(functools, itertools)提供了Haskell和Standard ML中久经考验的函数式程序设计工具。

可扩展性、可扩充性:如果需要一段关键代码运行得更快或者希望某些算法不公开,可以部分程序用C或C++编写,然后在Python程序中使用它们。

Python本身被设计为可扩充的。并非所有的特性和功能都集成到语言核心。Python提供了丰富的API和工具,以便程序员能够轻松地使用C语言、C++、Cython来编写扩充模块。Python编译器本身也可以被集成到其它需要脚本语言的程序内。因此,很多人还把Python作为一种“胶水语言”(glue language)使用。使用Python将其他语言编写的程序进行集成和封装。在Google内部的很多项目,例如Google Engine使用C++编写性能要求极高的部分,然后用Python或Java/Go调用相应的模块。《Python技术手册》的作者马特利(Alex Martelli)说:“这很难讲,不过,2004 年,Python 已在Google 内部使用,Google 召募许多 Python 高手,但在这之前就已决定使用Python,他们的目的是 Python where we can, C++ where we must,在 *** 控硬件的场合使用C++,在快速开发时候使用 Python。”

可嵌入性:可以把Python嵌入C/C++程序,从而向程序用户提供脚本功能。

丰富的库:Python标准库确实很庞大。它可以帮助处理各种工作,包括正则表达式、文档生成、单元测试、线程、数据库、网页浏览器、CGI、FTP、电子邮件、XML、XML-RPC、HTML、WAV文件、密码系统、GUI(图形用户界面)、Tk和其他与系统有关的 *** 作。这被称作Python的“功能齐全”理念。除了标准库以外,还有许多其他高质量的库,如wxPython、Twisted和Python图像库等等。

规范的代码:Python采用强制缩进的方式使得代码具有较好可读性。而Python语言写的程序不需要编译成二进制代码。Python的作者设计限制性很强的语法,使得不好的编程习惯(例如if语句的下一行不向右缩进)都不能通过编译。其中很重要的一项就是Python的缩进规则。一个和其他大多数语言(如C)的区别就是,一个模块的界限,完全是由每行的首字符在这一行的位置来决定(而C语言是用一对花括号{}来明确的定出模块的边界,与字符的位置毫无关系)。通过强制程序员们缩进(包括if,for和函数定义等所有需要使用模块的地方),Python确实使得程序更加清晰和美观。

高级动态编程:虽然Python可能被粗略地分类为“脚本语言”(script language),但实际上一些大规模软件开发计划例如Zope、Mnet及BitTorrent,Google也广泛地使用它。Python的支持者较喜欢称它为一种高级动态编程语言,原因是“脚本语言”泛指仅作简单程序设计任务的语言,如shellscript、VBScript等只能处理简单任务的编程语言,并不能与Python相提并论。

做科学计算优点多:说起科学计算,首先会被提到的可能是MATLAB。除了MATLAB的一些专业性很强的工具箱还无法被替代之外,MATLAB的大部分常用功能都可以在Python世界中找到相应的扩展库。和MATLAB相比,用Python做科学计算有如下优点:

● 首先,MATLAB是一款商用软件,并且价格不菲。而Python完全免费,众多开源的科学计算库都提供了Python的调用接口。用户可以在任何计算机上免费安装Python及其绝大多数扩展库。

● 其次,与MATLAB相比,Python是一门更易学、更严谨的程序设计语言。它能让用户编写出更易读、易维护的代码。

● 最后,MATLAB主要专注于工程和科学计算。然而即使在计算领域,也经常会遇到文件管理、界面设计、网络通信等各种需求。而Python有着丰富的扩展库,可以轻易完成各种高级任务,开发者可以用Python实现完整应用程序所需的各种功能。

曾经很喜欢折腾,至少用过有40多个数学软件,包括几乎所有出名的和一些不出名的,大型的中型的。其中3M(Matlab、Mathematica、Maple)用的较多,一些浅见:

Matlab

线性代数和数值计算方面优势显著,

向量化运算往往比同类软件更快,

拥有超多工具箱,仿真,图像处理,信号处理,金融,统计,优化

程序语言比较易学,编辑和调试环境不错

方便构建GUI

不是原生支持符号计算(符号计算远不止是推导公式),新版的mupad内核还不错,但是和Mathematica、Maple比有明显差距,不论是深度、广度和速度

递归特别慢,比Mathematica和Maple以及常见的脚本语言都慢

在一些数学领域相对薄弱,如数论,图论,离散数学等

高精度和大数计算比较慢(如精确计算100万的阶乘或π的前500万位)

工具箱之间的协作能力不是很好

界面不太好看(新版R2013a的Ribbon界面不错)

缺省画图不美观,锯齿,系统函数命名不够规范

Mathematica

符号计算非常强大,可解的方程类型最广泛

非常强大和灵活的语言,完成相同的工作,和同类语言相比代码量往往最少

语言高度统一,支持相当多的编程范式,过程式、函数式、元编程,逻辑编程、基于规则

循环比较慢,可以用Compile加速,或使用Map、Table、Nest等代替循环

许多内置函数具备AAS机制(AutomaticAlgorithmSelection)

擅长高精度和大数计算,

图形方面的函数很丰富,默认画图比Matlab和Maple更好看

界面美观,输入公式很方便

帮助文档很友好

价格较高,比matlab更贵(Matlab的价格取决于你要哪些工具箱)

向量化的 *** 作比Matlab稍慢,有时比Matlab更耗内存

代码调试不是很方便,但可以用Wolfram Workbench(基于Eclipse的IDE)改善

程序语言学习曲线陡峭,排除熟悉Scheme、Haskell等函数式语言或者作为高级计算器使用的人

(Mathematica的语法和常见的过程式程序语言有较大不同,虽然也可以作为过程式语言来用,但代码的和速度和优雅程度就大打折扣了)

Maple:

符号计算非常强大,和Mathematica相比各有千秋

许多多项式 *** 作比Mathematica更快

一些符号积分Maple也有速度优势(特别是不定积分),不过有时返回的结果没有Mathematica给出的更严谨、鲁棒性好,能算的积分类型没有Mathematica多

Maple的“适应性”更好,有的问题Mathematica需要一定的预处理才能算的更快,得出满意的结果

Maple更擅长(偏)微分方程,(其实Maple和Mathematica都能解一些对方解不了的一些特殊微分方程)

可以带步骤求解一些问题,Mathematica需要第三方的Package或借助WolframAlpha

上手较快,一些常见的 *** 作无需命令,通过右键菜单就能完成

界面有点卡(基于Java swing),经典界面流畅但是很土

自带的代数方面的package比较丰富

化简能力,不等式求解,逻辑系统较Mathematica逊色一些

数值计算总体上比Matlab和Mathematica差一些

高精度和大数计算方面强于Matlab弱于Mathematica

统计方面有些薄弱

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12156458.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存