主流编程语言的变化图,阐明程序员迁移模式。-伟德国际娱乐1946_


我制作了一个干流编程言语的变迁图,用以标明程序员在不同言语之间的切换途径。

关于编程言语,还有许多类似的图能够标明它们相互之间的演进。不过我并不想从言语规划者视点来说明这个问题,而是想从程序员自身来看待言语演化。尽管两者间有些挨近,但并不彻底相同。

从该图能够看出,假如开端运用的是编程言语 A,下一个最有或许切换曩昔的是哪种言语。这种估测不是十分科学。不过假如你需求精确的科学,就不会在这里阅览这篇文章了,对吗?或许这张流程图对我来说,能提醒更多的内容。

声明:在此处,不考虑程序员最喜爱的是什么言语。人们能够在恣意两个言语之间切换,也能够学习许多种言语、然后挑选最合适作业的一种言语。本文中的观念有必定的倾现代舞向性。

在接下来的篇幅里,我所论述的均为个人观念。为了不影响读者阅览,就不再一一做作声明晰。


程序员搬迁形式

我想强调下最遍及的“终极节点”。在这些节点上,人们在他们地点的维度找不到更好的可代替编程言语。这些终极节点包括:Rust、 Java、 Go、 Python 3、Javascript 和 node.js(node.js 作为一种特别的 Javascript,在这里特别指出)。

几年前,我以为 C 也是一个终极节点。或许现在也还能够这样以为,由于有许多的重要项目(如 OS 内核)仍运用了 C,并且能够以为它无可代替。不过有痕迹标明 C 其实是能够代替的。我最喜爱的比方便是风趣的空指针。Linux 内核有611aa个编译器带来的丧命缺点,即 NULL 值“不或许”呈现,因而没有对函数进行空指针查看。C 也是一团糟,其标准里有几个新编程言语所没有的丧命过错。或许某天这些过错能被修正。

让咱们回退几步。假如从顶部开端,依据人们进入编程的不同标准,能够看到四个骨干:

  1. “初级”编程,包括 asm 和 C。
  2. “商业型”或“学习型”编程,从 BASIC 开端。
  3. 计干流编程言语的改变图,说明程序员搬迁形式。-伟德世界文娱1946_算类 / 科技类编程,如 Fortran,MATLAB 和 R。
  4. 脚本 / 胶水编程,如 shell 和 perl。

(咱们也会谈到“数据库查询言语”,比方 SQL。它是鹤立鸡群,全部代替它的测验都以失利告终。数据库言语从上世纪六十时代开端就停滞不前了。乃至到现在,其关键字仍运用大写,由于(他们以为)这样能更好的了解代码。)

(我还疏忽了 HTML 和 CSS。他们是真实的言语,不过现在咱们都开端学习这两种言语,图上无法用相应的箭头来标识。Lisp 也没有考虑在内,由于它一向没有盛行过,尽管有一小部分干流编程言语的改变图,说明程序员搬迁形式。-伟德世界文娱1946_人一向期望它能盛行起来。我还主张增加第五个分类,“装备修改”)

(该图也疏忽了 Haskell。它能够在旁边用一个独立的框来标明,和其他言语之间没有收支的箭头,不过这不要紧。Haskell 是个自嘲式的大笑话,除非涉及到 Monads,它不再运用 I/O 概念。)

不论怎么样,让咱们回到上世纪九十时代。假定那时编程世界很简略,(1) 初级程序员运用 C,asm 或许 Turbo Pascal,(2) 商业程序员运用 VB,(3) 数值核算人员运用 Fortran,R 或 MATLAB,(4) 胶水编程者运用 sh 或 perl。

那时,编程言语便是这么严厉区分的。画该图时,我才意识到这一点。显着,咱们不会用 perl 来写操作体系内核,不会用 MATLAB 来写胶水程序,不会用 VB 来写大型矩阵相乘算法。

