如何理性的评价各种编程语言的优劣?

原创
2016-06-17 08:30:29 824浏览

我不是想找万能的银弹,也不是让个别phper来引战的,知乎上虽然有一个类似的问题,PHP、Java、Python、C、C++ 这几种编程语言都各有什么特点或优点? - C(编程语言),但是里面是卖萌和抖机灵的多,没有看到一些作为一个初学者真正想知道的问题。

举个例子,PHP能够进行WEB开发,也能进行桌面开发,但并没有那款桌面软件是用PHP开发的,所以PHP这门语言其实更适合于web开发,这算是对PHP一些评价。都说语言是工具,要在合适的时候使用合适的工具,不了解特性又怎么在合适的时候用呢?但了解语言的特性肯定是那些有一定使用经验的人才有发言权的啊,我问这个问题就是为了从有经验的人口中了解这些特性,学习学习。真的不是故意想挑起语言之争什么的。

谢谢各位小伙伴解答啦 ~ > _ 回复内容: 首先这个问题是没有办法明确回答的,因为“理性”一词的定义并不明确,优劣一词也不明确。我只能说一下自己的观点。

在这里先推荐一篇硅谷创业教父Paul Graham的文章Beating the Average,希望大家先读一下。

正如题主所说的那样,“PHP能够进行WEB开发,也能进行桌面开发,但并没有那款桌面软件是用PHP开发的,所以PHP这门语言其实更适合于web开发,这算是对PHP一些评价。” 所有的通用编程语言(General Purpose Programming Language)都是图灵等价的,计算能力上没有任何差别,但是为什么没有什么人喜欢用图灵机来编桌面、网络或者其他应用?!为什么大家不人人用汇编?!所以在争论计算机语言优劣的时候祭出图灵等价只能是很low方式。但是在计算性上的确所有语言都是等Power的,那么问题来了,我们通常争论一个语言比另一个语言更强大的时候我们到底在TMD争论什么?!或者说同一门的新版本比旧版本更强大,或者更明确一些,Java 1.8里有lambda,那么它是否比Java 1.7更强大?Java 1.5引入了泛型,那么它是否比1.4要强大?Python 3.5里有用async还有await协程,那么Python 3.5是否比Python 3.4更强大?首先我觉得新版本是更强大的,泛型的引入避免了一些运行时的类型错误,lambda让函数不必显示地包在对象之中。Python的协程解放了一些对程序流程的控制。然后我也觉得它们没有让这语言更强大,因为差不多的特性都能在老的版本上实现,只是比较挫。但是,但是1.5中引入的泛型你是否可以用库来弥补?显然好像是不行的。所以特性可以分为能用库来弥补的跟不能用库来弥补的,我觉得这是1.5比1.4真正强大了,1.5真是要优于1.4,这一点上应该没有什么争议。但Java 1.8是不是比1.7更优,你可以跟我再争论一下,并且我不觉得这种争论有任何结果。

那么对于语言是否更优,我的定义是语言A的特性不能用语言B的库来弥补,那么A语言在这种特性上就是更优,如果B可以用库弥补A的这种特性那么A是不是更优可以有争议。这种争议我通常会躲开或者搁置。

那么显然,C语言应该是比汇编更优的,首先C语言可以定义更多的类型、结构体,这是汇编语言库不能弥补的,其次,C语言有三种控制流的语句,顺序、条件、循环(忘记是麦卡锡还是Dijkstra还是霍尔最先提出的了,知道的告诉我一下)而你再厉害的汇编库也不可能弥补C语言有if for while这些语法上的优势。

以下纯个人观点:
那么Java是否比C++更优?Well,Java有自动的内存回收,C++也出了Smart Pointer,不同的只是学习成本。在其他一些地方Java也有些特性是C++用库没有办法弥补的。

Java是否比C语言优?大的尺度上好像并没有,Java的面向对象只是一种抽象问题的思想,而在C语言里有人一样也可以面向对象来编程。但是其他有有些方面Java的确更优,比如说数组index out of bound。

Haskell是否比Java更优?答案是肯定的。Haskell里有的一堆可以让你少写成百上千行代码的特性Java里都没。

