大话编程语言各种风格 - apenwarr


这是来自apenwarr的“程序员迁移模式”,该文有趣部分是谈到了各种语言特点和尴尬之处,主要是从上下文历史发展角度,观点新颖有趣:
我制作了一个主流编程语言的流程图,说明程序员如何从一种编程语言迁移到另外一种:

上图中红颜色标记了目前最常见的“终端节点”(所谓终端节点是人们在这里停下来因为他们找不到更好的东西)。终端节点是:Rust,Java,Go,Python 3,Javascript和node.js.

如果我们从顶部开始,您可以看到四个主要分支,对应于人们进入编程专业化的路径:

  1. “低级”编程,包括asm和C.
  2. “业务”或“学习”编程,从BASIC开始。
  3. 数值/科学编程,例如Fortran,MATLAB和R.
  4. 脚本/胶水编程,如shell(sh)和perl。

(我们也许可以谈论像SQL这样的“数据库查询语言”,除了真的只有SQL,令我非常沮丧的是,每次试图替换它的尝试都失败了。数据库语言在20世纪60年代陷入困境。,但他们甚至仍然将关键字大写,因为(他们认为)这样更容易理解SQL代码。)

(我也遗漏了HTML和CSS。抱歉。他们是真正的语言,现在每个人都必须学习它们,但是没有地方可以放箭头。我也省略了Lisp系列,因为它从来没有真正流行..)

(而且我跳过了Haskell,因为......好吧,我认为它只是一个漂浮的盒子,没有箭头标识进出,除非你涉及Monads,否则Haskell会排除掉I / O的概念。)

无论如何,让我们回到20世纪90年代,并假装世界很简单,(1)低级程序员使用C或asm或Turbo Pascal,(2)商业程序员使用VB,(3)数字程序员使用Fortran或R或MATLAB,和(4)胶水程序员使用sh或perl。

语言迁移主要是关于风格
让我们看一下开头的树的部分的asm(汇编语言)。Asm是编写程序的一种令人难以置信的痛苦方式,尽管到目前为止,它仍然是编写某些东西的最佳方式(例如,计算机启动后的前几条指令,或中断处理程序的入口代码)。每种编译语言最终都会以这种或那种方式编译成汇编语言或机器语言,即使这种情况发生在App Store内部或手机上运行的JIT中。

当我们抽象超出asm时,发生的第一件事就是分成两个分支:C-like分支和Pascal-like分支。

我们先来看看C. 奇怪的是,一旦人们开始使用C,他们就开始使用它的各种东西。如果你是C程序员,那你下次去向哪里编程?这取决于你使用它的原因。

尽管C ++的名称和语法在哲学上不是很像C语言。除非你是BeOS,否则你不用C ++编写操作系统内核。操作系统人员坚持使用C,至少在Rust到来之前,看起来后者有一些真正的潜力。

但业务(“大型程序”)和数值计算(“快速程序”)的人们喜欢C ++。好吧,对于很多人来说,“喜欢”不是正确的词,但他们坚持使用它,而没有更好的。

对于胶水语言,许多人直接从C(或C ++)跳到python 2,与perl的古怪不同,Python 2是一种熟悉的类C语言,语法更简单。C程序员很容易理解python C模块是如何工作的(以及编写一个新的python模块)。从python调用C函数比其他语言(如Java)更便宜,在Java中,您必须与非引用的垃圾收集器进行斗争。python“os”模块只为您提供C系统调用,这是C系统调用的方式。
唯一的问题是python很慢,很慢。但如果你把它当作一种粘合语言, 你就不会关心python的缓慢 。

另外,当Java出现时,许多C和C ++“商业软件”程序员很快就会使用它。Java运行速度非常慢(虽然不像python,它被宣传为“理论上很快”),但人们乐于付出缓慢的价格来摆脱C ++的长编译时间,头文件疯狂,可移植性不便以及免费使用后错误。

我记得在某处看过Go的发明者最初认为Go会成为Java或C ++的竞争者,但这并没有真正成功。。Java就像那个著名的酒店,也可能来自门洛帕克,一旦你办理入住手续,你就永远不会退房。从C++跳到Java的程序员一般不愿再转到其他语言了,虽然,a)Java比C ++慢一些,b)Java也有垃圾收集,这是一个宗教问题。

