神译局是36氪旗下编译团队,关注科技、商业、职场、生活等领域,重点介绍国外的新技术、新观点、新风向。
编者按:编程语言哪种好?这可能是许多学习编程人员甚至是外行人员都会面对的头疼问题。网络上普遍的编程语言介绍,大多都是东拼西凑的内容,并且无法让人真正认识和了解各种语言的优缺点。这篇文章,原标题是These Modern Programming Languages Will Make You Suffer,作者Ilya Suzdalnitski在文章中针对15种编程语言展开了详细测评,希望对你有所帮助。
图片来源:javaassignmenthelp
懒人目录
概述篇:编程语言最重要的特征
一星篇:C++,JAVA
二星篇:C#,Python,Rust,TypeScript
三星篇(上):Go,JavaScript
三星篇(下):Haskell,OCaml,Scala
四星篇:Elm,F#
五星篇:ReasonML,Elixir
首先我们来看看设计最差的语言C++,它可能也是计算机科学领域最大的错误之一。尽管这门语言的普及使用率很广,但是它并不是一门拥有很多闪光点的编程语言。
所属的编程语系:C
C++是一门恐怖的面向对象语言……如果你只能用C语言来完成项目,那么你就不会因为任何愚蠢的对象模型把事情搞砸。
— Linus之父林纳斯·托瓦兹(Linus Torvalds)
C++拥有许多特性,它尝试做到一切事情,但却没有一项做到精湛。C++拥有“goto”、指针、引用、OOP,以及操作符重载等低效率特性。
为什么C++是一门如此糟糕的语言呢?我认为,最大的原因在于它被设计出来的年代。
C++是1979年设计出来的,当时的设计者缺乏经验,不知道应该把设计重点放在何处。C++已有的特征在那个年代似乎是很好的设计,这门语言当时也十分流行,这同时也意味着,更多的特征被添加了进去,以此支持不同的用例,所以C++所拥有的特征就更加乱七八糟的了。
C++是出了名的编译时间长。它比Java编译速度慢得多,不过没有Scala那么糟糕。
不过C++的运行时性能以及应用启动时间都还不错。
在C++里面,我们不说“缺少*”,我们会得到这样的错误信息:
error C2664: ‘void
Std::vector<block,std::allocator<_Ty>>::push_back(const block &)’:
Cannot convert argument 1 from
‘std::_Vector_iterator<std::_Vector_val<std::_Simple_types<block>>>’
to ‘block&&’
我觉得这是很美妙的表达。
上图的推文就提出了一个很好的观点。C++编译器的错误信息对新手来说,特别不友好。通常情况下,找出错误的确切原因可能需要一些时间。
我希望垃圾回收器能够成为C++0X中可选择启用的一项,不过在技术上,实现这一点还存在许多问题。
——C++语言之父本贾尼·斯特劳斯特卢普(Bjarne Stroustrup)
垃圾回收没有添加进C++中,手动进行内存管理十分容易出错。开发者需要手动释放内存以及分配内存。我从不怀念自己使用不带垃圾回收语言的编程日子,数不胜数的代码错误如今在支持垃圾回收的编程语言中能被轻易避免。
我创造了“面向对象”这一术语。但我能告诉你的是,C++从来都不是我心目中完美的面向对象语言。
——面向对象编程(OOP)创始人阿伦·凯(Alan Kay)
在上个世纪60年代末,OOP是一种新兴起的冷门技术,当时C++也刚刚起步。不幸的是,不像Smalltalk语言,C++在OOP实现过程中犯了一些严重的错误,直接导致这一个好的想法变成了噩梦。
不过有一点是极好的,相比于Java,至少C++中的OOP是可选项。
图片来源:Mercurial_Rhombus on Reddit
C++是一门复杂的低级语言,它没有自动内存管理功能。由于它过多的特征,新手需要花费大量时间学习这门语言。
C++是在单核计算年代设计出来的,因此只有过去十年添加进去的基础的并发机制。
捕获错误或抛出错误是其首选的错误处理机制。
C++没有为不可变性数据结构提供内置支持。
在C++中,所有引用都可以为空。
C++的初衷是想做一个C语言的更优版,但它并没有做到这一点。
C++似乎对系统编程比较友好。不过,还有很多更好的替代语言,比如Rust和Go,所以C++也不太适用于此。我认为C++没有任何优点,也请随意反驳我。
总之,C++该被淘汰了。
Java是自微软磁盘操作系统(MS-DOS)问世以来计算机领域最令人痛心的事。
——面向对象编程(OOP)创始人阿伦·凯(Alan Kay)
Java首次出现是在1995年,比C++晚16年。相比C++,Java是一门更简单的语言,这也使得它很受人们欢迎。
所属的编程语系: C
比起C++,Java最大的优点之一就是,它支持垃圾回收,所以它能自己消除大量编程错误。
Java已经存在了很长时间了,它对于后端开发有一套庞大的生态系统,这能使开发事半功倍。
我不会在此太深入探讨OOP的缺点,我只会引用计算机科学领域一些杰出的人物对于OOP的观点:
让我感到很抱歉的是,我很久之前发明了“对象”这个术语,它使得很多人都开始关注于这个次要点上。但实际上,更重要的应该是消息传递。
——面向对象编程(OOP)创始人阿伦·凯(Alan Kay)
我认同阿伦·凯的观点,主流OOP语言的关注点有问题,它们关注类和对象,却忽略了消息传递。值得庆幸的是,像Erlang和Elixir这样的现代编程语言还是关注到了正确的点上。
使用OOP编程语言会让应用程序变得更加冗长,可读性下降,描述更少,所以我们很难修改和维护程序。
— Richard Mansfield
我相信任何使用过OOP语言(比如Java或C#)的开发者,在尝试了非OOP语言后,都能深有体会。
显而易见的是,Java在其虚拟机(JVM)上面的启动速度非常慢。我之前见过,在JVM上运行的程序花费了至少30秒的时间来启动。这样的速度对于现代原生云软件而言是完全无法接受的。
大规模程序上的编译速度会更慢,这也极大地影响了开发者的生产力(尽管没有Scala语言那么糟糕)。
从好的方面来说,Java程序在JVM上的运行时性能很不错。
虽然Java是一门十分简单的语言,但它在面向对象编程的关注点,使得它难以成为一门好的编程语言。Java很易入门,但是,如果要写出可靠并且可维护的面向对象代码,开发者需要花费上十年的时间去学习。
Java是在单核计算时代设计出来的,它就像C++一样,只有基础的并发性支持。
在Java中,所有的引用都可以为空。
捕获错误或抛出错误是其首选的错误处理机制。
Java没有为不可变性数据结构提供内置支持。
Java在它刚刚出现那个年代,是相当不错的一门编程语言。但是,不像Scala,Java过于关注OOP。这门语言的代码很冗长,样板代码会带来很多麻烦。
总之,Java也该被淘汰了。
延伸阅读:
现代编程语言终极测评:概述篇
现代编程语言终极测评:二星篇
现代编程语言终极测评:三星篇(上)
现代编程语言终极测评:三星篇(下)
现代编程语言终极测评:四星篇
现代编程语言终极测评:五星篇
译者:俊一