现在则改变很大。卡卡挑选什么样的言语现已不再像曩昔那样清晰了。

言语的改变首要是风格的改变

咱们先来看树起点 asm(汇编言语)。用 Asm 来写程序是适当困难的。不过即便到现在,它仍是写某些程序最好的方法(如电脑发动后的开端几个指令,或是中止处理的进口代码)。不论是在 App Store 里仍是手机上的 JIT 里,每个编译言语终究都会将代码编译成汇编或机器言语。

根据 asm,呈现了两个分支:C 类型分支和 Pacal 类型分支。(Algol 呈现的更早,不过此处疏忽掉。声称自己是 Algol 程序员的人并不多。Algol 对其他言语影响很大。)

Pascal 风格分支言语的特色是有 "beg三年自然灾害in…end"。C 风格言语的特色则是有括号。当然,C 影响了许多的编程言语规划,这点在图中没有表现。由于咱们现在评论的是程序员,而不是言语规划人员。

首要来看看 C。很古怪,一旦人们开端运用 C,就习气用它来处理各种状况。不论完结好坏与否,它是为数不多的能合理完结全部四类编程问题的言语之一。这四类都有些难度(除了初级编程,它正是 C 拿手的范畴),不过 C 都能搞定,速度也还能够。

假如你是个 C 程序员,接下来会运用那种言语呢?这取决于用它来做什么。

显着,C++ 是一个挑选。尽管其姓名与语法和 C 很像,但它其实和 C 风格悬殊。除了 BeOS,其他操作体系内核不会运用 C++。在极具潜力的 Rust 运用前,操作体系根本都运用 C 编写。

可是商业(“大型程序”)和数值核算(“快速程序”)范畴的人员喜爱 C++。说喜王瑞子欢不必定精确,但他们别无挑选,只能运用 C++。

关于胶水程序,许多人会直接从 C(或 C++)转到 python 2。我最近也这样做过。和古怪的 perl 不同,Python 2 类似 C 言语风格,其语法更简略。C 程序员很简略了解 python C 模块(并能够编写新的 python 模块)。从 python 里调用 C 函数比其他言语更简略。假如在 Java 里调用,就需求处理非引证计数的废物收回问题。python 的“os”模块供给了 C 体系调用及该调用能作业的环境。程序员能够拜访 C 言语中的过错码并设置相应信号处理程序。仅有的问题便是 python 有些慢。不过只把它作为胶水言语,则能够不考虑 python 的慢速。速度慢时,能够写 C 模块或调用 C 的库或子程序。

别的,Java 面世后,许多 C 和 C++ 商业软件的程序员十分快地切换到 Java。C++ 编译时刻长,头文件繁复,可移植性差,有开释后重用的过错问题。因而,尽管 Java 运转的很慢(和 python 不同的是,Java 声称“理论上运转很快”),人们仍是更乐意运用 Java。

我记住有篇文章讲过,Go 的规划者最开端以为 Go 能够和 Java 或 C++ 比美,但实践没有做到。Java 就像闻名酒店,或是门洛帕克(Menlo Park),一旦入住就不想离店。一同,程序员没有从 C++ 切换到 Java 首要是由于:a)Java 速炒年糕的做法度比 C++ 慢,b)Java 仍有废物收回的经典问题。

Go 在之前现已切换到 python 2 的胶水程序人员中盛行起来。现实证明 python 的慢速是其痛点地点。核算机杂乱度急剧增加,python 胶水程序规划也越来越大。相较其优势,动态类型带来的费事更多,因而人们开端运用预编译二进制。python 2 占用许多内存,因而 Go 做了 RAM 改善,避免了从 C++ 搬迁到 Go 带来的问题。Go 的难度和 python 差不多,但它运转更快,占用 RAM 更少。