Go 之前确实受欢迎的是python 2,事实证明,python的缓慢是一种痛苦。随着计算机变得越来越复杂,python粘合程序往往变得越来越大,然后动态类型开始带来比价值更多的麻烦,预编译你的二进制文件开始得到回报。并且python 2使用了大量的内存,因此Go提供了RAM改进,而不是像从C ++迁移时那样有害。Go并不比python更难写,但它运行速度更快,并且(通常,有些)RAM更少。

如今我们称Go为“系统”语言,因为“胶水”语言让我们想起了太多的perl和ruby,但它们都是做同样的工作,将组件粘合在一起以构成系统。

Hejlsberg因素
让我们看看Visual Basic和Pascal分支。
早在20世纪80年代和90年代,一些人仍然认为编程应该对新程序员来说是平易近人的,因此个人计算机使用预先安装的编程语言免费提供,几乎总是BASIC。

相比之下,当大学教授编程时,他们避开了BASIC,但也避开C.他们赞成Pascal,这后者被认为相当容易学习,看起来像所有那些历史悠久的Algol学术论文,其语法可用于教授关于解析器的课程。所以你有了Pascal学术分支和个人计算PC  Pascal分支这两个分支,但他们的共同点是他们都不喜欢C.

PC上的BASIC(在DOS上)最终成为Windows上的Visual Basic,直到javascript出现可能是有史以来最常用和最受欢迎的编程语言。

与此同时,Pascal设法迁移到个人电脑并受到欢迎,主要得益于Turbo Pascal,这可能是有史以来最快的编译器。他们不是在开玩笑说Turbo。他们甚至让一些C程序员使用它,尽管后者更喜欢C语法,只是因为它太快了。

(Pascal在大学里的学术应用越来越多,后来演变成了Modula和Ada。如果美国军方不采用Ada用于高可靠性系统,那么这个分支可能会消失。让我们今天忽略Ada。)

在历史上,我们有两个主要的“业务”开发人员分支:BASIC分支和Pascal分支。当Windows发布了Visual Basic。用于DOS的Turbo Pascal看起来有点旧,Turbo Pascal for Windows并不是超级引人注目。为了竞争,Turbo Pascal的发明者Anders Hejlsberg创建了Delphi,一个像Visual Basic这样的可视化环境,但是基于Turbo Pascal语言,并且运行时使用更少的可执行的却总是丢失或不兼容的DLL。

在一个意想不到的事件中,最终Hejlsberg从Delphi所在公司Borland跳槽到微软工作,在那里他开始发明C#语言,该语言推出了Microsoft .NET平台,该平台也有Visual Basic .NET变种(这很糟糕)。这统一了两个分支。

不幸的是,如上所述,VB.NET很糟糕。它几乎不像Visual Basic; 它更像是一个较慢的C ++版本,但顶部的语法不太基本,而且UI设计工具更糟糕。C#也不是Delphi。

我认为有趣的是,如果你使用微软首选的基于.NET的平台为Windows编写软件,你可能会使用一种受Hejlsberg影响很大的语言,他发明的语言曾经被微软和Visual Basic杀死了,但是他又杀回来了,杀死了VB。

然后他继续编写Typescript....

胶水语言的简史
最初的粘合语言是Unix shell,因为它引入了“管道”的概念,它将小而简单的工具互连起来,以完成复杂的工作。

事实证明,设计小而简单的工具很困难,而且我们大多没有足够的时间。因此,让你跳过小型简单工具而不是编写扭曲,粘性混乱的语言变得更加流行。(sh语法也有很大缺陷,尤其是在引用和通配符扩展规则方面。)

首先是awk,它是一种可以在shell管道中使用的C语法外观解析器语言。

接下来是Perl,受到了awk的“启发”,因为awk没有足够的标点符号。(好吧,开个玩笑。有点。)

Perl在不断发展普及,一直发展到了perl 5,然后他们决定停止逐步改进语法,而是推出全部丢弃过去并从头开始的perl 6。(Perl 6未显示在我的图表,因为没有人迁移到它上面。)

这使得“胶水”工作的空间在几个方向上断裂。如果你认为perl语法很难看,你可能会切换到python。如果你认为perl语法是惊人的和强大的,只需要一些调整,你可能切换到ruby。如果您使用perl来运行Web CGI脚本,那么,也许您一直这样做,或者您可能放弃并切换到PHP这个新的事物。

没过多久,ruby也会增加Web服务器支持(然后是Ruby on Rails)。Python也是这样发展起来的。

