编程语言成功的秘诀是什么? -erik


本文讨论影响 C、C++、Java、C#、Perl、Python、Ruby、JavaScript、Objective-C 和 Swift 等语言成功的因素。
20 多年来,我选择了不同的语言,并反思了它们的优缺点。回想起来,我想我可以看到许多常见的模式,说明为什么某些语言成功而其他语言失败。
 
解决痛点
成功的语言倾向于解决困扰开发人员的问题。在早期,性能是一个主要问题,因为计算机真的很慢。C 编程语言之所以流行,很大程度上是因为它允许人们编写快速的代码。相比之下,LISP 和 Smalltalk 由于性能低下而受到阻碍。
C++ 流行是因为它解决了 C 代码的许多问题,而 Java 是因为它解决了许多 C++ 问题。就像 Swift 解决了许多 Objective-C 问题一样。Perl——虽然在今天不那么流行——变得非常流行,因为它极大地简化了 shell 编程。
在很多方面,人们可以说 Python 之所以流行,是因为它为 Perl 造成的混乱提供了一种解决方案。Ruby 通过跳入其中而广受欢迎。在某种程度上,这是一种解决 Perl 痛点的不同方式,同时又不放弃许多让人们喜欢 Perl 的东西。但是你不能不考虑兼容性和熟悉度来谈论这个。
 
熟悉度和兼容性
许多语言旨在用 C 解决问题。最著名的例子是 C++。它使用的语法与 C 非常相似。它甚至与源代码兼容,因此您可以将现有的 C 代码与新的 C++ 代码混合使用。这使得采用变得容易得多。
现在 Java 无法提供源代码兼容性,但它提供了熟悉度。它大量借用了许多人已经熟悉的 C/C++ 语法,同时简化了许多概念。它出现在 OOP 风靡一时的时候,Java 通过承诺在 Java 中你甚至不能编写免费函数来大肆宣传。一切都必须是方法;这就是面向对象的Java!有点愚蠢的噱头,但从营销的角度来看,它的效果非常好。这是一个人们可以理解的简单信息,即使逻辑有问题。
JavaScript 创建者注意到 Java 的广泛流行并接受了 Java 风格的语法。因此,它通过熟悉的语法帮助推动了采用。在语义上它完全不同并不重要。人们是肤浅的,如果语法看起来很熟悉,那么人们认为这意味着它很容易学习。
Perl、Ruby 和 Python 存在于某种平行宇宙中。Unix 不仅带来了 C 编程,还带来了 shell 脚本。对于简单的任务和自动化,shell 脚本比 C 程序有明显的优势。人们开始编写更大的 shell 脚本,而 shell 语法不太适合这种情况。Perl 出手相救。它是一种更合适的语言,但它的语法对于编写 shell 脚本的人来说非常熟悉。因此,任何习惯使用 Bash shell 的人都可以轻松掌握 Perl。
这使 Perl 成为一种用于文本处理的瑞士军刀。它有正则表达式,您可以与它交互工作。它与 C、C++ 和 Java 有着不同的利基。
Python 和 Ruby 是可以利用这一成功的语言。它们也是可以在 Unix shell 中轻松运行的 shell 语言。虽然从 Bash 中移除了更多,但它们仍然提供了对 Perl 程序员来说看起来很熟悉的工作方式。它们可以吸引那些熟悉更合适的语言(如 Java)的人,同时对 shell 友好。
因此,即使源不兼容,它们也建立在熟悉的基础上。
 
垄断
令人惊讶的是,某种垄断安排将一种语言推到了顶峰。例如,JavaScript 作为 Web 语言就被随意地建立起来了。因为它成为了网页的标准,它垄断了客户端 Web 开发。随着 Web 变得非常流行,JavaScript 也必然如此。
Objective-C 和 Swift 是完全相同的其他例子。在 iPhone 大受欢迎并且人们爱上智能手机应用程序之前,Objective-C 是一种相对晦涩的语言,几乎只在 Apple 生态系统中使用。我是早期的粉丝之一。事实上,在 Objective-C 成为 Apple 的一部分之前,我是一个粉丝,因为它来自 NeXT 公司,这是史蒂夫乔布斯在 80 年代被踢出苹果后创办的。
对我来说,吸引力在于 C 的性能与 Smalltalk 的优雅对象模型相结合。当然,这种令人讨厌的担忧并没有真正为一种语言创造大众吸引力。但真正让它变大的是iPhone。Mac OS X 基于 NeXTSTEP,iPhone OS 基于 Mac OS X。在 NeXT 和 OS X 世界中,Objective-C 在 Unix 系统上具有与 C 相同的统治地位。它完全主宰了一切。
事实上,我们可以说 C 之所以流行是出于类似的原因。就像 iPhone 的流行让 Objective-C 流行一样,Unix 的流行让 C 流行。Unix 中所有重要的东西都是用 C 编写的,因此如果你想破解 Unix,你必须学习 C。这就是人们在 70 年代开始做的事情。
斯威夫特是同样的想法。Apple 宣布这是未来,它将取代 Objective-C。这几乎保证了该语言的巨大市场份额。
 
