一位拥有20年编程经验的资深程序员,根据自己多年的经验,总结出程序员的编程语言切换规律,并做了一张主流编程语言进阶流程图,展示了不同编程语言之间的继承关系,以及程序员选择编程语言的方向和路径。铁杆程序员,精简的编程语言。时代在发展,编程语言也在与时俱进。新的、更好的或更时尚的语言不断出现,程序员会主动或被动地学习一门新的、“更好”的编程语言。Tailscale_io联合创始人AveryPennarun,拥有20年编程经验的资深程序员,根据自己多年的经验,总结出程序员的编程语言切换规律,做了一张主流编程语言进阶流程图,展示不同的编程语言之间的继承关系,程序员选择编程语言的方向和路径。艾弗里就像小说和人物报道中典型的程序员。他有点偏执,喜欢开玩笑。我已经做了7年的Debian开发,也许这段经历可以说明一些问题。因为Avery的深厚资历,我们也可以从这篇文章中了解到一些编程语言发展过程中有趣的历史传承。我们可以看到图中一共有4条主线,分别是:低级语言,即汇编和C,一种商业或教学语言,即BASIC,一种专门为数学和科学开发的语言,也就是R.Scripting,胶水语言,也就是Shell的一个分支有人可能会说这张图少了HTML、CSS、Haskell和Lisp,但这并不重要,因为Avery并不打算对它们展开.艾弗里提到,一开始,这四类语言有着比较明确的界限。用低级语言编程的程序员用C、汇编或TurboPascal,商业大型程序员用VB(当然当时的“大”和现在的“大”不是一个级别),数值计算人员使用Fortran、R或MATLAB,胶水编程使用Shell或Perl。程序员不会用Perl来写操作系统,也不会用VB来做大数的乘法运算。现代语言模糊了彼此之间的界限,许多用R编写的程序也可以用Python实现。切换语言主要是挑选不同的风格。底层编程语言先来看看传说中的汇编吧。用汇编编写程序是相当困难的,但即使在人工智能蓬勃发展的今天,汇编在某些场景下仍然是一种不可替代的编程语言,所有编译后的语言代码都会被转换成汇编或机器语言。从编译出现了三个分支,风格上有明显的区别,但我们先看C分支。Pascal的特点是“开始...结束”;而C使用{}。花括号的风格影响了后世很多语言,虽然痛恨花括号的程序员不在少数。而C有一种魔力,一旦开始使用,就很容易养成习惯,不管最终效率如何,你总会想用C来实现一切。而C也是为数不多的能够合理实现以上四类编程问题的语言之一,而且速度还不错。C下面是C++和Python2。虽然C++的名字看起来是C的进步,但是风格却大相径庭。Avery抱怨说“用C++是因为很多做商业大型程序开发的程序员别无选择”。而胶水编程就容易多了,Python2入门就可以了。虽然Python很慢,但是Perl的同时代人很多。但作为一名C语言玩家,Avery认为Perl的语法风格只能用怪诞来形容。相比之下,更接近C的Python显然是更好的选择。你不需要花费太多精力来快速适应Python的语法;Python调用C函数的成本比Java等语言低很多!缺点是速度慢,可以调用C模块来缓解。后来出现了Java,一大批C、C++程序员迅速拥抱了Java,以至于Java长期占据了编程语言的第一宝座。Java的缺点是它在运行时非常慢。不过,比起C++超慢的编译速度、令人头疼的头文件、超弱的跨平台性能……这个缺点算不了什么。Go刚出现的时候,有人称它为C++和Java的终结者,其实并没有。Avery说,Go最辉煌的时期是因为Python2程序员发现它比Python运行得更快,占用的RAM比Python少,而且编写代码相当困难。虽然现在Go被认为是一种“系统”语言,但Avery认为Go实际上本质上是一种胶水语言。商业编程语言BASIC是本着“新手容易掌握”的宗旨开发的,学术界却发现很难教有BASIC编程经验的学生编程好,这有点讽刺。当然他们没有选择C,而是选择了更适合教学的Pascal。后来微软把BASIC改成了VisualBasic,选择了我们在Excel中还是用VB,只是改名为macro。后来TurboPascal的作者创造了一种新的语言Delphi,口碑不错,后来又开发了C#。相反,VB.NET可以说是失败得很惨。艾弗里还不忘给了一个非常致命的一击:我真想在VB后面加个箭头,但是抱歉,我真不知道这些程序员跑哪去了。也许切换到网页?或者做Excel宏?胶水编程语言艾弗里说,胶水语言的鼻祖是UnixShell。Unix的设计哲学提倡一次只做一件事。这些功能单一但有用的小模块,可以通过管道连接在一起,完成复杂的“大任务”,有点像蚁群。理想虽然美好,但也不得不输给现实,于是就有了awk这种类似C语法的解释型语言。然后是Perl,它对Internet的兴起起到了非常大的推动作用,同时也借助InternetPerl获得了很大的声誉。人们使用Perl来运行WebCGI脚本,接受HTML请求,然后解析它们。你知道Perl最令人印象深刻的是什么吗?令人眼花缭乱的标点符号!当然,也有人觉得Perl语法丑陋(比如Avery),那他以后可能会选择用Python;相反,有些人喜欢Perl的风格,那么可能会选择Ruby。所以,如果您仍在用Perl编写WebCGI脚本,请继续;或者,您可以考虑使用PHP。前端编程语言JavaScript是一种编程语言,到现在应该是不争的事实。不过Avery指出,由于JS是一个大杂烩,它包含了HTML、CSS、面向对象、函数式编程、动态语言、JIT等等,都是与HTML请求相关的概念,这让这门语言显得特别难看。你能相信一种在20多年前只用了10天就创造出来的语言吗?它显然存在缺陷,并且存在一些无法修复的严重错误。我们回过头来看这张图,注意右下角的Python3和JS:你会看到Python和JS形成了一个循环。两人为何屡屡纠缠不清?Avery说用JS久了容易变态,需要用Python来治疗。(hmmmm...)接下来的TypeScript,可能因为作者是Delphi的开发者,Avery给了TypeScript很高的评价。在node.js出现之前,JS被认为是一种前端语言。而现在它已经变成了前端+后端+命令行的一站式语言。Avery也没有放弃Python3。他说用Python3写系统程序,你会发现自己不断地把unicode转换搞乱,甚至搞乱文件名!发生了什么,就发生了什么。各位亲爱的新智元读者,你们怎么看呢?请留言表达你对Avery路线图的态度。参考链接:https://apenwarr.ca/log/20190318注:本文观点主观倾向性强。在新智元的读者中,可能会有人持有不同的意见,无论同意还是不同意,欢迎留言给出你的意见!