这里发生的事情很有意思:整整一代程序员都放弃了命令行,这本来是胶水语言运行的地方,人们希望在网上做所有事情。在某些方面,这更好,因为例如:您可以从一个胶水程序超链接到下一个。在其他方面它更糟糕,因为所有这些现代网络程序都很慢且无法编写,并且需要500MB的RAM,因为你必须安装另一个Electron的副本......好吧,我想这会把我们带到网上。

网络语言
您可能会惊讶地发现我的图表几乎包含了整个“胶水”分支中的所有内容,这些分支汇集在javascript上。Javascript最初被认为是一种前端语言,但是当node.js出现时,它永远改变了。现在,您只需学习一种语言并编写前端和后端以及命令行工具。Javascript被设计成最终的粘合语言,以某种方式将HTML,CSS,面向对象,函数式编程,动态语言,JIT以及您可以通过HTTP请求进行交谈的所有其他事物联系在一起。

但它很难看。强调向后兼容性对于网络的成功至关重要,这也阻止了人们解决其最严重的缺陷。Javascript在1995年的10天内出炉,它在10天的工作中非常出色,但也有一些错误,我们无法修复它们。

这让我们看到了我的图表中唯一的双向箭头:从javascript到python 3,再回来。我们称之为脚本语言的阴阳。

大多数其他历史胶水+网络语言正逐渐消失,但不是python。至少还没有。我想那是因为......这是理智的。如果你在javascript中编程的时间足够长,那么疯狂就会在一段时间后开始找到你。也许您需要一个压力释放阀,然后切换到python。

同时,如果你在python中编程的时间足够长,最终你将需要编写一个Web应用程序,然后你的前端代码与后端完全不同的语言非常烦人,完全不同的怪癖。一个是['a','b','c'].join(','),一个是','.join(['a','b','c']),你永远不会记得哪个是哪个。

其中一个有一个JIT,一旦它启动就会快速运行,但其中一个启动速度很慢而且运行缓慢。

其中一个有一个合理的命名空间系统,另一个有......好吧。没有。

从长远来看,我不认为python 3可能会击败javascript,但它也不会明显失败。

与此同时,Hejlsberg从未对他的替代现实编程分支感到满意,他看到了javascript的许多问题并引入了TypeScript。与此同时,微软突然停止对本机原生Windows应用程序支持如此咄咄逼人,并开始大力支持Web和开源。这意味着微软第一次将自己的开发人员推向了网络语言,这意味着javascript。他们有自己的TypeScript。

TypeScript会赢过纯javascript吗?有趣的问题,我不知道,我之前打赌过Hejlsberg的语言,而且我总是失败。

Python 2与Python 3
尽管如此,现在我终于可以说出python 2 和 3.它们是非常相似的语言,但不知何故不一样。在我看来,这是因为它们在整个程序员迁移图表中占据了完全不同的位置。

Python 2开发人员来自C和perl的世界,并且想要编写粘合代码。后来补充说,Web服务器是事后的想法。我的意思是,在 python 2发布后网络变得流行,所以这并不奇怪。许多python 2开发人员最终都转向Go,因为他们想要编写的那种“系统粘合”代码是Go适合的。

Python 3开发人员来自不同的地方。事实证明,自python 3开始以来,python的使用已经增长了很多,但新人与旧人不同。由于像SciPy和Tensorflow这样的模块,新人们中有很大一部分来自科学和数字处理领域。对于高吞吐量的数字处理来说,Python实际上是一个非常奇怪的选择,但无论如何,这些库都存在,所以我们就选择了它。我想,python与C模块的轻松集成的另一个胜利。当然,python 3也是以网络为主题制作的。

要了解python 2和3之间的受众差异,您只需要查看不同的字符串类型。在python 2中,字符串是一系列字节byte,因为操作系统以字节byte为单位进行处理。Unix管道以字节为单位。网络套接字以字节为单位。它是系统程序的粘合语言,胶水语言以字节为单位。

在python 3中,字符串是一系列unicode字符,因为人们一直在搞乱unicode转换......当与web交互时,一切都是unicode。进行科学数值计算的人不太关心字符串,做网络编程的人非常关心unicode,所以它使用unicode。尽管如此,尝试在python 3中编写系统程序,你会发现自己经常搞乱unicode转换,即使是在文件名之类的简单事情中也是如此。善有善报恶有恶报。