咱们现在称 Go 是一种“体系”言语,由于提起胶水程序,咱们更多的是想到 perl 和 ruby,不过它们的作用是相同的。(试试通知一个 C 言语内核开发者,Go 是“体系”言语,看看他们的反响)Go 是粘合剂,能够把各个组件组合到一同成为一个体系。

Hejlsberg 要素

咱们接下来看 Visual Basic 和 Pascal 分支。人们有不同的主意:显着正确的(“我为什么会运用与 C 或 Java 相同让人苦楚的言语呢?”),或显着过错的(“可视化的…Basic?恶作剧吧?”)。二十世纪八十时代和九十物是人非是什么意思时代,一些人仍以为编程应该让新手能够方便运用,因而在个人电脑上预装了免费的编程言语,大部分都是 BASIC。

另一方面,大学教授编程时,则避开了 BASIC(“假如学生前期运用过 BASIC,就不能对学生很好的进行编程授课刑天”),也没有挑选 C。他们更倾向于 Pascal,以为 Pascal 易于学习。就像 Algol 的学术论文里说到的相同,并且它的语法合适教育,能让每个学生都能听懂。因而就有了学术分支和个人电脑分支,不过它们有个共同点,那便是都和 C 不像。

根据 PC(DOS)的 BASIC 演化为根据 Windows 的 Visual Basic,这或许是 javascript 呈现前运用最多、最受欢迎的编程言语。(现在,它仍是在 Excel 中运用的“宏”言语。现在有许多 Excel 的程序员,尽管他们并不以为自己是程序员。)

一同,Pascal 也在极力往 PC 转。由于 Turbo Pascal 的呈现,它变得盛行起来,并一度成为最快的编译器。在速度上,Pascal 确实没有夸大。乃至有一些 C 程序员也喜爱用 Pascal,不是由于喜爱其类 C 的语法,而是由于它的速度很快。(Turbo C 也能够,但速度还不行。它比其他 C 编译器都快。)(大学里,Pascal 学术性越来越强,后来演化成 Modula 和 Ada。假如不是美国军方在其高牢靠体系中采用了 Ada 言语,这个分支早该终结了。现在咱们能够疏忽 Ada。)

那时还有两个“商业”开发分支:BASIC 和 Pascal 分支。Windows 面世后,呈现了 Visual Basic。根据 DOS 的 Turbo Pascal 有点过期,根据 WIndows 的 Turbo Pascal 也并不拔尖。为了竞赛,Turbo Pascal 的酒后头疼怎么办规划者Anders Hejlsberg创建了 Delphi。Delphi 和 Visual Basic 相同,有可视化的编程环境,但它根据 Turbo Pascal 言语,也很少呈现找不到或不匹配实时动态链接库的烦人问题。

Delphi 很好,但它不属于 Microsoft。掺杂商业要素后,局势变得有些困难。在一系列出其不意的事情之后,Hejlsberg 离开了 Microsoft,但仍持续 C# 的开发,发布了 Microsoft .NET 渠道,并包括 Visual Basic.Net(这是个很可怕的产品)。据称 C# 一致了两个分支。

不幸的是如前所述,VB.NET 很可怕。它和 Visual Basic 几乎没有共同点,更像是 C++ 的一个慢速版别,披了件有点非典型 Basic 的语法外衣,还带着一个更糟的 UI 规划东西。C# 也不是 Delphi。不过这几种言语都隐姓埋名了,Microsoft 极力推动了这一点。(除了 Microsoft Office,它到现在仍在运用最开端的 Visual Basic 语法,称为 "Visual Basic for Applications", 即 VBA。比起.NET,它运用的更广泛,更受用户喜爱。)

我不清楚怎样才能叫做一名 Visual Basic 程序员。微软致力于让他们改用 VB.NET,但大多数人并不乐意。我想在图中画一条“他们实践的挑选”的箭头,不过老实说我也不知道应该指向哪里。或许他们干流编程言语的改变图,说明程序员搬迁形式。-伟德世界文娱1946_成为了 web 开发者,或许编写了 Excel 的宏。