文中给了一个叫Blub的悖论:
有一个用Blub语言(假想的语言)的程序员,它是一个比Cobol还有汇编语言更强大的语言。因为对于汇编那是编译器要的事。而对于Cobol这个用Blub的程序员不知道Cobol程序员怎么用Cobol把事情搞定,因为Cobol连XXX特性都没有,所以这个程序员并不会使用Cobol或者汇编。

只要当这个Blub程序员向下审视其他不如Blub强大的语言时,这种不强大十分明显,因为这些语言没有Blub程序员习惯使用的特性。而当它们抬头看更强大的语言时,他们并不觉得他们在仰望。他们看到的只是一个奇怪的语言(这里作者应该是指Lisp),并且认为Blub与它是一样强大的,只是里面有一堆奇怪的东西。Blub已经够好了,它他用Blub的方式思考。

悖论到此结束。
这也许就是语言之争的起源,一般的人只是做着比较单一的工作,只要有一种语言他们熟悉并且走够好就可以了,同时,他们已经习惯了这种语言的思考方式。后者是很可怕的。

(这里扯点别的,有人问一个中国人:为什么而学习?这里的为什么而跟了一个动词,我们惯性地会想一个目标,比如为中华崛起而读书。为往圣继绝学,为万世开太平,总是要有一个目标。这里的为什么对应英语what ... for,而老外用的是why?所以有的老外会这样回答这个问题“因为知识本身就是值得学习的”这个老外是欧几里得,虽然他是希腊人可能不用英语,但是我只想说自然语言都会限制我们的思考,就更不用说计算机语言了)

比如在一门没有递归的语言中你思考的语言永远都只是循环那几样东西,在汇编里你永远的只想着如果搞那堆寄存器,应该用什么指令。所以你应该跳出来,打破你现在熟悉的东西,忘掉它重新开始,看看Haskell、F#、Lisp、Scala、Scheme、Clojure、Ocaml、Erlang,这个世界丰富多彩的。Haskell、F#里我能举出好多你在Java、C++、C#里永远也没法用库弥补的特性。但是这并不代表你就一定要用Haskell与F#,我唯一不希望看到的是你专精了C跟C++语言好多年,然后又去花好多时间去钻研Go或者Python,因为我觉得它们不会给你带来新的思想。

最后引用一句Beating the Average中的话:
人人都知道,把你全部的程序全部使用汇编手写是错误的,但是很少有人注意到一个更一般的原则:如果你可以选择多种语言,若其中大部分语言都是相同的,那么如果你不用那个强大的就是错误。

当然对于这个原则是有例外的。如果你需要写一个程序来与已有的程序协同工作,那么新的程序还是用与原来相同的语言比较好。如果你需要写一个非常简单的程序比如操作bit,那么一个抽象能力不怎么高的语言就够了,并且这样还会更快。如果你要写一个短的,并且写完就弃用的程序,那么你就用库最强大,能帮你快点完成工作的语言。但是对于一般的应用软件,你一定想用你所知道的最强大(并且效率还不错)的语言,用任何类似的其他语言都是一个错误,比如说汇编语言。 以下转自王小波的文章:打工经历 。
来源,王小波的书
沉默的大多数小说在线阅读
正文 打工经历
希望软件公司老板不要学下例的那种。

在美留学时,我打过各种零工。其中有一回,我和上海来的老曹去给家中国餐馆装修房子。这家餐馆的老板是个上海人,尖嘴猴腮,吝啬得不得了;给人家当了半辈子的大厨,攒了点钱,自己要开店,又有点烧得慌——这副嘴脸实在是难看,用老曹的话来说,是一副赤佬像。上工第一天,他就对我们说:我请你们俩,就是要省钱,否则不如请老美。这工程要按我的意思来干。要用什么工具、材料,向我提出来,我去买。别想揩我的油……

以前,我知道美国的科技发达、商业也发达,但我还不知道,美国还是各种手艺人的国家。我们打工的那条街上就有一大窝,什么电工、管子工、木工等等,还有包揽装修工程的小包工头儿;一听见我们开了工,就都跑来看。先看我们抡大锤、打钎子,面露微笑,然后就跑到后面去找老板,说:你请的这两个宝贝要是在本世纪内能把这餐馆装修完,我输你一百块钱。我脸上着实挂不住,真想扔了钎子不干。但老曹从牙缝里啐口吐沫说:不理他!这个世纪干不完,还有下个世纪,反正赤佬要给我们工钱……

