2

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

 2 years ago
source link: https://www.jdon.com/57155
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
编程语言成功的秘诀是什么? -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 虽然有一个漂亮的开发模型,但太不同了。开发基于修改图像而不是源代码文件。它类似于操纵代表生活环境的数据库。这与人们习惯的完全不同。不管它有多优越。人们会选择熟悉的东西。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK