计算化学公社

标题: 各种编程语言的优劣 [打印本页]

作者
Author:
scf    时间: 2015-5-20 23:20
标题: 各种编程语言的优劣
Fortran vs C++
胶水语言 Python
3M (Mathematica, Matlab, Maple)
大家各抒己见吧

作者
Author:
sobereva    时间: 2015-5-21 03:48
这个话题是永恒的导火索
作者
Author:
Shannon    时间: 2015-5-21 04:54
没用过Fortran, 只用过c++,指针什么的特烦人还不用不行,简直丧病。 面向对象的设计C++确实非常不错,查找程序模块容易。
3M 在科研中用来写代码 最好不过, 调试方便,但和python的胶水性质比起来就大不如了。
比如matlab, 对java程序能很好的黏起来, 和C++混编 问题 一大堆,挑编译器, 各种无端跳出.,外来的库文件直接用经常出问题。
作者
Author:
sobereva    时间: 2015-5-21 06:08
不同语言各有所长,没有前提放一起比也不公平,这里只针对科学计算进行讨论。

搞科学计算,Fortran和C必会其一,能写出独立的程序,而另一个语言也得能读能改。

对于纯粹科学计算目的,Fortran相对于C有极大好处,是我坚决拥护Fortran的理由:
1 隐式声明万岁!
2 不需要写分号、花括号
3 很少需要用到那些C中看着就心烦的指针
4 不用各种include
5 变量不区分大小写
6 动态声明数组很方便
7 矩阵、向量运算极为方便
8 语法没C那么过度自由,读别人的程序容易

总的来说,Fortran比C易学、易写、易读得多,运算效率与之基本持平(或更高),编译器广泛,是纯粹科学计算的人的首选。主流量化程序>=3/4、主流动力学程序约一半都是Fortran开发的。

我眼里简单、简洁、高效、该有的都有就是美,Fortran正满足这一点。但不同的人有不同个性,有些用C的人就是喜欢C,或者以前学的是C又不想再学别的,我也并不表示否定的态度。


Python那东西,在我实际研究中从没觉得有用它的任何必要,所有涉及编程的事情Fortran都能很好解决。有些人第一门语言学Python,我看决不如学Fortran(若是需要写的代码不涉及密集运算,并且就是喜欢Python的风格倒也罢)。