俗话说,没有金刚钻,别揽磁器活。要是不懂怎么装修房子就去揽这个活,那是我们的错。我虽是不懂,但有一把力气,干个小工还是够格的。人家老曹原是沪东船厂的,是从铜作工提拔起来的工程师,专门装修船舱的,装修个餐馆还不知道怎么干吗……他总说,现在的当务之急是买工具、租工具,但那赤佬老板总说,别想揩油。与其被人疑为贪小便宜,还不如闷头干活,赚点工钱算了。

等把地面打掉以后,我们在这条街上赢得了一定程度的尊敬。顺便说一句,打下来的水泥块是我一块块抱出去,扔到垃圾箱里,老板连个手推车都舍不得租。他觉得已经出了人工钱,再租工具就是吃了亏。那些美国的工匠路过时,总来聊聊天,对我们的苦干精神深表钦佩。但是他们说,活可不是你们俩这种干法。说实在的,他们都想揽这个装修工程,只是价钱谈不拢。下一步是把旧有的隔断墙拆了。我觉得这很简单,挥起大锤就砸——才砸了一下,就被老板喝止。他说这会把墙里的木料砸坏。隔断墙里能有什么木料,不过是些零零碎碎的破烂木头。但老板说,要用它来造地板。于是,我们就一根根把这些烂木头上的钉子起出来。美国人见了问我们在干什么,我如实一说,对方捂住肚子往地下一蹲,笑得就地打起滚来。这回连老曹脸上都挂不住了,直怪我太多嘴……

起完了钉子,又买了几块新木料,老板要试试我们的木匠手艺,让我们先造个门。老曹就用锯子下起料来:我怎么看,怎么觉得这锯子不像那么回事儿,锯起木头来直拐弯儿。它和我以前见过的锯子怎么就那么不一样呢。正在干活,来了一个美国木匠。他笑着问我们原来是干啥的。我出国前是个大学教师,但这不能说,不能丢学校的脸。老曹的来路更不能说,说了是给沪东船厂丢脸。我说:我们是艺术家。这话不全是扯谎。我出国前就发表过小说,至于老曹,颇擅丹青,作品还参加过上海工人画展……那老美说:我早就知道你们是艺术家!我暗自得意:我们身上的艺术气质是如此浓郁,人家一眼就看出来了。谁知他又补充了一句,工人没有像你们这么干活的!等这老美一走,老曹就扔下了锯子,破口大骂起来。原来这锯子的正确用途,是在花园里锯锯树杈……

我们给赤佬老板干了一个多月,也赚了他几百块钱的工钱,那个餐馆还是不像餐馆,也不像是冷库,而是像个破烂摊。转眼间夏去秋来,我们也该回去上学了。那老板的脸色越来越难看,天天催我们加班。催也没有用,手里拿着手锤铁棍,拼了命也是干不出活来的。那条街上的美国工匠也嗅出味来了,全聚在我们门前,一面看我们俩出洋像,一面等赤佬老板把工程交给他们。在这种情况下,连老曹也绷不住,终于和我一起辞活不干了。于是,这工程就像熟透的桃子一样,掉进了美国师傅的怀里。本来,辞了活以后就该走掉。但老曹还要看看美国人是怎么干活的。他说,这个工程干得窝囊,但不是他的过错,全怪那赤佬满肚子馊主意。要是由着他的意思来干,就能让洋鬼子看看中国人是怎么干活的……