从现在看,假如写根据微软主坝坝舞wagcw推的根据.NET 渠道的 Windows 软件,是件很风趣的事。或许运用的言语都会深受 Hejlsbernibbag 的影响。Hejlsberg 的言语在反击之前被微柔和 Visual Basic 所遏止,所以 Hejlsberg 转向写 Typescript,这个留下今后评论。

胶水言语的扼要介绍

开端的胶水言语是 Unix shell,它因引进“管道”概念也很闻名。“管道”衔接简洁的东西来完结杂乱的作业。

啊,便是那些日子

那些日子一去不复返,perl 便是献给它们的悼文

– Rob Pike

现实证明,规划小而简略的东西是困难的,一般咱们没有满足的时刻来做这个。能够让咱们越过这些简便东西,致力于编写独特的、能够粘着许多杂乱无章的小程序的言语变得越来越盛行。(它对 shell 言语的缺点,尤其是与引证和通配符扩展规矩相关的缺点并没有协助。)

第一个是 awk,它是语法和 C 类似的解析言语,能够用在 shell 的管道上。那时,在一种言语(sh)的一行中里运用另一种微言语(awk)有点古怪,幸亏的是咱们习惯了,由于现在的 web 程序都是这样的。(咱们略过 csh,它是另一种与 C 语法不兼容的言语,存在不同的丧命缺点,能够被 sh 代替。)

接下来是 Perl。awk 没有满足多的标点符号,然后促成了 Perl 的发生。(好吧,这仅仅个打趣。)

Perl 开端到 perl 5,越来越受欢迎。现在,Perl 中止改善语法,在 perl 6 上倾尽全力,从零开端打造。(在图中并没有标出 perl 6,由于还没全职关照有人切换曩昔。)

这样的装备给在几个方向断层进行“粘合”留下了空间。假如程序员觉得 perl 的语法差劲,或许会切换到 python。假如他们以为 perl 的语法很奇特有效能,只需求一些调整,则或许会切换到 ruby。假如运用 perl 来运转 web 的 CGI 脚本,则或许会坚持原样,也或许会转而切换到 PHP。

ruby 很快成为 web 服务器支撑的言语(进而是 Ruby on Rails)。Python 也同样在演进。

现在风趣的是:整整一代程序员摒弃了干流编程言语的改变图,说明程序员搬迁形式。-伟德世界文娱1946_命令行方法(这也是胶水言语运转的方法),期望在 web 端能够做任何事情。从某方面来说,这样更好,比方在一个胶水程序中能够超链接到另一个胶水程序。从另一方面来说,则更糟糕,由于太冲穴现在全部的 web 程序都很慢,不能运用脚本,并且装置 Electron 的另一个副本需求 500MB 的 RAM 空间等等。这就引进了 web 言语这个论题。

Web 言语

图中,会集在 javascript 的“胶水”分支有许多的箭头指向,这并不古怪。Javascript 开端只运用于前端。当 node.js 呈现后,这种状况彻底改变了。现在,只需求学习一种言语来写前后端和命令行东西。Javascript 开端的规划是将其作为终究的胶水言语,企图交融 HTML、CSS、面向对象编程、面向函数编程、动态言语、JITs 以及其它全部能通过 HTTP 恳求得到的东西。

可是这样不太好,由于后向兼容关于 web 的成功至关重要。要确保这一点,就无法修正一些严重过错。1995 年,通过 10 天的规划,Javascript 发布了。关于 10 天的效果而言,它适当优异,但一同它也存在一些问题,干流编程言语的改变图,说明程序员搬迁形式。-伟德世界文娱1946_无法对其进行修正。

这便是图中仅有一个有双向箭头的当地:javascript 和 python 3 之间。咱们把它叫做脚本言语的阴阳双面。