杀手级应用
虽然我提到的因素可能会使语言达到一个不错的流行水平,但可能无法解释为什么它们变得非常流行。通常,语言中的某些功能可以最终构建某种杀手级应用程序。
例如,Ruby 具有强大的元编程功能。这使得构建 Ruby on Rails 成为可能,这让 Ruby 变得非常庞大。
对于 Objective-C 和 Swift,我猜你可以说杀手级应用是 iPhone 应用。
很难对 JavaScript 做出相同的结论,因为它的 Web 垄断将始终确保其主导地位。然而我认为可以说 Node.js 是一项真正巩固了 JavaScript 地位的开发。
虽然 Python 长期以来一直很受欢迎,但真正让它走红的是数据科学和机器学习的兴起。这些领域需要交互式解决方案。编译语言不太适合。Python 已经将 NumPy 和其他解决方案用作杠杆,并且没有面临太多竞争。JavaScript 被锁定在 Web 上。Perl 是一种只写语言。Matlab 是商业化的,并且在牙齿上变得很长。并且都没有提供 OOP 或函数式编程,只是简单的旧过程编程。Lua 主要适用于嵌入,没有丰富的库生态系统。R 有古怪的语法和混乱的生态系统,对程序员没有吸引力。
然而,你可以说 R 变得相对较大,部分原因是数据分析的兴起和大数据成为行业的主要痴迷。
 
易于学习和使用
一门语言可以解决很多痛点并提供很大的优势,但如果它不易于使用和学习,它就无处可去。请注意,这两件事并不总是相同的,取决于上下文。例如,C++ 是一种极其复杂的语言,而且并不是很容易使用。那么它到底是如何变得如此受欢迎的呢?
因为它依托于 C 的成功。对于有 C 经验的人来说,学习 C++ 不会那么难。当 C++ 流行起来时,它是一种比今天简单得多的语言。在这里,临界质量和社区的概念开始发挥作用。成功推动着自身的成功。一旦一种语言拥有一个庞大的社区、教程、大量用它编写的软件、愿意雇用的公司,那么该语言几乎不管其缺陷如何都会继续发展。但是您不能仅仅将 C++ 的成功归因于它的社区,因为这并不能解释它最初是如何获得该社区的。
同样重要的是要注意,易用性也往往是肤浅的。例如,Objective-C 是一种比 C++ 简单得多的语言。然而人们通常会认为 C++ 更容易学习,因为它的语法看起来更熟悉。熟悉是强大的驱动力。
Java 在今天可能不是那么简单的语言,但是当它出现时,它看起来比 C++ 有了很大的改进。开发人员不必了解引用、指针、指向指针的指针、地址运算符以及使 C++ 开发变得复杂的各种低级内容。
在这方面,Go 编程语言是 90 年代的一种似曾相识。它是一种非常简单的最小语言,但它不会像 Java 那样受到 OOP 炒作的影响。相反,它试图更紧密地遵循 C 的哲学。我记得 Go 出来后不久就尝试过。当时我是一名 C++ 开发人员,但我用 Python 编写了一些有用的小型命令行工具来帮助我的工作流程。
我记得在短短几天内就学会了Go。
我很惊讶我能以多快的速度用它来处理严肃的事情。对于任何做过 C 和 Python 编程的人来说,这些库和语法似乎都很熟悉。这几乎有点像使用脚本语言。我记得它很快取代了 Python 作为我的小型实用程序的 goto 语言。静态类型检查有助于捕获错误,但它不会像在 C++ 中那样扼杀生产力。当时对我来说很明显 Go 会成功。它快速学习、熟悉、具有性能并解决了真正的痛点,例如使并发变得容易。
那时我实际上并不关心并发性。我只是在比较 Julia、C#、Java、Erlang 和 Swift 中的并发系统时才尝试了 Go 并发。那时我才意识到 Go 取得了多大的进步。
然而,我认为 Python、Ruby 和 JavaScript 的兴起也很大程度上归功于学习这些语言的便利性。
 
那些未能成功的
这让我想到了那些没有做到的,例如 Haskell、Standard ML、OCaml、F#、LISP、Scheme、D 和 Smalltalk。所有这些语言都很棒,可以解决实际问题。然而,尽管经过多年努力,他们从未真正取得任何进展。为什么?
Haskell 是一种吸引各种编程极客的语言。在很多方面,我只是那种应该写大量关于 Haskell 有多棒以及 Haskell 革命即将来临的故事的人。然而,我几乎从未写过关于 Haskell 的文章。为什么?
也许是因为我也是 UX 的忠实粉丝,有时会写一些关于可用性和用户界面设计的文章。从某种数学和技术的角度来看,Haskell 看起来像是天才的杰作。然而,从可用性的角度来看,我会给不及格的分数。
是的,它具有数学优雅和简单性,这使它与 C++ 的混乱非常不同。然而,高层次的抽象数学,无论是优雅的,都不是一般人能轻易掌握的。然而,尽管语言多么混乱,人们还是可以学习英语。英语的拼写毫无意义,完全缺乏一致性。然而,人们可以解决这个问题。尽管在概念上更简单,但向人们教授微积分要困难得多。
这就是许多这些语言失败的地方。它们通常具有数学之美,但它们的构建方式并不适合我们凌乱的大脑。对于那些得到它的人来说,这似乎令人沮丧。看似涅槃是在我们的掌握之中,而人却似乎只是顽固。有时,您可以简单地聪明地了解普通人面临的挑战。
我个人认为 LISP、Scheme 和 Smalltalk 应该有机会。但在他们的情况下,我不认为这是学习的困难,而是缺乏熟悉度。与编程世界已经习惯的语法相比,它们都有奇怪的语法。另一个是时机不好。他们根本无法提供到达时所需的性能。这也是开源项目和互联网出现的时代。这导致了很多阻碍进展的碎片化。
Smalltalk 虽然有一个漂亮的开发模型,但太不同了。开发基于修改图像而不是源代码文件。它类似于操纵代表生活环境的数据库。这与人们习惯的完全不同。不管它有多优越。人们会选择熟悉的东西。