美国包工头接下了这个工程,马上把它分了出去,分给电工、木工、管子工,今天上午是你的,下午是他的,后天是我的,等等。几个电话打出去,就有人来送工具,满满当当一卡车。这些工具不要说我,连老曹都没见过。除了电锯电刨,居然还有用电瓶的铲车,可以在室内开动,三下五除二,就把我们留下的破烂从室内推了出去。电工上了电动升降台,在天花板上下电线,底下木工就在装配地板,手法纯熟之极。虽然是用现成的构件,也得承认人家干活真是太快了。装好以后电刨子一跑,贼亮;干完了马上走人,运走机械,新的工人和机械马上开进来……转眼之间,饭馆就有个样儿了……我和老曹看了一会儿,就灰溜溜地走开了。这是因为我们都当过工人,知道怎么工作才有尊严。
现在的年轻人真是,什么脑子都不动,就想得到可以写论文级别的知识,真不知道是说你们幼稚好还是居心不良好。在学校就炒功课,出来社会就抄袭,一帮废材。

想要符合理性评价,那么科学的评价是一种理性的评价。
要科学的评价,只需要建立可重复性的验证或者实验手段就可以了。

以下是一种仅供参考的验证或者实验方法的步骤:

1. 选择一个常见的可编程解决的问题
2. 选择候选编程语言可使用的语言措施、库等等范围
3. 邀请足够多的中等或以上水平程序员的程序员,在约定的范围内编写代码解决这个问题
4. 升级这个问题或者扩展这个问题的应用范围

按以上步骤迭代,统计每次迭代时(也就是问题变化时)解决问题的各语言的代码的变化量。

关于候选编程的问题,应该尽量贴合主流的开发环境需要解决的问题。
---
至于要讨论什么才是语言优劣的标准,那是另外一个问题。 The Economy of Programming Languages OpenClassroom
我觉得对于编程语言,其实不必过于的理性。首先往往编程语言不是我们能够选择的,而且就算你可以选择,但是选择的余地其实也并不多。作为一个爱好其实根本不必太理性。我个人其实比较喜欢clojure的,但是没有实际的应用场景,如果自己搞一些东西,一定会用的,但是这段时间工作很忙碌,也就没有时间搞了,但是我是发自真心的喜欢这个语言。

此外,我还比较喜欢灵活度比较高的语言,但又不必处理太多的底层细节,比如javascript,python,ruby。讨厌那些需要处理无穷细节,规则无比复杂的语言,代表性的有c++。

好的语言应该是这样的:简单,可靠,灵活。
特性上应该有:支持函数性也支持面向对象,高度灵活的语法,庞大的类库,有垃圾回收机制,有异常处理机制,高级的多线程模型(比如actor),能用最少的代码做最多的事情。符合这些的其实只有clojure了。

但是一旦我决定使用clojure来开发我们的应用,就要面对无法招到人得窘境了,这里是西安,不是西雅图。 我就不喜欢写代码,所以我需要用的东西哪个语言有实现,我就用哪个语言,跨语言开发也不难 一般我认为,菜鸟支持他是因为不需要学习太多东西,同时老板支持他是因为手下很多活都需要菜鸟干,那就是一个烂语言。 这就是读史的重要性。每种编程语言的基因基本上决定于刚被设计出来时的用途,虽然后天改造也有影响,但是把鱼改造成熊掌无论如何是不如直接找熊要熊掌的。

上个图吧,稍老了点,侵删。

我非常赞成鸟哥的话:
或许人性都是如此, 觉得掌握了复杂的东西会比较吊, 然而他们却忘记了, 还是我刚才的观点, 语言只是你学习来解决你实际问题, 把你的想法变为实际的工具, 你的成长应该是你在使用它们解决问题的过程中, 解决问题的经验的成长, 而不是语言的使用技艺的增长.
还有:
PHP的程序员, 需要认真的想好, 你的代码会怎么被执行, 你怎么写代码, 最终的执行效率才最高. 而不像其他的语言, 程序员可以把一部分优化工作交给编译器. 实际上,各种语言最根本的区别是思维哲学不同。
php是务实,一切以最简单的代码完成功能为主,好开发,好部署,好更新。
python是极致简洁,力求用最简洁的语法高效完成任务。
java是严谨,语法要求各种强制类型,强制try catch之类的。
其他语言也各有各自的思维哲学,实际上,学到一定程度后,就会对不符合自己性格的语言越来越排斥,虽然会用,但不会喜欢。
各种语言的应用领域有不同,但新项目开发中具体使用哪种语言,基本上是由总监的喜好,和公司的人手决定的,而并不是什么更适合。
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。