大部分呈现过的胶水 +web 言语正在消失,python 不在其列,至少现在还不会消失。我猜是由于 pyt骨折hon 自身是合理的。运用 javascript 编程时刻满足长的话,过段段时刻后就会变得不大正常。这时为了缓解压力,程序员有或许会切换到 python。

一同,假如长时刻运用 python,最终预备编写 web 运用程序时,前端代码和后端运用彻底不同的言语是很烦人的。一个的语法是 [‘a’,‘b’,‘c’].join(’,’),而另一个则变海兔成了’,’.j六独天缺oin([‘a’,‘b’,美瞳‘c’]),这让人彻底记不清谁是谁了。

一种言语有 JIT,能够让其一旦运转起来就会速度很快。而另一种则是发动快,运转慢。

一种有合理的命名空间利维坦体系,而另一种则没有。

我不清楚从长时间看,python 3 是否能打败 javascript。但至少现在看,它不会被打败。

一同,关于编程现实分支从不满足的 Hejlsberg,看到了 javascript 的许多问题,干流编程言语的改变图,说明程序员搬迁形式。-伟德世界文娱1946_引进了 TypeScript。与此一同,微软忽然中止了对 Windows 运用程序的大力推动,开端大面积推行 web 和开源。这意味着 Microsoft 第一次将其开发者面向 web 言语即 javascript。在此根底上,他们有自己的 TypeScript,我觉得这是一种很好的言语。这个分支存在稀有十年,开端和其分支交融,或许不久后会消失。

TypeScript 和 javascript 比,能胜出吗?这是个风趣的问题,我也不知道。我曾经赌 Hejlsb沈石溪erg 能赢,不过我一般简略赌输。

Python 2 和 干流编程言语的改变图,说明程序员搬迁形式。-伟德世界文娱1946_Python 3 的比照

综上所述,我对 python 2 和 3 有了定论。它们很类似,但不尽相同。我以为,这是由于他们在整个程序员言语搬迁图中地点的方位不同。Python 2 开发者来自 C 和 perl 开发人员,期望编写胶水代码。Web 服务器是后续增加的一个运用场景。我的意思是,python 2 呈现后,web 程序变得盛行起来,这并不出其不意。许多 python 2 的开发者转到 Go 的开发,由于他们想写的某些“体系胶水”代码运用 Go 正合适。

Python 3 的开发者是从不同的言语切换而来的。现实证明,python 3 面世后,python 的运用得到很大的开展,不过新参加的人群和曾经的人群有所不同。由于带有模块 SciPy 和 Tensorflow,从科学类和数值类处理转过来的新程序员占了其间很大的份额。老实说,在高吞吐量的数值处理中,Python 是一个适当古怪的挑选。但不论如何,这些库的存在是咱们挑选它的一个原因。我猜 python 的另一个优势则是易于和 C 模块集成。当然,python 3 自身便是网络编程。

想要了解 python 2 和 3 的差异,只需看看其不同的字符串类型。Python 2 中,字符串是一组字节,由于操作体系、Unix 管道处理、网络 socket 的处理均以字节为单位。关于体系程序而言,python 2 是胶水言语,其处理以字节为单位。

在 python 3 中,字符串是一组 unicode 码。由于人们不拿手 unicode 码的转化,而和网络交互时,都是以 unicode 为根底。做科学数值核算的人不关怀字符串,做网络编程的人更关怀 unicode,所以 python 3 运用 unicode。假如要用 python 3 来编写体系程序,就会一向疲于 unicode 的转化,即便最简略的文件名也需求进行转化。这也正是有其因,必有其果。

相关文档

Misunderstanding Exceptions (2007)

You can’t make C++ not ugly, but you can’t not try (2010)

原文链接

https://apenwarr.ca/log/20190318

引荐阅览:

PyTorch 杠上 TensorFlow:谁才是增加最快的深度学习结构?


想看更多引荐阅览?欢迎点击了解更多哦~

评论(0)