至于C++,对于纯粹科学计算相比C改进的意义不大(大部分情况而言),塞进的一大堆面向对象概念导致学习起来困难,代码更难读。这个问题在另一个帖子《面向对象的编程思想是否会成功的应用于计算科学领域》(http://bbs.keinsci.com/forum.php?mod=viewthread&tid=272)有不少讨论。


作者
Author:
helpme    时间: 2015-5-21 09:31
这学期要上matlab课,逼得我从头学了一下matlab。一学期下来,感觉入门了。
不知道学生们入门没有。
作者
Author:
excalibur    时间: 2015-5-21 09:44
本帖最后由 excalibur 于 2015-5-21 09:46 编辑

每种语言都有自己的优势和劣势,如果能流行起来肯定有其偶然或者必然的原因。科学计算方面估计大家争论的焦点在Fortran、C和C++上。从学习的难度上来说Fortran < C << C++。Fortran易学易用且有数量庞大的数学库,或许依然是数值计算的第一选择。C/C++是通用型编程语言,更擅长处理各种复杂的数据结构,而数值计算中最常见的数据结构是array,所以通常来说编写同样优秀的数值代码,用Fortran编写时间上可能要稍微短一点。不过基于C/C++的科学计算软件和数学库也在不断增多,比如Orca就是用C++开发。如果想学一门解释型语言,Python应该是个不错的选择。

对于Mathematica, Maple和Matlab,前两者的长处在符号运算,Matlab的长处在数值计算。他们都是收费软件,还有很多免费的替代方案,比如maxima、sage可以做符号运算,octave和scilab可以部分替代matlab。当然也可以用numpy + scipy + matplotlib + sympy +……

萝卜白菜,各有所爱。选择让自己感觉最舒服的就行,毕竟每个人的看法和喜好不同。

PS: 有个说法是CPP = C Plus Python……

想起那个“PHP是最好的编程语言”的老梗。。。。。。




作者
Author:
fhh2626    时间: 2015-5-21 10:51
sobereva 发表于 2015-5-21 06:08
不同语言各有所长,没有前提放一起比也不公平,这里只针对科学计算进行讨论。

搞科学计算,Fortran和C必 ...

不同意
和C比也就算了,在科学计算领域,Fortran很难和C++再竞争了。
如果说20年前,99%的科学计算程序都是由Fortran所写的话,那现在,其中的90%已经被废弃了,原因就是面向过程的大型代码很难维护,(易读更是无从说起)

据我说知,主流分子动力学软件中,NAMD是自打开始就用C++语言写的,GROMACS和LAMMPS是用FORTRAN写的,后来实在无法继续下去,用C++重写(如果不是无法再下去的话,没人会去重写一个软件)
量子化学软件中,新兴之流orca和qchem用的是c++,而gaussian和gamess用的是Fortran,其中gaussian也遇到了严重的维护问题,很多老代码都无法维护了,只有gamess由于软件工程方面做得好,得以健康的发展。

面向对象比面向过程的程序易读、易于维护得多,可以从几个方面明显的看出来:
1、类提供的接口只包括较少的代码。维护面向过程的程序时,程序员需要花大量的时间在判断哪一部分代码“不希望”被暴露为接口,这是一个很糟糕的工作,当然这可以通过大量的注释文档来解决(可是这相当于一个认为的拙劣的对封装性的模拟,而且即便这样,也常常解决不好)
2、并不需要接触过多的源代码。一个好的面向对象程序有很清晰的层次,程序员可以很容易的找到自己感兴趣的代码进行修改或者调用,这个过程的多数时间只需要看类名和少量接口函数注释。而在面向过程的程序中,除非有很好的软件工程设计,否则这是一个很难的过程(LINUX的原作者不喜欢面向对象的风格,于是在创造LINUX时使用了C语言,在其后的过程中,LINUX程序员在维护时遇到了前所未有的困难,于是他们使用了C语言的面向对象写法,这是我所知道的除了C++的模板元编程以外最糟糕的语法之一,但是他们宁愿忍受这种语法也不愿忍受面向对象)
3、继承。继承不仅仅是可以省掉程序员X%的劳力那么简单,他在程序的易读性上的贡献是巨大的,1个小时的时间足以将这个星球上最强大的C++库之一——QT了解个大概,这就得益于其良好的继承关系。

不过以上说的都是基于优秀的程序员而言,对于糟糕的程序员,不管任何语言都能写出垃圾代码,从这一方面讲,C++最为难学,产生糟糕程序员的概率最高,C++的糟糕代码也不少。

至于PYTHON,那是和MATLAB一类的上层语言一起讨论的东西,和fortran,C++等没有可比性
作者
Author:
zhanfei    时间: 2015-5-21 12:58
本帖最后由 zhanfei 于 2015-5-21 13:15 编辑

感觉C和fortran总感觉是先学的哪个一般就会对哪个评价高,或者用哪个成功开发出程序就对哪个评价高。比如C的指针开始就接触了也就习惯了,甚至连数组也写成指针样式,还有函数声明,如果之后学的fortran会总感觉fortran的接口块声明怪怪的。至于面向,只看过c++和pytho面向对象的几个数据处理脚本,还没见识过大型面向对象程序的代码。至于可读性我觉得主要是依赖1软件设计人的思路和2英文注释(这很重要,软件涉及再好一堆法文德文注释也晕死你,而且变量名暗法文等写你看出代表含义比较麻烦),还有3读代码人本身对所写原理的理解(这是根本)。这里吐槽下f77,有时候就是思路理清了。。。你也下不了手改。
说一下python和matlab
其实我感觉matlab的优势就是能快速写出一些小的应用脚本毕竟toolbox多而且gui也方便。python虽然模块也越来越多但是还是有着积累上的差距,比如我前几天想找个完整实现各种因子分析的模块就找不到,而matlan至少有2 3个。而且python的gui如果和绘图的plotmatlib绘图的backend连接好才能写好带绘图的gui,这一点上也没有matlab把实现细节隐藏的好。

作者
Author:
excalibur    时间: 2015-5-21 13:30
fhh2626 发表于 2015-5-21 10:51
不同意
和C比也就算了,在科学计算领域,Fortran很难和C++再竞争了。
如果说20年前,99%的科学计算程序 ...

首先申明,我对C/C++更熟悉,我也很希望科学计算领域有更多更好的C/C++软件和库出现。

不过我有几个疑问。首先,如何判断诸如Gaussian等用Fortran写的软件遇到了严重的维护问题?其次,如何得出科学计算领域Fortran再难与C++竞争?至少从http://en.wikipedia.org/wiki/Lis ... te_physics_software上看,在量子化学和固体物理中,Fortran依然是使用最多的编程语言。另外就是既然面向对象有这么多的优势,而Fortran早就支持了面向对象,您所提及的优势是不是也可以适用于Fortran?最后就是本人不太明白上层语言的具体定义是什么,我只听说过静态类型语言和动态类型语言、静态编程语言和动态编程语言以及编译型语言和解释型语言,倒是第一次听说上层语言。
作者
Author:
卡开发发    时间: 2015-5-21 14:46
两者我都学过,C学的比较浅,C比较麻烦,一大堆指针比较头疼不太容易读,但个人觉得C控制格式方便得多,指针麻烦但有时候反而也简单;速度上没进行过比较,但估计两者应该都很不错。

有程序就是Fortran写计算模块C写控制模块的,现在我自己使用的是Fortran。实际上作为计算中两种主流的语言,选择哪一种只是个人喜好,有人采用python(GPAW)或3M做计算也是一种选择,只是些条条框框的东西罢了,根本不是最重要的,折腾来折腾去没写个像样的程序而白白花费精力,这才是不可取的。


作者
Author:
sobereva    时间: 2015-5-21 17:35
fhh2626 发表于 2015-5-21 10:51
不同意
和C比也就算了,在科学计算领域,Fortran很难和C++再竞争了。
如果说20年前,99%的科学计算程序 ...


“在科学计算领域,Fortran很难和C++再竞争了”、“那现在,其中的90%已经被废弃了”根本没有这回事。只能说各有各的优势,从软件工程角度看无疑C++有优势,但Fortran具有的前述优势(尤其是高效、易读性)在C++中没有,而那对于科学计算程序是极为重要的。

可以看看这个页面,有多少是用Fortran多少是用C/C++写的:http://en.wikipedia.org/wiki/Lis ... te_physics_software。不光是老程序,其中大量后来发展的都是Fortran的。

谁说Q-Chem是靠C++来写的?实际上C++的代码只占了其不到一半,底层为了高效率用的都是Fortran。

ORCA、Q-Chem并非算是新兴,都有近20年的历史了。Gaussian是有严重维护问题,但这根本不是因为Fortran,而是当初那批写代码的人不注意写注释,结构乱,老的开发者又不断离去,新人搞不懂老代码。

还要考虑,并不是所有程序都非得需要C++的那一大套面向对象东西,绝大多数科研工作者根本没机会去开发大型程序,只希望用最短的时间学会语言、用最少的精力写出自己需要的代码,对这些人Fortran是完美的选择。把搞计算机的人的思路、看法、习惯强加到科研工作者上是明显不合适的。何况开发大型科学计算程序(尤其是量化类),Fortran也并无困难。

看问题要从实际受众的角度出发。


我在第一个回帖中就说,语言之争是永恒的导火索,争论的人总是带有主观偏好,不管自己有没有理也不爱听对方的,只是单纯地找理由驳回,甚至脱离了客观、脱离了实际问题、脱离了实际需求。所以这个问题我不爱参与讨论,但我在前面回帖中列出的8条Fortran的优势(给书写代码带来了极大便利),以及易学易写易读,是C++显然没有的,这点是非常客观的。

作者
Author:
fhh2626    时间: 2015-5-21 23:13
本帖最后由 fhh2626 于 2015-5-21 23:16 编辑
excalibur 发表于 2015-5-21 13:30
首先申明,我对C/C++更熟悉,我也很希望科学计算领域有更多更好的C/C++软件和库出现。

不过我有几个疑 ...

无意进一步争论,我保留“Fortran再难与C++竞争”的观点,你的其他疑问解答如下

Fortran当然可以享受到面向对象的优势,但是恐怕fortran程序员并不熟悉这样的编程方式,这一点可以从大多数fortran程序代码中读出来

我并没有说“等”,不过Gaussian遇到了严重的维护问题是业内众所周知的。另外GROMACS,LAMPPMS遇到了维护问题而导致用C++重写,这是可以查到的

如果你不太明白上层语言的定义,可以在这个页面进一步学习“http://en.wikipedia.org/wiki/High-level_programming_language” (实际使用中,这个词一般用作相对比较,抽象层面越高,便说这个语言更为“上层”。不过你对编程语言了解颇深,第一次听说上层语言这个词挺令人惊讶


作者
Author:
excalibur    时间: 2015-5-22 08:59
fhh2626 发表于 2015-5-21 23:13
无意进一步争论,我保留“Fortran再难与C++竞争”的观点,你的其他疑问解答如下

Fortran当然可以享受 ...

莫非你说的上层语言是指高级语言?好吧,我孤陋寡闻了。学C那会低级语言是指汇编,C被人称为“高级汇编”。现在C都已经划成低级语言了。

编程语言之争是一件挺没有意义的事情,就此打住吧
作者
Author:
卡开发发    时间: 2015-5-22 09:23
excalibur 发表于 2015-5-22 08:59
莫非你说的上层语言是指高级语言?好吧,我孤陋寡闻了。学C那会低级语言是指汇编,C被人称为“高级汇编” ...

语言是分上层和底层的,越接近计算机本身的语言越底层,汇编已经就是很底层的语言(再往下估计就是000111。。。这样的了)。

剩余问题我赞同兄台的,感觉没有讨论的意义,与“甜咸豆浆之争”没什么区别,只是个人口味而已。
作者
Author:
五十八    时间: 2015-6-4 17:29
python 很好用恩恩 net本地一体化 现在就是用py建立了一个可以远程在线管理输入文件输出文件 有了py曾经的php呀都可以封存了,py的类更加灵活相比较c++而言,因为下半年才开学 所以 还没学fortran,c是从tc开始的,但是...指针很方便啊啊啊 明明 但是 我还是觉着 如果有一种语言可以明白清楚的表达给人类理解和电脑运行就是好语言吧
作者
Author:
qwoop    时间: 2015-6-5 13:29
语言没有优劣,只有合适不合适。大规模计算必然是C,Fortran,C++的天下;建模、图形化、数据处理则大多数采用python这样的脚本语言,lammps、abinit等等自带的数据处理模块基本都是python写成的,好处不言而喻:无平台、编译器依赖,开发迅速,第三方库丰富。
另外,python的胶水特性在很多科学计算上也很有用,比如QM/MM上,从Gaussian的输出文件上读取Force,python只需要不到20行代码,有哪个高级语言可以做到?
作者
Author:
jjjspring    时间: 2015-6-5 23:35
讨论科学计算,Fortran必然是有优点的,但相当一部分学生以后不从事科学计算相关的工作,学习C/C++,JAVA,python都更有益。
作者
Author:
chittyda    时间: 2015-6-17 21:35
python,比较人性化,不笨拙~~~
作者
Author:
beefly    时间: 2015-6-20 21:17
本帖最后由 beefly 于 2015-6-20 21:27 编辑
sobereva 发表于 2015-5-21 17:35
“在科学计算领域,Fortran很难和C++再竞争了”、“那现在,其中的90%已经被废弃了”根本没有这回事。 ...

fortran和c只要掌握一门,读另外一个语言写的代码,稍加训练就可以很快读懂,一边看代码一边翻书都来得及。但是读c++代码就不行了,必须从头学。

Q-Chem里面的c++代码主要是Krylov的组写的,也就是eom-xx-ccsd那一部分。Krylov从俄罗斯来的(奇怪,俄女姓氏难道不是Krylova吗?也许因为是女权主义吧,北京的国际量化会之前的搅局者之一),是个c++粉,要求学生必须用这个语言。但是eom方法的计算效率,比dalton、aces2、cfour这些fortran写的程序差得很远。

c++写的代码最头疼的事情,一是大量头文件,非常依赖于操作系统,很多头文件在不同系统上根本不通用;有些年代久远的头文件,如今根本就找不到。一个十多年前的代码,不经过修改往往无法编译。

二是c++程序作者热衷于调用一大堆外部的库,哪怕几百行的代码,不调用七八个库都不好意思发布。但是这些库不同版本之间的兼容性未必解决得很好。在大型的机集群上,普通用户根本没权限更新这些库,而系统管理员本着多一事不如少一事的原则,也不会做这种事情。比如学校的cluster是2013年安装的,操作系统scientific linux因为过于强调稳定性,系统库的版本一般都会晚一两年(个别还有晚七八年的),于是在2012年发布,用c++写的psi4程序,在上面根本编译不了,甚至生成pdf手册都不行。

这些问题在c代码中也存在,但是不如在c++中严重。可能是fortran和c++支持者的世界观不同,fortran程序作者重视历史积累,而c++程序作者重视新事物。

所有支持c++的理由,我感觉最合理、最现实的一个就是容易招到会编程的研究生/博士后,因为不少人在上学期间,都曾经用ms vc++写过一些小程序。
















作者
Author:
abdoman    时间: 2015-6-22 20:01
fhh2626 发表于 2015-5-21 10:51
不同意
和C比也就算了,在科学计算领域,Fortran很难和C++再竞争了。
如果说20年前,99%的科学计算程序 ...

gamess 的源代码还保留77的风格。
效率一般,我指的是us 版本。
而且里面的代码风格迥异,读起来想砸电脑。
作者
Author:
smutao    时间: 2015-6-23 06:24
fhh2626 发表于 2015-5-21 23:13
无意进一步争论,我保留“Fortran再难与C++竞争”的观点,你的其他疑问解答如下

Fortran当然可以享受 ...

"fortran程序员并不熟悉这样的编程方式"

这个对我不适用 我花了2天时间就习惯了
之前没有接触过类和对象


作者
Author:
yjcmwgk    时间: 2015-8-14 07:37
本帖最后由 yjcmwgk 于 2015-8-14 08:17 编辑

偶然看到在知乎上的回答,用于科研的hpc程序的特点,读来忍俊不禁。  
90%的时间用C/C++、Fortran。 偶尔用mathematica, matlab等高级工具干些零碎的活;
最重要的是正确性,其次是速度;
99%的时间花在除虫上,其中90%的情况是数组指标越界;
大量使用各种数值算法和线性算法,很少使用基于复杂数据结构的算法;
程序快不快,全看会不会迭代; 程序好不好,全凭文章在哪找;
程序里设置很多参数,取值都是试出来的,一般不能改动;
先写串行程序,再写并行程序;
经常访问数学维基或百科网站(wikipedia、mathworld、planetmath等);
科学计算领域的圣经是Abramowitz和 Stegun的数学手册,谭浩强是Numerical Recipe;
代码的长度随着科研项目的进展不断增长;
大量使用组里“祖传”下来的程序,被告知不要改变里面的参数;
使用双精度;
依赖编译器的优化,对硬件构架也有些了解;
被告知尽量不要使用闭源软件;
属于VIM或Emacs阵营之一;
hostname 是个科学家的名字;
有几个从师兄师姐那儿拷来的脚本;
程序的文档就是正在写的文章;
梦想再装块显示器;
有作为人形高级计算器的觉悟;
梦想着有一天写个巨牛逼的脚本把程序从编译到执行到数据处理都自动化了;
程序能跑的时候项目才完成了5%~10%;
用并行(parallelism)不用并发(concurrency),用数组不用链表;
变量名字起的很怪,其实都是直接从方程里来的;
程序不具有可读性,除非你先读懂对应的文章;
不断有新入组的学弟学妹抗议代码不符合软件工程,后来他们要么闭上嘴去灌水,要么拿了master走人了;
常常有重构代码的欲望,试过几次都放弃了,终于有天下午把代码重构了一遍,结果发现跑出来的数据怎么都不对,从此彻底放弃;
总以为做科学计算的人写的代码都很丑,后来看过一个大牛写的代码,彻底惊呆了 —— 但学CS的室友照样说丑;
写着写着,一不小心代码就成了某个领域某个小方向 the state of the art;
常常提醒自己是科学家不是程序员。
专业的程序员总是认为HPC的编程很弱智,真让他/她们去写HPC代码 ——开玩笑——他/她们连流体力学(量子化学、广义相对论 …… )都不懂,怎么可能会做科学计算

作者
Author:
yjcmwgk    时间: 2015-8-14 07:37
手机回复,回车键都消失了!?
作者
Author:
SigFig    时间: 2016-2-8 04:21
python,C和C++都用过,整体感觉如下
pyhton语法简单(对于学过C的同学可能简单的有点过头),适合写一些日常处理文件的脚本(比linux上的bash脚本可读性更好),也适合写一些job flow'control的程序(执行计算A,如果A的能量高于多少多少,执行计算B)

C/C++ 语法严谨,也有很多的开发环境,比较适合开发一些正式的程序。缺点是难入门和指针引用满天飞(听我说个笑话,int *******p),老板办公室有一本介绍c++的书,厚厚的一层灰。

Fortran没实际用过,感觉做大规模数值计算会比较好。

学习这些语言了话,学通C一通百通,想一星期写脚本就去学python,至于fortran,学会了c对着几个sample code一看就会了
作者
Author:
数据挖掘    时间: 2016-2-10 11:42
http://mp.weixin.qq.com/s?__biz= ... 178cdd1e391f8c3a#rd
推广perl perl6
作者
Author:
一颗赛艇    时间: 2016-9-5 02:15
本帖最后由 一颗赛艇 于 2016-9-5 02:16 编辑

干活的硕士和博士们,毕业后大多数都离开了科研。学了C++,学了Python,找相关工作还可以接着用,不算白学。

学Fortran出来有什么用?没有任何用。

屠龙之术。

作者
Author:
xiamiaoren    时间: 2020-5-25 10:36
一颗赛艇 发表于 2016-9-5 02:15
干活的硕士和博士们,毕业后大多数都离开了科研。学了C++,学了Python,找相关工作还可以接着用,不算白学 ...

作为刚毕业的博士,深有体会
作者
Author:
shalene    时间: 2020-5-25 12:37
C和C++的差别比C和Fortran的差别还大。
作者
Author:
plus    时间: 2020-5-25 14:38
ORCA老板的观点
http://www.ccl.net/chemistry/res ... 2011/05/08.003-dir/
作者
Author:
sobereva    时间: 2020-5-27 05:30
很多嫌弃Fortran的人实际上都对现代Fortran不充分了解,老是拿着从Fortran90学起的人往往都头痛的Fortran77的代码各种吐槽(诸如Gaussian、GAMESS-US那种风格),Neese在CCL上的发言给我的感觉也是如此。这是很不合理的。Fortran在写很多类型的科学计算代码方面的便利性明显强于C++,而且非常容易学。就算毕了业以后不搞科研,用不着Fortran,即便在博士期间花一个礼拜时间学学Fortran、之后用Fortran解决实际问题,也一点都不亏。

顺便在此强调一下:切勿拿Fortran77来评价Fortran。评价Fortran至少也得是充分掌握Fortran 90/95的基础上(后来Fortran 2003等规范又有很多在面向对象编程上的扩展)。

作者
Author:
beefly    时间: 2020-5-30 17:41
英国国家超算中心ARCHER上可以查到计算资源的近期统计,其中绝大部分来自fortran程序
http://archer.ac.uk/status/codes/


作者
Author:
chrinide    时间: 2020-5-30 20:38
beefly 发表于 2020-5-30 17:41
英国国家超算中心ARCHER上可以查到计算资源的近期统计,其中绝大部分来自fortran程序
http://archer.ac.uk ...

VASP贡献了1/3的用量,Fortran写的




欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3