Eric Raymond-几种计算机语言的评价
2010-03-27 11:08:05 阿炯
编程新手都有一个同样的问题:我应该学习哪一种语言?
《Unix编程艺术》(Eric Raymond著)在第十四章中对各种语言进行了评价,正好可以用来回答这个问题。下面是知名IT博客阮一峰的网络日志,整理了六种主要计算机语言的优缺点。读完就会知道,对于不同的任务,应该选择哪一种语言了。
====================
几种计算机语言的评价
作者:Eric Raymond
摘自《Unix编程艺术》(第十四章)
一、C
C语言的优点是,运行效率高和接近机器语言,它特别适用于以下几种程序:
1. 对运行速度要求很高的程序。
2. 与操作系统内核关系密切的程序。
3. 必须在多个操作系统上移植的程序。
除此之外,学习C语言有一个最大的理由,那就是它能帮助我们学会,在硬件层次上考虑问题。如果你想以编程作为自己的人生事业,C是一定要学习的。C的最大缺点是,在编程过程中,你不得不花很多时间,考虑与你要解决的问题完全无关、且非常复杂的硬件资源管理问题。
二、C++
C++在80年代中期推出,支持OO(面向对象编程),原意是作为C语言的取代者。但是它没能做到做一点,原因有以下几个:
1. 它也没有解决内存管理问题,虽然比C有所改善。
2. 标准化不成功。各个编译器都只支持自己选择的一个子集,导致跨平台性不如C。
3. 过分的精细和复杂了。C++的复杂度,超过了C和OO的复杂度之和。
4. OO并没有带来多少优势,反而带来了一些副作用,比如厚重的胶合层和庞大的代码体积。
总的来说,C++的优势还是程序效率,以及面向对象编程能力,糟糕之处是它鼓励复杂的设计。
三、Shell
Shell程序写起来很容易,对于简单的任务,开发速度很快。当程序变大时,它就不太适合了,很难维护,而且将变得非常专用(只能在你自己的机器上使用),因为Shell必须调用各种外部程序,无法保证每一台机器都同样安装了这些程序。
最常见的Shell是bash,它的一些语法规则很混乱,会产生很难阅读的代码。另外shell能在泛Unix上使用,无法跨平台。Shell的最佳用途如下:
1. 执行简单的系统管理任务。
2. 编写系统启动时的初始化脚本。
3. 作为其他语言开发的程序的包装器。
四、Perl
Perl发布于1987年,基本上就是一个增强的Shell。它的最大长处是强劲的文本处理能力,无以伦比的正则表达式支持,而且有全套Unix API的内部支持,显著减少了对C的需求。Perl的主要缺点是某些部分设计得非常丑陋,且无法补救,某些部分也过于复杂。当程序规模增大时,必须严格遵守约定,才能保证模块化和设计的可控性,难于维护。
Perl看上去很神秘,但如果用它来完成一些简单的任务也是相当直接的。对于简单的编程而言来说 Perl 就象一把瑞士军刀,其语法和 C 语言很象。在 MS-Windows 下 Perl 也有一流的解释器,所写的代码是可以跨平台的。Eric Reymond 是这样描述他:“Perl显然是现代脚本语言里面的一个 800 磅的大猩猩。它大部分被系统管理员用于替代 shell 脚本语言,一部分这要归功于它对 UNIX 库函数和系统调用的包容,另外这也要归功于非常活跃的 Perl 社区开发的大量的模块”。Larry Wall 是Perl的创建者,被任为是开放代码源社区的重要领导者之一,并且总是被任为是黑客崇拜者的罗马神殿里仅次于 Linus Torvalds 和 Richard Stallman 排名第三的人物。
Perl之父,Larry Wall
拉里·沃尔于1954年9月生于美国加州洛杉矶,是程序员、系统管理员、语言学家和作家,他最为人知的地方是他设计的编程语言Perl。亦是用来阅读Usenet新闻群组的程式Rn的作者,又是一支开放源码界的重要程序patch的作者,这两支程序奠下了他在黑客和开放源码界举足轻重的地位。他得过两次IOCCC(全球难以读懂C程式码比赛)的胜利,亦是第一届自由软件奖(Free Software award)的得奖者。
拉里·沃尔是个幽默的人,他经常在程式码的意见或Usenet里展现这个特点。他曾受语言学的训练,这点帮助了他写书,亦帮助了他在Perl的设计。他是Programming Perl(通常被称为”骆驼书”)的共同作者之一。所有他编辑过或是共笔作者之一的书籍都是由O'Reilly出版。
五、Python
Python发布于1991年,是一种与C语言紧密集成的脚本语言。Python的优点是非常干净优雅,鼓励清晰易读的代码,易学易用;提供了面向对象编程的可能,但并不把这个选择强加于设计者;具有出色的模块化特性,同Java一样,适合用来做需要协同开发的大型复杂项目。在很多方面,它都比Java简单。此外,Python标准中包括了对许多网络协议的支持,因此也很适合网络管理任务。其缺点主要是效率低下,速度缓慢。在执行速度上,它不仅无法与C/C++竞争,而且也不如其他主要的脚本语言。但是,这其实并不是一个严重的问题,有时网络或磁盘的延迟,会完全抵消Python本身消耗的时间。而且因为Python特别容易和C结合起来,因此性能关键的 Python模块,可以很方便地转化成C语言来提高速度。
Python之父,Guido van Rossum
总的来说,对于小型项目和大量依靠正则表达式的项目,Python不如Perl的表达能力强。至于更小的项目,Python则是大材小用,Shell也许更适合。
六、Java
Java发布于1995年,设计目标有两个。
一个是write once, run anywhere(一次编写,到处运行),即不依赖于特定的平台;另一个是在网页中嵌入交互程序(applet),可以在任何一个浏览器中运行。由于它的所有者Sun公司的一系列失误,第一个目标并没有完全实现,第二个目标则是彻底失败。但是Java依然在系统编程和应用编程方面非常强大,足以挑战C和 C++。Java的优点是比C++小巧简单,可以自动管理内存,支持类似C的语法和OO编程,与C程序的结合也很好。Java的缺点是某些部分过于复杂,比如内部类和匿名类的运用会产生很混乱费解的代码;某些部分功能不完善,也无法利用操作系统提供的功能接口,比如在Java中读取和处理文本文件,并不像其他语言那样容易。此外,Java配置环境和版本的混乱,也让人很头疼。
Java之父,James Gosling
总的来说,除了系统编程和某些对运行速度要求很高的编程之外,Java都是比C++更好的选择。如果和Python相比,Java可能在大型项目上 有优势,但是也不是绝对的。
上文转自阮一峰译文。
为什么会有这么多编程语言?
在编程语言如此丰富的今天,相信许多开发者都有过上面的疑问。不过早在 1960 年代初,人们就已经提出了这个问题。
《ACM 通讯》期刊近日发表了题为《Why Are There So Many Programming Languages?》的文章,作者在文中指出了一个重要原因:公司基于商业利益的诉求,希望控制编程语言,所以会发明由自己主导的语言。除了公司对于控制和财富的诉求,编程语言之所以如此多与当时的技术环境和水平密切相关。现在许多看起来理所当然的事情在过去并非如此,早期计算机的存储、内存和处理能力都是有限而昂贵的。人们不得不费尽周折,只为到计算机实验室,通宵熬夜以获得计算机使用时间。
在那个时代,编程语言通常是为某些任务或工作而设计的,编程语言的命名也更简单 —— 因为命名空间尚未被开发。在 1950 年代和 1960 年代,最初的程序可以 “奢侈地” 用其所作的事情精确命名:FORTRAN(公式翻译器)、COBOL(面向商业的通用语言)、BASIC(初学者通用符号指令代码)、ALGOL(算法语言)、LISP(列表处理器)。大多数人可能没有听说过 SNOBOL(面向字符串和符号语言,1962),但是通过名字稍微猜测就可以知道它的用途。如果那个时代对面向对象的编程概念有更多了解,相信会有人使用 “OBJOL” 之类的名字命名 —— 明确命名为面向对象语言,至少按照那时的命名模式会是这样。如今更多的编程语言在许多方面都像是重新造轮子 —— 它们许多都是满足下面属性的多种组合:
License:开源;商业
平台:操作系统、硬件支持
语言范式:面向过程、函数式、面向对象等
类型系统:动态、静态等
并发:单线程、多线程
内存管理:垃圾回收(自动或手动)
执行:解释、编译到虚拟机、原生编译等
……
编程语言越来越“高级”的另一面
编程的时候,经常在关注内存问题,比如堆和栈的区别、内存分配与释放、指针问题、内存泄露问题等等,但为什么作为执行程序的核心角色——CPU却很少去关注它,这其实是编程语言越来越“高级”的结果。事实上在几十年前,那时候没有现在这么多高级语言,很多编程大佬们都是徒手写汇编,就必须得关注CPU。以熟知的Intel x86架构为例,思考这几个问题:
1.长跳和短跳有什么区别?
2.中断门、任务门、调用门分别是什么,有什么区别?
3.x86的CPU有哪些常用寄存器,分别是做什么用的?
4.虚拟地址、逻辑地址、线性地址、物理地址分别是什么,有什么区别?
用汇编语言编程,太复杂且开发效率低不说,更恼火是辛苦写完后换个CPU平台还没法通用。后来计算机工程师们开始思考:编程为什么还要考虑CPU?得把这些东西屏蔽掉!所以高级语言应运而生了,从那时起,程序员们编程基本不用考虑CPU了,这些底层的细节,编译器和操作系统都给封装好了,提供一致的调用接口,只需要调用操作系统提供的编程接口就好了。再后来,程序员们觉得面向操作系统编程也很麻烦,遇到了上面与CPU同样的问题,不同操作系统的编程API完全不一样,应用编写完成后从Windows换到Linux,又不能用了!计算机工程师们又开始思考:为什么还要考虑操作系统、内存这些东西?于是直接面向虚拟机、解释器的语言又出来了。
如果你是Java、Perl、JavaScript的程序员,想想在编程的时候会关心操作系统,会关心内存管理吗?估计以后会有人提问:为什么编程很少关注操作系统了,为什么编程很少关注内存了?
时代在发展,功能封装了一层又一层,现在的程序员,越来越少去关注底层的东西了。但这也造成的一个后果就是,开发的门槛降的越来越低,不需要学《计算机组成原理》、《操作系统》、《数据结构与算法》这些计算机基础课程,只需要《21天从入门到精通》就可以进入这个行业。
七十年编程语言发展漫谈
本节源于腾讯技术工程博客,严谨起见,本文提到的“编程语言”指的是“第三代高级编程语言”。从时间维度入手来简述编程语言,一图胜千言。从截止2023年2月主流的编程语言中,挑选出流行的,具有历史影响力的,按时间从上往下排序,依据类型和指导思想进行聚类,根据互相的影响使用线条指向,并补充了一些关键性的特征和评价,整理下图:
整理的过程中发现很多有趣的点,按时间顺序从上往下讲这张图。
1950-1959:这期间出现了第三代高级语言的鼻祖:Fortran 和 Lisp。并且在 1958 年已经提出了结构化编程,递归、异常、函数式、命令式、垃圾回收等目前常用的概念。现在用到的大部分语言特性的理论的出现比我想象的早。
1960-1969:这一阶段,IBM 的 ALGO 系列语言主要是对理论概念的探索和实践,经过两个版本后诞生出 ALGO60 里程碑式的作品,奠定了现代高级编程语言的基础。同时也有 Basic 语言希望降低编程门槛的探索,并第一次引入了“类型后置”的语法以更符合人类阅读习惯。
继续往右看,发现一个独特的系列:CPL 和 BCPL:这两个语言首次阐释了“特性不是越多越好”的黄金原则,因为拉长时间看,CPL 是第一个想成为大而全的语言。从 CPL 到 BCPL 到 C,都是在不断的减少特性;从 C 到 C++再到 C++20,特性又在不断的增加,这时你就会明白为什么 C++委员会对添加新特性是那么的谨慎和小心,但是这都阻挡不了让 C++变成下一个 CPL 的步伐。1967 年诞生的 Simula64 提出了面向对象思想,面向对象思想开始发展。
1970-1979:这一年诞生出两个影响力极大的语言:Smalltalk 和 C。巧合的是这两个语言都是在 1972 年发布的。Smalltalk 一定程度上继承了 Basic 远离机器靠近人类的探索,发扬了语言动态性的思想,探索了面向对象的思想,模糊了编译型语言和解释型语言的界限,对后续的动态语言,脚本语言,客户端语言产生了深远的影响。
C 语言的诞生是为了满足 Unix 而设计的,当时 Unix 使用 BCPL 或 B 语言都无法满足操作系统对编程语言的要求,因此 C 语言应运而生。抛开语言特性,我们也能发现 C 的优势有非常多:不但有需求(开发操作系统的动机),还有经验的加成(尝试了 BCPL 和 B 语言,积累了大量的应用经验),并且遇到了好项目(Unix 操作系统),被最聪明的一群人使用(Unix 操作系统开发工程师),注定了 C 具有强大的生命力。这期间编程语言的思想已经成熟,面向对象思想在 Smalltalk 的推动下,成为下一阶段新语言首捧的特性。
1980-1989:由于面向对象在 GUI 领域具有独特的优势,借着这十年图形界面交互的高速发展的东风,面向对象思想发展进入快车道。这十年是面向对象思想横行的十年。还记得上个十年的 Smalltalk 和 C 吗?Smalltalk+面向对象诞生了 Self;C 语言+面向对象诞生了 C++;而 Smalltalk+C 语言+面向对象诞生了 Objective-C。苹果公司选择 Objective-C 作为其生态原生语言,使得我们在 2022 年还在写 Objective-C 的代码;C++和 Objective-C 对 C 语言的 100%兼容,使得这两个语言可以充分继承 C 语言的生态和人才,但是 Objective-C 的语法实在太别扭了,Objective-C 的关键字数量众多,并且语法没有一致性可言,在没有 IDE 补全环境下是最难写的语言。1987年12月18日发表Perl是高级、通用、直译式、动态的程序语言。
C++保留了 C 语言的语法习惯和设计原则,从 C 切换到 C++几乎没有学习成本,并复用了 C 的生态,这使得 C++迅速流行起来。面向对象的思想在当时来看是实用且先进的,但是现在我们发现基于面向对象思想后面发展的各种设计模式开始把代码玩出花来了,需要学习设计模式的就那几个架构师,但是现在人手一本设计模式,把大象放到冰箱里这么简单事情都要先写一堆的抽象,把看代码把人绕晕...... 当然,这是面向对象思潮的后话了。这也导致后来很多人投向简单直接的 C 了(做了这么多项目下来,发现面向对象很多时候是过度设计的源泉)。
1990-1999:这是编程语言发展最快速的时代,得益于计算机平民化和图形界面的发展,计算机进入千家万户,应用开发的需求激增,编程语言的诉求开始发生变化:对性能要求变弱,而对安全(内存安全,线程安全),人性化(可读性,表达力,低门槛),动态性等提出更高要求。首先登场的是 VisualBasic,强化了 IDE 和编程语言的结合,降低了应用开发门槛。接下来目前非常火的 Python 也诞生了,Python 诞生在关键字和语法越来越复杂的年代,于是反其道而行之,追求简洁的语法,最具有标志性的是为了省略“{}”直接用空格缩进来划分代码块(这种语法首创是 1966 年的ISWIM语言);有趣的是,Python 追求的简洁语法不是其成功的关键(由于 IDE 的进步,这种语法的形式核心价值已经消失),Python 成功的关键在于其出色的扩展性和跨平台,这让 Python 长期稳解释型语言头把交椅,并且后来的同类语言都很难超越;另一方面,Python 提出的“一件事最好是只有一种方法来做”理念贯穿语言设计也成就了其优秀的学习曲线和低门槛的优点,一门语言能让人快速上手也是其核心竞争力呀。
时间来到 1995 年,这一年诞生了四个我们耳熟能详的编程语言(JavaScript;Java;PHP;Ruby),我们把编程语言发展最快速的时代颁发给这个时代绝对不为过。Java 对 C++做减法,增加了安全性,成为历史上最成功的语言之一,嵌入式、客户端、后台都有 Java 的身影。但是这种成功不会持续太久,Java 涉及领域太多了,语言特性博而不精,这注定了 Java 在 20 年后的没落,话又说回来,能在主流编程语言连续 10 多年榜上有名,已经完成了 Java 的历史使命。
JavaScript 逐渐发展为浏览器上的原生语言,乘着 Web1.0、2.0 的东风,和低门槛的学习成本,以及解释型引擎的发展,JavaScript 已经突破浏览器领域的限制,几乎无所不能,前端开发者们拿着 JavaScript 一次又一次的向客户端和后台阵地发起冲锋,ReactNative、Node.js 等技术炙手可热;随着硬件和脚本引擎的进步,就连曾经全用 C++编写的 QQ 客户端,现在也投入 Electron 的怀抱了;但是我们从现在的角度看,JavaScript 的不少地方已经落后于时代,我们急需一门新的语言或者革命来代替它。
2000-2010:这是 PC 互联网的高峰和移动互联网的萌芽的时代,也是我们记忆深刻的时代。C#在 2000 年首发,微软基于 C++和 VB 的经验,借鉴 Java 推出了浓墨重彩的 C#,我们站在历史的高度可以说.Net 是失败的框架,但是这都难以掩盖 C#的光辉;C#和 Java 同样是对 C++做减法,但是在很多细节上 C#相对 Java 更接近 C++;由于 C#搭上了不争气的搭档.Net,不像 Java 那样一开始就那么成功,塞翁失马,反而让 C#的历史包袱非常轻。
C#在接下来的编程语言发展中多次成为第一个吃螃蟹的人,C#给现代语言带来了非常多理念和思想,从 C#1.0 到 C#11,几乎一年一个版本,这发展速度其他编程语言只能望其项背。第一次接触可空类型(空安全),??运算符,dynamic 类型都是在 C#,笔者从事 windows 开发近十年,从学术角度来看,笔者对 C#的喜爱溢于言表。但是从工程角度来看,.Net 和 C#支持跨平台,但是他俩动作总是慢半拍,错过了 PC 互联网和移动互联网的机会,只在 Windows 平台流行了。
C++作为通用语言真的太成功了,但是它已经不是一门高安全性高人性化的一门语言,开发出更友好的安全的"C++"变得迫切起来,这时出现了很多新的语言蠢蠢欲试,其中包括 D 语言和 Rust:D 语言是 C++编译器作者设计实践的一门新语言,吸收了很实际项目的 C++经验教训,但是仔细了解 D 语言你会发现,这就是拿 C++编译器魔改的一个”私有 C++语言“编译器;这也导致很多 C++的弊病不能彻底废除,属于改良派。
过了 3 年,Rust 横空出世:Rust 在理念上有很大的进步,比如虽然没有垃圾回收器,但是强制使用者明确对象的所有权,通过所有权编译器可以在合适的时机释放内存:这是第一次流行语言不使用垃圾回收方式解决内存管理问题,在性能上比垃圾回收有着极大的优势,虽然性能无损,但是相比垃圾回收模式则需要开发者编码时增加对象所有权的思考过程,即便如此,这也比在 C++花几个星期解决内存访问异常的问题好多了呀。Rust 属于改革派,重新审视 C++的应用场景,对语言特性重新设计,这真的是一次精彩的尝试!Rust 也比 D 语言更加成功。
到了 2007 年,对后台影响深远的 Go 语言诞生,当时大部分后台还是用 C++或者 Java,我们前面说了 Java 注定会被替代,Go 首先在后台开发常见吹响号角,后面还会提到 Kotlin 在客户端尝试替代 Java。Go 的诞生是一个非常好的时间节点,除了剔除很多 Java 的弊病,还直击应用场景的痛点,在性能(多核,网络,并发)上着重发力,前进了一大步!另外 Go 在工程上的成功容易掩盖其了语法特性上的新尝试:Go 语言是近代第一个捡起类型后置的语言,提供了丰富的语法糖(如:=)使得代码简短并语义明确,这直接影响了后面的 Swift,Rust、Kotlin 等有着改革雄心的语言。Go 的成功除了 Go 的优秀因素外,我们也发现:瞄准细分应用场景的语言在工程上是非常具有活力的。
2011-2020:移动互联网的快速发展的时代,这个时代最需要的是提高移动端高生产力语言。首先登场的是 Android 平台的 Kotlin,Kotlin 是 JVM 语言,能直接复用 JVM 的生态,Kotlin 和 Java 有点像当年的 Objective-C 和 C 的感觉,但是不像 Objective-C 和 C 能混编,Kotlin 重新设计了语法规则,大大提高了可读性和安全性。3 年后苹果公司也交出 Swift 的答卷,Swift 被简单的形容为 “没有 C 的 Objective-C”,Objective-C 花了 30 年,终于摒弃了 C 语言的影响。
新的语言不能没有成熟生态的支持,和 Kotlin 与 Java 同是 JVM 语言不同,Swift 使用桥接(Bridging)的方法得以复用 Objective-C 的生态,这未尝不是一次创新的尝试,可以让 Swift 没有任何包袱重新设计。Kotlin 和 Swift 都选择了更适合于阅读的类型后置,更简洁的语法,更丰富的语法糖来提高可读性和语义准确性。对于现有的大型项目的开发人员来说,从 Java 到 Kotlin 或者从 Objective-C 到 Swift 有点稍微难以适应,我们被 C 风格语言荼毒了这么久,突然不荼毒了会很不习惯。
在这个时期诞生的 Dart 旨意成为 Javascript 的接班人,但是关注度不多,随着 Flutter 的火热,Dart 也进入了大众的视野。Dart 与 Kotlin、Swift 彻底断舍离 C 风格不同,Dart 仍然选择 C 语言风格;在笔者看来,现在大部分项目都会由多种语言编写,保持和 C 语言风格在多语言项目中也许是一件好事:前段时间笔者经常在 iOS、Android、PC、Mac 四个平台编写代码,涉及语言不限于 Java,Kotlin,Objective-C,Swift,C/C++,Dart,语言风格一天切换好几次,这反而非常不人性化。Dart 没有很好的成为 JavaScript 的接班人,谁能想到下一年的 TypeScript 火起来了?TypeScript 选择和 Dart 不同的方法接班,相比 Dart 激烈的方式,TypeScript 完全兼容 JavaScript,TypeScript 增加一些语法让编译器把错误提前暴露,大大增强了 JavaScript 的安全性,给 JavaScript 狠狠的续了一命,让 JavaScript 可以继续祸害程序员们。话说回来,Dart 在安全性、性能、都给 JavaScript 带来巨大的进步,也祝福 Dart 最终能顺利接班。
2021-今:除了新语言的诞生,我们也不能忽视每个编程语言都在不断的发展和变化,在 2022 年谷歌推出的 Carbon,该语言旨在修复 C++的几个明显缺点,提高 C++的可读性、安全性,并平滑语言的学习曲线。Carbon 和 D 语言有点相似,属于对 C++现代化的改良派,但是和 D 语言不同的是 Carbon 有个好爹,并且通过“双向互操作性”融入 C++生态的同时抛弃 C++历史包袱,并使得语言的语法可以重新设计。
从 Java 被逐渐替代的经验教训中我们发现,目前 C++在应用层正处于城池渐失的状态;我们应该明白,应用层和底层框架的需求不同,不应该从顶到底都使用一套语言,现在 C++所失之城池就是新语言非常好的机会,抓住应用层的安全、人性化、和与 C++的双向互操作性,Carbon 确实是准确找到了定位。简而言之,对谷歌的 Carbon 还是非常期待的。
除了在应用层 C++有待进步,即使在底层场景,C++也有很大的进步空间。2022 年,Herb Sutter 的实验项目 CppFront 值得一提。简单来说,CppFront 通过给 C++增加一层预处理语法规则(cpp2)来提高 C++的易用性和安全性。和 Rust、Carbon 不同,Herb Sutter 的这个实验项目不是寻找 C++的代替者,而是 “寻找突破界限的方法,使 C++ 本身向前发展,并加倍努力使用 C++,而不是切换到其他东西”。这是个为 C++标准探路的实验项目,有这么丰富的理论和实验,下一代 C++标准必然能焕发出新的活力。但是也别太奢望 C++能回到从前那样样能手的辉煌,历史的经验告诉我们大而全的语言最后都会被替代。
小结一下这 70 年的发展趋势
前面从时间维度简单的从上往下捋了一遍,不难看出,主流通用编程语言主要受 2 个成熟语言(Smalltack 和 C 语言,且都诞生于 1972 年)的影响,有的语言被某个影响深一些,有的两者都汲取;接着主要往更安全、人性化、跨平台这三个方向进行发展,而在性能,语法,重用生态、扩展性,IDE 友好等多维度各有发展、取舍、借鉴。同时我们也发现:编译型和解释型语言边界逐渐模糊,语法流行交替更迭,语法语义更加明确,语言的目标领域更加细化。别看近十几年新语言出了那么多,语法花里胡哨,其实很多语言同质化严重,类型后置也是早就玩过的,每个时代流行不同罢了。前面我们顺着时间简单过了一遍图中的部分语言,图中的信息远不止我们这里讨论的内容,限于篇幅还请点开大图品读。
展望未来二十年发展趋势
还是那句话,编程语言的发展离不开计算机领域其他技术的发展。编程语言发展至今,特性的互相借鉴的情况越来越普遍,语言生态互通也更常见(如直接兼容,或者 Bridging 技术),编译型和解释型界限也越来越模糊(比如 Dart 既能编译运行也能解释运行,还能边解释运行边编译),语言之间的性能差异也越来越小(V8 引擎,JIT,硬件性能提高),语言之间的互相转换也开始普遍(Kotlin to Java to JavaScript,Dart to Javascript),甚至在 AI 的加持下,准确的把具有垃圾回收语言(如 Kotlin)往没有垃圾回收语言(如 C)的转换也变得可能。
如果使用 AI 做预处理,静态检查和类型安全的语言没有了优势;如果使用 AI 辅助编程,我们甚至不是在写代码,而是在跟 AI 聊天(如最近很火的 chatGPT)!这时你还会纠结 AI 在使用什么编程语言吗?高级编程语言发展的黄金时代即将落幕,我们很难再看到像垃圾回收,空安全,异步等让我们兴奋不已的新语言特性了。当然,编程语言还是会继续往更安全、人性化(可读性、可写性)、跨平台这三个方向进行发展,但是 AI 辅助编程的出现让编程语言的使用者发生了一些变化,编程语言将同时被人类和 AI 共同使用,基于这个方向,那么编程语言的可读性(精简、语义准确)和跨平台会更加重要。
前 Deepin CTO 王勇 “锐评” 编程语言
王本人在2023年4月谈论了一些关于各种编程语言的感悟,其中包括 Golang、Rust、Java、Python,甚至提到了比较小众的 Vala。他也分享一些编程语言的感悟,因为字数限制,用语难免不严谨。下面是对其发布内容的整理。
1. C/C++:我的入门语言,充满原生力量,其实指针、内存分配和释放,用的熟练就好了,没啥难度。比较麻烦的是,如果项目不是自己设计的,逻辑比较复杂,内存安全问题没法根治。
2. Java:我第一份工作的语言(J2ME),严谨,工业质量高,天生为企业程序设计的,特别是 Eclipse 开创了 IDE 智能编程先河。但是不自由,特别是 Linux 下探索一些技术原理的时候,什么都要先定义 Class 再创建 Object 再设计 setter/gettter,还要考虑模式设计的时候,不符合黑客道自由自在的精神。
3. Haskell:当年唐凤单刀编写 Perl6 编译器,那时候对一个人的生产力能达到多么恐怖的实力感到震惊(第一个是 John Carmark, 我的偶像),客观的说 Haskell 非常强,类型推导、代码优美、高性能递归、无锁编程等极大开阔我的视野,可惜的是这个语言的作者大部分都是科学家,生态一般,很难找到工作。
4. Elisp:我写了 18 年 Elisp 代码,刷了 400+Emacs 插件,用中国人的话说就是,无招胜有招,什么模式设计,什么数据结构,都不存在的。代码就是数据,数据就是代码,Elisp 最让我爽的是,你的思想就像水一样流动到键盘,想到那写到哪,加上 Emacs 实时热替换,这才是黑客编程的心流感觉,太爽了。
5. Python:创建 deepin 的前期写了很多 Python 代码,只用看一本书《Python 核心编程》就可以实现入门到精通。Python 告诉我世间所有数据都可以用 string, bool, list, tuple 来组合。它从来不像其他编程语言那样宣扬宗教理念和小技巧,核心东西就那么多,你永远可以信赖它,完美的原型设计语言,简单实用。
6. Ruby:喜欢看 Rails 作者 David 的博客,人生就应该像 David 那么精彩,而不是躲在键盘后面攻击他人炫耀自己。Ruby 语言灵活充满人情味,能够激发 “铸剑” 的乐趣,但是随着年龄增长,曾经满世界背包找的 Ruby 小技巧最后都无法对抗记忆衰退,尊敬 Ruby 的小情调,但是现在我更喜欢记忆负担小的 Python。
7. Vala:很多人没有听过的语言,Deepin Terminal 第一版的语言,一个 C 编译器的语法糖,C# 的手感,C 的编译和运行速度,第一版 Deepin Terminal 可以做到 50ms 内启动完毕,通过 GIR 自动对接 GObject 库,不用手动绑定,Deepin Terminal 几千行代码量,Github 居然统计我是国内写 Vala 代码最多的人。
8. Golang:公司主力语言,Python 手感,性能足够好,适当的 GC 比较适合业务逻辑编写,不会像 Ruby 那样内存爆炸重写,性能也比 Python 快太多了,可惜错误处理真的是丑啊,大公司的好处是背书和资源厉害,坏处是一些小细节就不听社区的反馈,而语法完美的语言生态发展缺钱,也许这就月有阴晴圆缺。
9. OCamel:函数式编程,但是没有 Haskell 那么‘纯粹’,也提供 OOP 的东西,自己研究一下玩一下还挺好玩,但是我想分享的是,函数式编程在列表处理的时候非常简洁好看,但是我们不能拿着函数式语言的锤子到处去找函数式场景的钉子,好看的衣服穿一穿可以,但是有时候也要下田处理一些脏活。
10: JavaScript:可能是世界上拥有程序员数量最多的语言,客观的说,这个语言没啥规范或者规范一直在变,变的都是语法这种无聊的事情。至从 V8 和 npm 出来以后,你别说,众多程序员鄙视的语言,好脏好乱好热闹的生态就比好山好水好无聊的世界好很多,有时候感叹,代码优雅比不上人多力量大啊。
11. CoffeeScript:2013 年的时候,我们一帮底层 C++ 程序员魔改了浏览器引擎,用 CoffeeScript 写 Linux 桌面前端,语法优美,F12 调试界面 CSS,好爽啊。但是后面微软大佬们发力做了 TypeScript 以后,CoffeeScript 这种语言就淡出人们的视野了。
12. TypeScript:如果你羡慕 JavaScript 轮子生态,有生产力,但是又鄙视 JavaScript 的混乱语法和标准,必须尝试 TypeScript,基本上是大前端的标配,像我这种野生程序员,不用太偏向语言派系之间的纯洁理念,架构好才是真的好,大部分代码都会被重构删除的,因为你的认知在不断提升。
13. Lua:用过一年 Mac,针对 Hammerspoon 写了一些配置,Lua 真的是快啊,语言超级简洁,机器码指令很少,效率很高,性能贼快贼快啊,为啥 Emacs 比不上 Neovim,就是 Lua 比 Elisp 转速高太多,但是这个语言不支持 Native Thread,所以通用型天赋受限制,再强 IPC 数据传输都比不上线程访问内存速度快呀。
14. Swift:梦中语言,兼顾简洁、性能和优美的语言,设计的非常好,但是对于我这种 Emacs 程序员,写代码一定是键盘流,但是 Mac 一定要用它那个图形 IDE 写代码我受不了啊,可惜了。传说 Swift 的语言作者也是 Rust 作者,所以 Rust 的一些细节审美还是可以的。
15. Rust:这门语言非常好,综合实力很强,我每天都感谢上苍 rg/fd 这两个工具节省我太多时间了,Rust 性能和无 GC 的设计真的没的说,最适合命令行工具、底层库,减少世界多少内存安全漏洞呀。我不喜欢它编译器话太多,强迫我关心内存安全,因为原型设计阶段根本不用关心内存安全,没心情就不想写。
作为曾经的 Haskeller,说一下我对 Rust 的感受,语言很有力量,但是不感冒这个语言的原因:
1). 世界上有很多业务性的逻辑是需要创造力和编程心流体验的,而 Rust 编译器总是打断你方向性的思考,强制让你关注设计阶段不重要的细节,丧失了很多编程乐趣。
2). Rust 社区的人似乎不懂得市场经济和成本概念,一个好的软件,不仅仅只是内存安全和绝对性能,代码可读性,场景适合性,认知深刻和持续维护的软件对用户才有价值,重写完一个软件,证明 Rust 比别的语言快和自己厉害,马上就弃坑的软件没有价值。
3). Rust 社区推崇内存的细腻控制,有时候就和 C++ 的开发人员一样讨厌,把指针或者生命周期控制能力当作比较的炫耀资本,Rust 更像是一种证明自己比别人厉害的工具。 我不是说它不好,而是不喜欢这种认为 Rust 就是天下第一的思想,什么都要用其重写的想法。
4). Rust 的强制内存管理,在编写复杂逻辑的时候,编译器打断太生硬了,导致人无法安静的思考最重要的架构设计。Rust 对于底层库或者实时性这些不需要 GC 或者性能苛刻的场景很适合,为了内存安全可以忍受编译器严格。但是现实大部分场景不是都是内存安全优先的,而是创造力和逻辑清晰优先的。
TIOBE 2023年十大编程语言对比(优缺点及应用场景)
一、Python
优点:
1.简单易学:相比其他编程语言,语法简单明了,易于理解和掌握。
2.开源:意味着用户可以免费使用,并自由地修改和分发它的源代码,促进了Python社区的发展。
3.可移植性:轻松地在不同平台之间进行移植,几乎可以运行在所有操作系统上,成为跨平台开发的理想选择。
4.丰富的库:大量的标准库和第三方库,可以快速地实现各种功能,大大提高了开发效率。
5.面向对象:支持面向对象编程,代码更加模块化、可维护和可扩展。
6.多用途:广泛应用于众多领域,例如数据科学、人工智能、Web开发、自动化等。
缺点:
1.运行速度较慢:解释型语言,相比于编译型语言,其执行速度较慢。但是,随着Python的不断发展,出现了许多能够提高Python性能的方法和工具。
2.内存占用较大:Python的动态类型和垃圾回收机制会导致内存占用较大,这在处理大规模数据时可能会成为一个问题。
3.设计限制:Python的设计有时会对某些特殊情况造成一定约束,例如GIL(全局解释器锁)限制了CPU多核利用效率。
应用领域:
1.科学计算和数据分析:可用于数学计算、统计分析、数据可视化等方面,以及各种科学计算包(如NumPy、SciPy、pandas、Matplotlib等)的使用。
2.机器学习和人工智能:最流行的机器学习语言之一,有很多强大的框架和库(如TensorFlow、Keras、PyTorch等)可用于构建和训练模型,并进行图像、语音和自然语言处理等任务。
3.Web开发:Django、Flask和Pyramid等Web框架可以使开发者快速构建高效的Web应用程序。
4.自动化测试:可以使用模拟浏览器行为的工具(如Selenium)来测试Web应用程序。
5.游戏开发:Pygame是一个流行的游戏开发框架,提供了丰富的游戏开发资源。
6.系统工具和管理员脚本:简单易用性使其成为编写系统脚本和工具的理想选择,例如,自动备份脚本等。
7.嵌入式设备:在嵌入式设备中运行Python可以进行控制、数据采集和处理等操作。
二、C语言
优点:
1.代码量小:用C语言编写的程序容量较小,相比于其他编程语言而言更加精简,程序执行速度更快。
2.运行速度快:编译型语言,编译器可以将代码转换为二进制机器码,执行速度比解释型语言更快。
3.功能强大:提供了大量的内置库和丰富的数据类型,可以实现各种复杂的数据操作、算法以及系统级编程。
4.跨平台性:跨平台性非常好,同一段程序可以在不同的操作系统上编译运行,例如Windows、Linux、MacOS等操作系统均支持C语言。
缺点:
1.数据封装性差:没有像面向对象编程语言那样提供封装性,因此数据的安全性相对较差,容易被非法访问或者修改。
2.对变量类型约束不严格:对变量类型的限制不够严格,如果不小心将一个变量赋值给错误的类型,可能会发生意外的行为,影响程序的正常运行。
3.容易发生指针错误:使用指针时需要非常小心,否则会发生内存溢出、非法访问等问题,导致程序崩溃或者出现安全问题。
应用领域:
1.操作系统开发:C语言最初是为Unix操作系统开发而诞生,自此以后,在操作系统、网络和文件系统等底层编程方面,C语言都得到了广泛应用。目前,Linux、Windows、Mac OS等操作系统内核仍然大量使用C语言编写。
2.嵌入式系统:许多嵌入式设备,如智能手机、平板电脑、家用电器、汽车电子等等,使用C语言的代码作为它们的内置软件。
3.数据库系统:许多数据库管理系统(例如MySQL、Oracle、SQLite)也是使用C语言来实现的。
4.编译器和解释器:C语言编写编译器和解释器是非常常见的,例如GNU C编译器就是一个基于C开发并使用C作为其源码的绝大部分。
5.游戏开发:许多游戏,特别是图形游戏(如FPS游戏和角色扮演游戏),会使用C语言与图形处理器交互,实现游戏动画和操作。
6.其他:音频处理、图像处理、通信、加密等方面,C语言也有很多应用。
三、Java
优点:
1.跨平台性:跨平台性非常好,同一段程序可以在不同的操作系统上编译运行,例如Windows、Linux、MacOS等操作系统均支持Java语言。
2.内存管理:提供垃圾回收机制,可以自动管理内存,减少了对内存的手动分配和释放。
3.安全性高:安全性很高,因为它实现了“安全沙箱”机制,确保代码在执行时不会损害系统或其他程序。
4.面向对象特性:面向对象的语言,支持封装、继承、多态等面向对象特性,帮助程序员更加高效地编写代码。
缺点:
1.使用大量的内存:垃圾回收机制需要占用大量内存,因此Java程序使用的内存较多,可能导致程序的运行速度相对较慢。
2.不能和底层打交道,不支持底层操作:Java使用虚拟机来实现,不能接近操作系统,也就不能和操作系统的底层打交道了。
3.启动时间慢:由于Java程序需要先启动虚拟机,再执行程序,所以启动时间相对其他编程语言较慢。
4.灵活性弱:因为Java删除了指针,所以不如C/C++等语言灵活。
应用场景:
Web编程:大部分企业喜欢使用Spring MVC构建Web应用程序的后端,使用Angular或React.js前端框架来构建应用程序的前端,并且最受欢迎的Java后端框架是Apache Struts。应用程序开发:Java被广泛用于开发桌面程序、移动应用和游戏等领域。例如,Android操作系统使用Java语言来构建应用程序。大数据技术:Hadoop和其他的大数据技术也在不同程度使用着Java,例如Apache的基于Java的Hbase、Accumulo和ElasticSearch。嵌入式设备:Java在嵌入式设备领域也有很大的应用,因为Java代码可以写成小型且可靠的二进制文件,并使用少量内存运行。管理工具:Java经常用于开发大型软件的管理工具,例如,Eclipse IDE就是一个用Java开发的项目管理工具。
此外,Java还可以用于开发安卓应用、游戏开发、金融和电子商务应用、科学和研究、企业应用、人工智能等多个领域。
四、C++
优点:
1.面向对象特性:面向对象的语言,支持面向对象的特性,例如封装、继承和多态等,可以写出更加高效、易于维护的程序。
2.性能高:编译型语言,与解释型语言相比,拥有更快的运行速度,可以开发高性能的应用程序。
3.可移植性高:可移植性很好,同一段程序可以在不同的操作系统上编译运行。
4.丰富的库支持:丰富的库支持,包括STL、Boost等,便于程序员编写程序。
缺点:
1.学习曲线陡峭:较为复杂,学习曲线较为陡峭,需要花费较长时间来掌握。
2.容易出现指针问题:使用指针时非常灵活,但也容易出现指针问题,例如空指针、野指针等,可能导致程序崩溃或出现安全问题。
3.微观管理内存:需要手动分配和释放内存,容易出现内存泄漏、重复释放等问题,给程序带来一定的风险。
4.可读性差:代码通常比较复杂,可读性可能不如其他编程语言,学习和维护程序的难度较大。
应用场景:
1.游戏开发:C++高性能,可以直接调用硬件资源,被广泛应用于游戏开发领域。例如著名的游戏引擎Unity3D就是使用C++编写的。
2.操作系统和驱动程序:由于C++可以直接访问硬件,因此它也被广泛用于操作系统和驱动程序的开发。例如Windows操作系统的大部分组件都是使用C++编写的。
3.嵌入式系统:C++也常常用于嵌入式系统的开发,它可以有效地利用硬件资源,并提高系统的性能。
4.金融和交易系统:C++在金融和交易系统中得到了广泛应用,例如高频交易系统和投资银行的交易平台。
5.图形图像处理:C++也被广泛应用于图形图像处理领域,例如Adobe Photoshop等软件都是使用C++编写的。
6.数据库开发:C++也可以用于数据库开发,例如Oracle数据库中的存储过程就是使用C++编写的。
综上,由于它的高性能和直接访问硬件的能力,C++在需要处理大量数据、实时性要求高、需要高效率的领域拥有着很强的竞争优势。
五、C#
优点:
1.简单易学:语法非常简单,易于学习和掌握。
2.安全可靠:强类型、类型安全和自动内存管理等特点,可以有效地避免程序中的内存泄漏和类型不匹配等问题。
3.面向对象:面向对象的编程语言,支持封装、继承和多态等面向对象的特性,可以大大提高代码的重用性和可维护性。
4.跨平台:C#语言可以运行在多种操作系统上,包括Windows、Linux和Mac OS等。
5.广泛应用:C#语言是微软公司的主打语言之一,被广泛应用于桌面应用程序、Web应用程序、游戏开发、移动应用程序等领域。
缺点:
1.依赖于.NET框架:C#语言需要依赖于.NET框架才能运行,这使得程序的运行环境比较庞大,可能会影响程序的性能。
2.开发工具较重:C#语言需要使用Visual Studio等比较重量级的开发工具进行开发,这使得开发环境的配置比较复杂,对计算机的性能要求较高。
3.学习曲线较陡峭:虽然C#语言的语法比较简单,但是对于初学者来说,学习曲线可能会比较陡峭,需要花费较长的时间和精力才能掌握。
应用场景:
1.Web应用开发:可用于开发ASP.NET Web应用程序,包括Web服务、Web应用程序和Web API。
2.桌面应用开发:可用于开发Windows桌面应用程序,如Windows Forms应用程序和WPF应用程序。
3.游戏开发:可用于开发游戏,特别是Unity游戏引擎的开发。
4.移动应用开发:可用于开发移动应用程序,如Xamarin和Unity等跨平台移动应用程序。
5.数据库应用开发:可开发数据库应用程序,如ADO.NET、LINQ和Entity Framework等。
6.科学计算和数据分析:可开发科学计算和数据分析应用程序,如Matlab和R等。
7.人工智能和机器学习:可开发人工智能和机器学习应用程序,如ML.NET。
8.云计算和大数据处理:可开发云计算和大数据处理应用程序,如Azure和Hadoop等。
六、Visual Basic
优点:
1.易学易用:语法简单,容易上手。
2.快速开发:可以快速创建图形化界面和数据访问应用程序。
3.面向对象:面向对象的编程语言,支持封装、继承和多态等面向对象的特性。
4.丰富的控件库:可以轻松创建各种图形化界面。
5.广泛应用:广泛应用于Windows平台上的各种应用程序,如办公软件、数据库应用程序、游戏等。
缺点:
1.性能较低:相比其他编程语言,VB语言的性能较低,运行速度较慢。
2.不支持跨平台:只能运行在Windows平台上,不支持跨平台,限制了其应用范围。
3.不适合大型项目:性能较低,不适合开发大型项目。
4.代码可读性差:由于VB语言的语法比较简单,代码可读性差,不利于维护和升级。
5.缺乏严格的类型检查:VB语言缺乏严格的类型检查,容易出现类型错误。
应用场景:
1.Windows桌面应用程序:VB最初就是作为Windows桌面应用程序开发工具而出现的。由于VB可以直接调用Windows API,因此它被广泛应用于Windows操作系统下的快速开发桌面应用程序,例如财务软件、ERP软件、文本处理工具等。
2.办公自动化:VB可以与Office等办公软件深度集成,提供宏和自定义函数的支持,可以方便地实现自动化操作,例如自动化批量处理Excel表格、Word文档等。
3.数据库应用开发:VB可以使用ADO(ActiveX Data Objects)来访问数据库,因此可用于快速开发数据库应用程序。
4.Web开发:虽然现在Web开发语言更为流行,但是VB也可以用于Web开发。例如ASP(Active Server Pages)就是基于VBScript脚本语言构建的。
总之,使用VB开发的应用程序可以很好地与Windows操作系统集成,并且适用于各种行业和领域。
七、JavaScript
优点:
1.快速的终端反应:JS在客户端执行,不需要服务器端支持就可运行,而且依赖任务的不同,结果几乎是立即完成的。
2.简洁性:JS使用DOM模型,提供大量的预编制的对象代码,使得开发一个满足用户需要的脚本变得轻而易举。
3.组件性和扩展性:JS的优秀组件特性可以通过第三方库和框架扩展,并且也支持与其他语言很好地交互。例如,使用Node.js服务器端可以使用JS语言。
4.事件驱动:JS以事件驱动的方式响应用户,通过在网页中执行操作生成的操作称为事件。例如,按下鼠标、移动窗口、选择菜单等都可以视为事件。
缺点:
1.安全问题:由于JS在客户端运行,所以可能会存在安全问题。黑客可以通过检查JS程序中的漏洞来攻击网站。
2.浏览器兼容性问题:不同的浏览器对JS解释的方式不同,可能会导致代码在不同的浏览器上运行出现不一样的结果。
3.开发效率低:JS的调试非常困难,因为代码运行在客户端环境,很难进行精确定位或无法复现的错误。
4.弱类型和松散的语法结构:JS是一种弱类型语言,没有严格的数据类型,这可能会导致非常难以调试和错误报告。此外,它还有一些松散的语法结构,可能会导致代码中出现一些难以诊断的问题。
应用场景:
1.Web前端开发:作为Web开发的核心语言之一,JS主要用于实现网页上的交互效果和动态特效,例如数据验证、鼠标悬停效果、轮播图、弹出框等。
2.前端框架开发:JS不仅可以应用在前端开发,也可以通过Node.js运行时环境用于后端开发。前端框架例如Angular、React、Vue等都是使用JS编写的。
3.移动应用开发:JS也可以通过各种跨平台开发框架(例如React Native、Ionic等)进行移动应用开发,甚至可以在iOS和Android系统中构建原生应用程序。
4.游戏开发:JS也可以用于浏览器游戏的开发,例如H5小游戏、HTML5游戏等,具有较高的移植性和扩展性[1]。
5.数据可视化:JS可以通过D3、Echarts等可视化库实现图表呈现和数据可视化。
总之,JS是一门非常重要且灵活的编程语言,广泛应用于Web前端开发、前端框架开发、移动应用开发、游戏开发和数据可视化等领域,随着互联网的快速发展,JS的应用场景不断拓展,并且不断提供更多的解决方案,因此学习JS对于当前和未来的开发工作都有很大的意义。
八、SQL
优点:
1.简单易学:SQL语言的语法较为简单,容易掌握。
2.数据完整性:SQL支持数据完整性,可以对数据进行约束,保证数据的完整性。
3.高效性:SQL可以快速地查询、更新、删除和插入数据。
4.数据安全性:SQL支持数据加密和访问控制,可以保障数据的安全性。
5.数据存储:SQL可以方便地存储和管理大量数据。
缺点:
1.复杂性:SQL的语法虽然简单,但是在处理复杂的查询和数据操作时,需要深入了解SQL的各种语法和函数,才能发挥其最大的作用。
2.学习成本高:虽然SQL语言的语法简单,但是需要花费一定的时间和精力学习。
3.数据规模限制:SQL在处理大规模数据时可能会出现性能问题,需要进行优化。
4.数据结构限制:SQL只能处理关系型数据,对于非关系型数据的处理能力较弱。
5.依赖于数据库:SQL是依赖于数据库的,如果数据库出现故障或者不可用,那么SQL也无法使用。
应用场景:
1.数据库管理系统:SQL是数据库管理系统中最常用的语言。它允许用户定义、操作和管理数据库中的数据。例如,MySQL、Oracle、Microsoft SQL Server等都是流行的关系数据库管理系统,它们都使用SQL语言。
2.数据分析:SQL语言可以用于查询、过滤、排序和汇总数据,因此它是数据分析师的必备工具。数据分析师可以使用SQL来提取数据并进行分析,以便为业务决策提供有用的信息。
3.网站开发:Web应用程序通常需要与数据库交互,以便从数据库中检索和存储数据。SQL语言可以用于编写与数据库交互的代码,例如,PHP、Python和Ruby等编程语言都提供了SQL数据库接口。
4.金融和会计:SQL语言可以用于处理大量的金融和会计数据。银行、保险公司和其他金融机构使用SQL来管理客户信息、交易记录和报告。
5.人力资源管理:SQL语言可以用于管理人力资源数据,例如,招聘、员工信息、薪酬和绩效管理等。许多企业使用SQL来存储和管理员工信息,以便进行人力资源规划和管理。
6.日志分析:SQL语言可以用于分析大量的日志数据。许多企业使用SQL来分析网站访问日志、应用程序日志和服务器日志,以便了解用户行为和系统性能。
7.嵌入式系统:SQL语言可以用于嵌入式系统中的数据存储和管理。许多嵌入式系统都需要存储和管理数据,例如,智能家居、智能医疗等。SQL可以用于在嵌入式系统中实现数据存储和管理。
九、PHP
优点:
1. 稳定性好:PHP是一种稳定的编程语言,能够保证代码的稳定性和可靠性。
2. 易于学习:PHP语言比较容易学习,语法简单,入门门槛低,适合初学者。
3. 开发效率高:PHP语言的开发效率很高,可以快速开发出功能完善的网站和应用程序。
4. 跨平台性强:PHP语言可以在多种操作系统上运行,包括Windows、Linux、Unix等。
5. 社区支持强大:PHP拥有庞大的开发者社区,提供了大量的开源代码和工具,可以帮助开发者解决各种问题。
缺点:
1. 性能有限:PHP语言的性能比较低,处理大量数据时会出现卡顿和延迟。
2. 安全性问题:由于PHP语言的开发门槛低,一些开发者可能存在安全意识不强的问题,容易出现安全漏洞。
3. 代码可读性差:PHP语言的代码可读性不高,难以维护和修改,需要开发者有一定的经验和技能。
4. 语言设计不够优雅:PHP语言的设计比较松散,缺乏一致性和优雅性,难以满足高级编程需求。
5. 生态环境不够成熟:相比其他编程语言,PHP语言的生态环境还不够成熟,缺乏完善的工具和框架。
应用领域:
1.Web开发:PHP可以用于开发各种规模的Web应用程序,从小型博客、社交媒体平台到大型电子商务网站等。
2.后端开发:PHP可以作为后端编程语言,为前端提供数据支持。同时,它也与其他后端技术(例如数据库)很好地集成。
3.数据库连接:PHP支持多种数据库,如MySQL、Oracle、PostgreSQL等,可以轻松连接和操作这些数据库。
4.服务器端操作:PHP可以在服务器端执行各种系统级操作,例如读取/写入/删除文件、处理数据等。
5.图像处理:PHP有许多图像处理库,如GD和ImageMagick,可以进行图像处理和生成缩略图等。
6.游戏开发:使用PHP和游戏引擎,可创建简单的Web游戏和游戏化应用程序。
7.命令行脚本:PHP也可以作为命令行脚本语言,为系统管理和维护提供自动化工具。
总的来说,它是一种流行的服务器端脚本语言,适用于各种大小的Web应用程序和其他用途。
十、GO
优点:
1.实现快:编译和执行速度非常快,可以处理大量的并发操作,适合开发高并发的Web应用程序和分布式系统。
2.资源占用低:使用的内存非常少,同时也具有垃圾回收机制,这使得它非常适合开发低资源消耗的应用程序。
3.任意环境随便跑:可以编译成不同平台的二进制文件,这使得它在不同的操作系统和硬件上运行都非常方便。
4.适合造轮子:适合用来开发各种工具和库,因为它具有简单、高效的特点,而且易于学习和使用。
5.适合实现C/C++一部分业务,Java的大部分业务:Go语言的语法和C语言比较相似,因此对于C/C++开发人员来说,学习起来比较容易。同时,Go语言也支持面向对象和其他高级特性,这使得它可以胜任Java等高级语言的大部分业务。
6.适合做最外层的胶水:通过RPC/REST/CGO粘合不同语言的模块,而在这个胶水层还可以实现各种业务逻辑,又不用像shell/py/node有诸多顾虑和局限。
7.提供了协程、指针、unsafe,cgo加上C/C++兼容的内存布局和跨平台的汇编,有了这些能做的事情的上限基本就非常高了。
缺点:
1.学习曲线陡峭:虽然Go语言的语法相对简单,但是由于其独特的特性和设计思想,对于初学者来说可能需要花费一定的时间来掌握。
2.不够灵活:Go语言的类型系统和语法规则比较严格,这会使得一些灵活的编程方式变得不易实现。
3.某些细节需要自己处理:在Go语言中,一些底层的操作需要自己手动处理,例如内存管理、协程管理等,这会增加开发人员的工作量和复杂度。
4.语言发展较慢:由于Go语言主要由Google公司维护,因此其语言的发展和新特性引入较为缓慢,这可能会使得Go语言在某些方面滞后于其他编程语言。
应用场景:
1.网络编程:由于Go语言内置了强大的网络编程支持,开发人员可以快速、方便地进行TCP/IP协议栈的编程,开发高性能Web应用或后端服务。
2.并发编程:Go语言采用了轻量级的协程,以及原生的goroutine和channel机制,相比于传统的线程,Go语言的并发编程更加方便、高效、安全、易于控制,使得开发高并发、分布式的应用变得更加容易。
3.云计算:因为Go语言的并发处理非常出色,所以在云计算领域使用很广泛,例如Kubernetes就是使用Go语言编写并且是目前最受欢迎的容器编排系统之一。此外,因为Go语言支持交叉编译,所以开发者可以在本地编译程序,然后将编译后的程序直接部署到云服务器上,非常方便。
4.大数据处理:由于Go语言具有高效、低时延的特点,所以在大数据处理方面也非常适合,例如使用Go语言处理大数据文件、编写ETL任务、编写数据分析程序等。
5.区块链开发:Go语言在区块链开发中应用非常广泛,许多区块链项目都是使用Go语言开发的。例如,知名的以太坊客户端Geth就是使用Go语言编写的。
总之,具有诸如高效、并发处理等特点的Go语言,对于网络编程、云计算、大数据处理、区块链开发等场景,都是一种非常优秀的开发语言。
《Unix编程艺术》(Eric Raymond著)在第十四章中对各种语言进行了评价,正好可以用来回答这个问题。下面是知名IT博客阮一峰的网络日志,整理了六种主要计算机语言的优缺点。读完就会知道,对于不同的任务,应该选择哪一种语言了。
====================
几种计算机语言的评价
作者:Eric Raymond
摘自《Unix编程艺术》(第十四章)
一、C
C语言的优点是,运行效率高和接近机器语言,它特别适用于以下几种程序:
1. 对运行速度要求很高的程序。
2. 与操作系统内核关系密切的程序。
3. 必须在多个操作系统上移植的程序。
除此之外,学习C语言有一个最大的理由,那就是它能帮助我们学会,在硬件层次上考虑问题。如果你想以编程作为自己的人生事业,C是一定要学习的。C的最大缺点是,在编程过程中,你不得不花很多时间,考虑与你要解决的问题完全无关、且非常复杂的硬件资源管理问题。
二、C++
C++在80年代中期推出,支持OO(面向对象编程),原意是作为C语言的取代者。但是它没能做到做一点,原因有以下几个:
1. 它也没有解决内存管理问题,虽然比C有所改善。
2. 标准化不成功。各个编译器都只支持自己选择的一个子集,导致跨平台性不如C。
3. 过分的精细和复杂了。C++的复杂度,超过了C和OO的复杂度之和。
4. OO并没有带来多少优势,反而带来了一些副作用,比如厚重的胶合层和庞大的代码体积。
总的来说,C++的优势还是程序效率,以及面向对象编程能力,糟糕之处是它鼓励复杂的设计。
三、Shell
Shell程序写起来很容易,对于简单的任务,开发速度很快。当程序变大时,它就不太适合了,很难维护,而且将变得非常专用(只能在你自己的机器上使用),因为Shell必须调用各种外部程序,无法保证每一台机器都同样安装了这些程序。
最常见的Shell是bash,它的一些语法规则很混乱,会产生很难阅读的代码。另外shell能在泛Unix上使用,无法跨平台。Shell的最佳用途如下:
1. 执行简单的系统管理任务。
2. 编写系统启动时的初始化脚本。
3. 作为其他语言开发的程序的包装器。
四、Perl
Perl发布于1987年,基本上就是一个增强的Shell。它的最大长处是强劲的文本处理能力,无以伦比的正则表达式支持,而且有全套Unix API的内部支持,显著减少了对C的需求。Perl的主要缺点是某些部分设计得非常丑陋,且无法补救,某些部分也过于复杂。当程序规模增大时,必须严格遵守约定,才能保证模块化和设计的可控性,难于维护。
Perl看上去很神秘,但如果用它来完成一些简单的任务也是相当直接的。对于简单的编程而言来说 Perl 就象一把瑞士军刀,其语法和 C 语言很象。在 MS-Windows 下 Perl 也有一流的解释器,所写的代码是可以跨平台的。Eric Reymond 是这样描述他:“Perl显然是现代脚本语言里面的一个 800 磅的大猩猩。它大部分被系统管理员用于替代 shell 脚本语言,一部分这要归功于它对 UNIX 库函数和系统调用的包容,另外这也要归功于非常活跃的 Perl 社区开发的大量的模块”。Larry Wall 是Perl的创建者,被任为是开放代码源社区的重要领导者之一,并且总是被任为是黑客崇拜者的罗马神殿里仅次于 Linus Torvalds 和 Richard Stallman 排名第三的人物。
Perl之父,Larry Wall
拉里·沃尔于1954年9月生于美国加州洛杉矶,是程序员、系统管理员、语言学家和作家,他最为人知的地方是他设计的编程语言Perl。亦是用来阅读Usenet新闻群组的程式Rn的作者,又是一支开放源码界的重要程序patch的作者,这两支程序奠下了他在黑客和开放源码界举足轻重的地位。他得过两次IOCCC(全球难以读懂C程式码比赛)的胜利,亦是第一届自由软件奖(Free Software award)的得奖者。
拉里·沃尔是个幽默的人,他经常在程式码的意见或Usenet里展现这个特点。他曾受语言学的训练,这点帮助了他写书,亦帮助了他在Perl的设计。他是Programming Perl(通常被称为”骆驼书”)的共同作者之一。所有他编辑过或是共笔作者之一的书籍都是由O'Reilly出版。
五、Python
Python发布于1991年,是一种与C语言紧密集成的脚本语言。Python的优点是非常干净优雅,鼓励清晰易读的代码,易学易用;提供了面向对象编程的可能,但并不把这个选择强加于设计者;具有出色的模块化特性,同Java一样,适合用来做需要协同开发的大型复杂项目。在很多方面,它都比Java简单。此外,Python标准中包括了对许多网络协议的支持,因此也很适合网络管理任务。其缺点主要是效率低下,速度缓慢。在执行速度上,它不仅无法与C/C++竞争,而且也不如其他主要的脚本语言。但是,这其实并不是一个严重的问题,有时网络或磁盘的延迟,会完全抵消Python本身消耗的时间。而且因为Python特别容易和C结合起来,因此性能关键的 Python模块,可以很方便地转化成C语言来提高速度。
Python之父,Guido van Rossum
总的来说,对于小型项目和大量依靠正则表达式的项目,Python不如Perl的表达能力强。至于更小的项目,Python则是大材小用,Shell也许更适合。
六、Java
Java发布于1995年,设计目标有两个。
一个是write once, run anywhere(一次编写,到处运行),即不依赖于特定的平台;另一个是在网页中嵌入交互程序(applet),可以在任何一个浏览器中运行。由于它的所有者Sun公司的一系列失误,第一个目标并没有完全实现,第二个目标则是彻底失败。但是Java依然在系统编程和应用编程方面非常强大,足以挑战C和 C++。Java的优点是比C++小巧简单,可以自动管理内存,支持类似C的语法和OO编程,与C程序的结合也很好。Java的缺点是某些部分过于复杂,比如内部类和匿名类的运用会产生很混乱费解的代码;某些部分功能不完善,也无法利用操作系统提供的功能接口,比如在Java中读取和处理文本文件,并不像其他语言那样容易。此外,Java配置环境和版本的混乱,也让人很头疼。
Java之父,James Gosling
总的来说,除了系统编程和某些对运行速度要求很高的编程之外,Java都是比C++更好的选择。如果和Python相比,Java可能在大型项目上 有优势,但是也不是绝对的。
上文转自阮一峰译文。
为什么会有这么多编程语言?
在编程语言如此丰富的今天,相信许多开发者都有过上面的疑问。不过早在 1960 年代初,人们就已经提出了这个问题。
《ACM 通讯》期刊近日发表了题为《Why Are There So Many Programming Languages?》的文章,作者在文中指出了一个重要原因:公司基于商业利益的诉求,希望控制编程语言,所以会发明由自己主导的语言。除了公司对于控制和财富的诉求,编程语言之所以如此多与当时的技术环境和水平密切相关。现在许多看起来理所当然的事情在过去并非如此,早期计算机的存储、内存和处理能力都是有限而昂贵的。人们不得不费尽周折,只为到计算机实验室,通宵熬夜以获得计算机使用时间。
在那个时代,编程语言通常是为某些任务或工作而设计的,编程语言的命名也更简单 —— 因为命名空间尚未被开发。在 1950 年代和 1960 年代,最初的程序可以 “奢侈地” 用其所作的事情精确命名:FORTRAN(公式翻译器)、COBOL(面向商业的通用语言)、BASIC(初学者通用符号指令代码)、ALGOL(算法语言)、LISP(列表处理器)。大多数人可能没有听说过 SNOBOL(面向字符串和符号语言,1962),但是通过名字稍微猜测就可以知道它的用途。如果那个时代对面向对象的编程概念有更多了解,相信会有人使用 “OBJOL” 之类的名字命名 —— 明确命名为面向对象语言,至少按照那时的命名模式会是这样。如今更多的编程语言在许多方面都像是重新造轮子 —— 它们许多都是满足下面属性的多种组合:
License:开源;商业
平台:操作系统、硬件支持
语言范式:面向过程、函数式、面向对象等
类型系统:动态、静态等
并发:单线程、多线程
内存管理:垃圾回收(自动或手动)
执行:解释、编译到虚拟机、原生编译等
……
编程语言越来越“高级”的另一面
编程的时候,经常在关注内存问题,比如堆和栈的区别、内存分配与释放、指针问题、内存泄露问题等等,但为什么作为执行程序的核心角色——CPU却很少去关注它,这其实是编程语言越来越“高级”的结果。事实上在几十年前,那时候没有现在这么多高级语言,很多编程大佬们都是徒手写汇编,就必须得关注CPU。以熟知的Intel x86架构为例,思考这几个问题:
1.长跳和短跳有什么区别?
2.中断门、任务门、调用门分别是什么,有什么区别?
3.x86的CPU有哪些常用寄存器,分别是做什么用的?
4.虚拟地址、逻辑地址、线性地址、物理地址分别是什么,有什么区别?
用汇编语言编程,太复杂且开发效率低不说,更恼火是辛苦写完后换个CPU平台还没法通用。后来计算机工程师们开始思考:编程为什么还要考虑CPU?得把这些东西屏蔽掉!所以高级语言应运而生了,从那时起,程序员们编程基本不用考虑CPU了,这些底层的细节,编译器和操作系统都给封装好了,提供一致的调用接口,只需要调用操作系统提供的编程接口就好了。再后来,程序员们觉得面向操作系统编程也很麻烦,遇到了上面与CPU同样的问题,不同操作系统的编程API完全不一样,应用编写完成后从Windows换到Linux,又不能用了!计算机工程师们又开始思考:为什么还要考虑操作系统、内存这些东西?于是直接面向虚拟机、解释器的语言又出来了。
如果你是Java、Perl、JavaScript的程序员,想想在编程的时候会关心操作系统,会关心内存管理吗?估计以后会有人提问:为什么编程很少关注操作系统了,为什么编程很少关注内存了?
时代在发展,功能封装了一层又一层,现在的程序员,越来越少去关注底层的东西了。但这也造成的一个后果就是,开发的门槛降的越来越低,不需要学《计算机组成原理》、《操作系统》、《数据结构与算法》这些计算机基础课程,只需要《21天从入门到精通》就可以进入这个行业。
七十年编程语言发展漫谈
本节源于腾讯技术工程博客,严谨起见,本文提到的“编程语言”指的是“第三代高级编程语言”。从时间维度入手来简述编程语言,一图胜千言。从截止2023年2月主流的编程语言中,挑选出流行的,具有历史影响力的,按时间从上往下排序,依据类型和指导思想进行聚类,根据互相的影响使用线条指向,并补充了一些关键性的特征和评价,整理下图:
整理的过程中发现很多有趣的点,按时间顺序从上往下讲这张图。
1950-1959:这期间出现了第三代高级语言的鼻祖:Fortran 和 Lisp。并且在 1958 年已经提出了结构化编程,递归、异常、函数式、命令式、垃圾回收等目前常用的概念。现在用到的大部分语言特性的理论的出现比我想象的早。
1960-1969:这一阶段,IBM 的 ALGO 系列语言主要是对理论概念的探索和实践,经过两个版本后诞生出 ALGO60 里程碑式的作品,奠定了现代高级编程语言的基础。同时也有 Basic 语言希望降低编程门槛的探索,并第一次引入了“类型后置”的语法以更符合人类阅读习惯。
继续往右看,发现一个独特的系列:CPL 和 BCPL:这两个语言首次阐释了“特性不是越多越好”的黄金原则,因为拉长时间看,CPL 是第一个想成为大而全的语言。从 CPL 到 BCPL 到 C,都是在不断的减少特性;从 C 到 C++再到 C++20,特性又在不断的增加,这时你就会明白为什么 C++委员会对添加新特性是那么的谨慎和小心,但是这都阻挡不了让 C++变成下一个 CPL 的步伐。1967 年诞生的 Simula64 提出了面向对象思想,面向对象思想开始发展。
1970-1979:这一年诞生出两个影响力极大的语言:Smalltalk 和 C。巧合的是这两个语言都是在 1972 年发布的。Smalltalk 一定程度上继承了 Basic 远离机器靠近人类的探索,发扬了语言动态性的思想,探索了面向对象的思想,模糊了编译型语言和解释型语言的界限,对后续的动态语言,脚本语言,客户端语言产生了深远的影响。
C 语言的诞生是为了满足 Unix 而设计的,当时 Unix 使用 BCPL 或 B 语言都无法满足操作系统对编程语言的要求,因此 C 语言应运而生。抛开语言特性,我们也能发现 C 的优势有非常多:不但有需求(开发操作系统的动机),还有经验的加成(尝试了 BCPL 和 B 语言,积累了大量的应用经验),并且遇到了好项目(Unix 操作系统),被最聪明的一群人使用(Unix 操作系统开发工程师),注定了 C 具有强大的生命力。这期间编程语言的思想已经成熟,面向对象思想在 Smalltalk 的推动下,成为下一阶段新语言首捧的特性。
1980-1989:由于面向对象在 GUI 领域具有独特的优势,借着这十年图形界面交互的高速发展的东风,面向对象思想发展进入快车道。这十年是面向对象思想横行的十年。还记得上个十年的 Smalltalk 和 C 吗?Smalltalk+面向对象诞生了 Self;C 语言+面向对象诞生了 C++;而 Smalltalk+C 语言+面向对象诞生了 Objective-C。苹果公司选择 Objective-C 作为其生态原生语言,使得我们在 2022 年还在写 Objective-C 的代码;C++和 Objective-C 对 C 语言的 100%兼容,使得这两个语言可以充分继承 C 语言的生态和人才,但是 Objective-C 的语法实在太别扭了,Objective-C 的关键字数量众多,并且语法没有一致性可言,在没有 IDE 补全环境下是最难写的语言。1987年12月18日发表Perl是高级、通用、直译式、动态的程序语言。
C++保留了 C 语言的语法习惯和设计原则,从 C 切换到 C++几乎没有学习成本,并复用了 C 的生态,这使得 C++迅速流行起来。面向对象的思想在当时来看是实用且先进的,但是现在我们发现基于面向对象思想后面发展的各种设计模式开始把代码玩出花来了,需要学习设计模式的就那几个架构师,但是现在人手一本设计模式,把大象放到冰箱里这么简单事情都要先写一堆的抽象,把看代码把人绕晕...... 当然,这是面向对象思潮的后话了。这也导致后来很多人投向简单直接的 C 了(做了这么多项目下来,发现面向对象很多时候是过度设计的源泉)。
1990-1999:这是编程语言发展最快速的时代,得益于计算机平民化和图形界面的发展,计算机进入千家万户,应用开发的需求激增,编程语言的诉求开始发生变化:对性能要求变弱,而对安全(内存安全,线程安全),人性化(可读性,表达力,低门槛),动态性等提出更高要求。首先登场的是 VisualBasic,强化了 IDE 和编程语言的结合,降低了应用开发门槛。接下来目前非常火的 Python 也诞生了,Python 诞生在关键字和语法越来越复杂的年代,于是反其道而行之,追求简洁的语法,最具有标志性的是为了省略“{}”直接用空格缩进来划分代码块(这种语法首创是 1966 年的ISWIM语言);有趣的是,Python 追求的简洁语法不是其成功的关键(由于 IDE 的进步,这种语法的形式核心价值已经消失),Python 成功的关键在于其出色的扩展性和跨平台,这让 Python 长期稳解释型语言头把交椅,并且后来的同类语言都很难超越;另一方面,Python 提出的“一件事最好是只有一种方法来做”理念贯穿语言设计也成就了其优秀的学习曲线和低门槛的优点,一门语言能让人快速上手也是其核心竞争力呀。
时间来到 1995 年,这一年诞生了四个我们耳熟能详的编程语言(JavaScript;Java;PHP;Ruby),我们把编程语言发展最快速的时代颁发给这个时代绝对不为过。Java 对 C++做减法,增加了安全性,成为历史上最成功的语言之一,嵌入式、客户端、后台都有 Java 的身影。但是这种成功不会持续太久,Java 涉及领域太多了,语言特性博而不精,这注定了 Java 在 20 年后的没落,话又说回来,能在主流编程语言连续 10 多年榜上有名,已经完成了 Java 的历史使命。
JavaScript 逐渐发展为浏览器上的原生语言,乘着 Web1.0、2.0 的东风,和低门槛的学习成本,以及解释型引擎的发展,JavaScript 已经突破浏览器领域的限制,几乎无所不能,前端开发者们拿着 JavaScript 一次又一次的向客户端和后台阵地发起冲锋,ReactNative、Node.js 等技术炙手可热;随着硬件和脚本引擎的进步,就连曾经全用 C++编写的 QQ 客户端,现在也投入 Electron 的怀抱了;但是我们从现在的角度看,JavaScript 的不少地方已经落后于时代,我们急需一门新的语言或者革命来代替它。
2000-2010:这是 PC 互联网的高峰和移动互联网的萌芽的时代,也是我们记忆深刻的时代。C#在 2000 年首发,微软基于 C++和 VB 的经验,借鉴 Java 推出了浓墨重彩的 C#,我们站在历史的高度可以说.Net 是失败的框架,但是这都难以掩盖 C#的光辉;C#和 Java 同样是对 C++做减法,但是在很多细节上 C#相对 Java 更接近 C++;由于 C#搭上了不争气的搭档.Net,不像 Java 那样一开始就那么成功,塞翁失马,反而让 C#的历史包袱非常轻。
C#在接下来的编程语言发展中多次成为第一个吃螃蟹的人,C#给现代语言带来了非常多理念和思想,从 C#1.0 到 C#11,几乎一年一个版本,这发展速度其他编程语言只能望其项背。第一次接触可空类型(空安全),??运算符,dynamic 类型都是在 C#,笔者从事 windows 开发近十年,从学术角度来看,笔者对 C#的喜爱溢于言表。但是从工程角度来看,.Net 和 C#支持跨平台,但是他俩动作总是慢半拍,错过了 PC 互联网和移动互联网的机会,只在 Windows 平台流行了。
C++作为通用语言真的太成功了,但是它已经不是一门高安全性高人性化的一门语言,开发出更友好的安全的"C++"变得迫切起来,这时出现了很多新的语言蠢蠢欲试,其中包括 D 语言和 Rust:D 语言是 C++编译器作者设计实践的一门新语言,吸收了很实际项目的 C++经验教训,但是仔细了解 D 语言你会发现,这就是拿 C++编译器魔改的一个”私有 C++语言“编译器;这也导致很多 C++的弊病不能彻底废除,属于改良派。
过了 3 年,Rust 横空出世:Rust 在理念上有很大的进步,比如虽然没有垃圾回收器,但是强制使用者明确对象的所有权,通过所有权编译器可以在合适的时机释放内存:这是第一次流行语言不使用垃圾回收方式解决内存管理问题,在性能上比垃圾回收有着极大的优势,虽然性能无损,但是相比垃圾回收模式则需要开发者编码时增加对象所有权的思考过程,即便如此,这也比在 C++花几个星期解决内存访问异常的问题好多了呀。Rust 属于改革派,重新审视 C++的应用场景,对语言特性重新设计,这真的是一次精彩的尝试!Rust 也比 D 语言更加成功。
到了 2007 年,对后台影响深远的 Go 语言诞生,当时大部分后台还是用 C++或者 Java,我们前面说了 Java 注定会被替代,Go 首先在后台开发常见吹响号角,后面还会提到 Kotlin 在客户端尝试替代 Java。Go 的诞生是一个非常好的时间节点,除了剔除很多 Java 的弊病,还直击应用场景的痛点,在性能(多核,网络,并发)上着重发力,前进了一大步!另外 Go 在工程上的成功容易掩盖其了语法特性上的新尝试:Go 语言是近代第一个捡起类型后置的语言,提供了丰富的语法糖(如:=)使得代码简短并语义明确,这直接影响了后面的 Swift,Rust、Kotlin 等有着改革雄心的语言。Go 的成功除了 Go 的优秀因素外,我们也发现:瞄准细分应用场景的语言在工程上是非常具有活力的。
2011-2020:移动互联网的快速发展的时代,这个时代最需要的是提高移动端高生产力语言。首先登场的是 Android 平台的 Kotlin,Kotlin 是 JVM 语言,能直接复用 JVM 的生态,Kotlin 和 Java 有点像当年的 Objective-C 和 C 的感觉,但是不像 Objective-C 和 C 能混编,Kotlin 重新设计了语法规则,大大提高了可读性和安全性。3 年后苹果公司也交出 Swift 的答卷,Swift 被简单的形容为 “没有 C 的 Objective-C”,Objective-C 花了 30 年,终于摒弃了 C 语言的影响。
新的语言不能没有成熟生态的支持,和 Kotlin 与 Java 同是 JVM 语言不同,Swift 使用桥接(Bridging)的方法得以复用 Objective-C 的生态,这未尝不是一次创新的尝试,可以让 Swift 没有任何包袱重新设计。Kotlin 和 Swift 都选择了更适合于阅读的类型后置,更简洁的语法,更丰富的语法糖来提高可读性和语义准确性。对于现有的大型项目的开发人员来说,从 Java 到 Kotlin 或者从 Objective-C 到 Swift 有点稍微难以适应,我们被 C 风格语言荼毒了这么久,突然不荼毒了会很不习惯。
在这个时期诞生的 Dart 旨意成为 Javascript 的接班人,但是关注度不多,随着 Flutter 的火热,Dart 也进入了大众的视野。Dart 与 Kotlin、Swift 彻底断舍离 C 风格不同,Dart 仍然选择 C 语言风格;在笔者看来,现在大部分项目都会由多种语言编写,保持和 C 语言风格在多语言项目中也许是一件好事:前段时间笔者经常在 iOS、Android、PC、Mac 四个平台编写代码,涉及语言不限于 Java,Kotlin,Objective-C,Swift,C/C++,Dart,语言风格一天切换好几次,这反而非常不人性化。Dart 没有很好的成为 JavaScript 的接班人,谁能想到下一年的 TypeScript 火起来了?TypeScript 选择和 Dart 不同的方法接班,相比 Dart 激烈的方式,TypeScript 完全兼容 JavaScript,TypeScript 增加一些语法让编译器把错误提前暴露,大大增强了 JavaScript 的安全性,给 JavaScript 狠狠的续了一命,让 JavaScript 可以继续祸害程序员们。话说回来,Dart 在安全性、性能、都给 JavaScript 带来巨大的进步,也祝福 Dart 最终能顺利接班。
2021-今:除了新语言的诞生,我们也不能忽视每个编程语言都在不断的发展和变化,在 2022 年谷歌推出的 Carbon,该语言旨在修复 C++的几个明显缺点,提高 C++的可读性、安全性,并平滑语言的学习曲线。Carbon 和 D 语言有点相似,属于对 C++现代化的改良派,但是和 D 语言不同的是 Carbon 有个好爹,并且通过“双向互操作性”融入 C++生态的同时抛弃 C++历史包袱,并使得语言的语法可以重新设计。
从 Java 被逐渐替代的经验教训中我们发现,目前 C++在应用层正处于城池渐失的状态;我们应该明白,应用层和底层框架的需求不同,不应该从顶到底都使用一套语言,现在 C++所失之城池就是新语言非常好的机会,抓住应用层的安全、人性化、和与 C++的双向互操作性,Carbon 确实是准确找到了定位。简而言之,对谷歌的 Carbon 还是非常期待的。
除了在应用层 C++有待进步,即使在底层场景,C++也有很大的进步空间。2022 年,Herb Sutter 的实验项目 CppFront 值得一提。简单来说,CppFront 通过给 C++增加一层预处理语法规则(cpp2)来提高 C++的易用性和安全性。和 Rust、Carbon 不同,Herb Sutter 的这个实验项目不是寻找 C++的代替者,而是 “寻找突破界限的方法,使 C++ 本身向前发展,并加倍努力使用 C++,而不是切换到其他东西”。这是个为 C++标准探路的实验项目,有这么丰富的理论和实验,下一代 C++标准必然能焕发出新的活力。但是也别太奢望 C++能回到从前那样样能手的辉煌,历史的经验告诉我们大而全的语言最后都会被替代。
小结一下这 70 年的发展趋势
前面从时间维度简单的从上往下捋了一遍,不难看出,主流通用编程语言主要受 2 个成熟语言(Smalltack 和 C 语言,且都诞生于 1972 年)的影响,有的语言被某个影响深一些,有的两者都汲取;接着主要往更安全、人性化、跨平台这三个方向进行发展,而在性能,语法,重用生态、扩展性,IDE 友好等多维度各有发展、取舍、借鉴。同时我们也发现:编译型和解释型语言边界逐渐模糊,语法流行交替更迭,语法语义更加明确,语言的目标领域更加细化。别看近十几年新语言出了那么多,语法花里胡哨,其实很多语言同质化严重,类型后置也是早就玩过的,每个时代流行不同罢了。前面我们顺着时间简单过了一遍图中的部分语言,图中的信息远不止我们这里讨论的内容,限于篇幅还请点开大图品读。
展望未来二十年发展趋势
还是那句话,编程语言的发展离不开计算机领域其他技术的发展。编程语言发展至今,特性的互相借鉴的情况越来越普遍,语言生态互通也更常见(如直接兼容,或者 Bridging 技术),编译型和解释型界限也越来越模糊(比如 Dart 既能编译运行也能解释运行,还能边解释运行边编译),语言之间的性能差异也越来越小(V8 引擎,JIT,硬件性能提高),语言之间的互相转换也开始普遍(Kotlin to Java to JavaScript,Dart to Javascript),甚至在 AI 的加持下,准确的把具有垃圾回收语言(如 Kotlin)往没有垃圾回收语言(如 C)的转换也变得可能。
如果使用 AI 做预处理,静态检查和类型安全的语言没有了优势;如果使用 AI 辅助编程,我们甚至不是在写代码,而是在跟 AI 聊天(如最近很火的 chatGPT)!这时你还会纠结 AI 在使用什么编程语言吗?高级编程语言发展的黄金时代即将落幕,我们很难再看到像垃圾回收,空安全,异步等让我们兴奋不已的新语言特性了。当然,编程语言还是会继续往更安全、人性化(可读性、可写性)、跨平台这三个方向进行发展,但是 AI 辅助编程的出现让编程语言的使用者发生了一些变化,编程语言将同时被人类和 AI 共同使用,基于这个方向,那么编程语言的可读性(精简、语义准确)和跨平台会更加重要。
前 Deepin CTO 王勇 “锐评” 编程语言
王本人在2023年4月谈论了一些关于各种编程语言的感悟,其中包括 Golang、Rust、Java、Python,甚至提到了比较小众的 Vala。他也分享一些编程语言的感悟,因为字数限制,用语难免不严谨。下面是对其发布内容的整理。
1. C/C++:我的入门语言,充满原生力量,其实指针、内存分配和释放,用的熟练就好了,没啥难度。比较麻烦的是,如果项目不是自己设计的,逻辑比较复杂,内存安全问题没法根治。
2. Java:我第一份工作的语言(J2ME),严谨,工业质量高,天生为企业程序设计的,特别是 Eclipse 开创了 IDE 智能编程先河。但是不自由,特别是 Linux 下探索一些技术原理的时候,什么都要先定义 Class 再创建 Object 再设计 setter/gettter,还要考虑模式设计的时候,不符合黑客道自由自在的精神。
3. Haskell:当年唐凤单刀编写 Perl6 编译器,那时候对一个人的生产力能达到多么恐怖的实力感到震惊(第一个是 John Carmark, 我的偶像),客观的说 Haskell 非常强,类型推导、代码优美、高性能递归、无锁编程等极大开阔我的视野,可惜的是这个语言的作者大部分都是科学家,生态一般,很难找到工作。
4. Elisp:我写了 18 年 Elisp 代码,刷了 400+Emacs 插件,用中国人的话说就是,无招胜有招,什么模式设计,什么数据结构,都不存在的。代码就是数据,数据就是代码,Elisp 最让我爽的是,你的思想就像水一样流动到键盘,想到那写到哪,加上 Emacs 实时热替换,这才是黑客编程的心流感觉,太爽了。
5. Python:创建 deepin 的前期写了很多 Python 代码,只用看一本书《Python 核心编程》就可以实现入门到精通。Python 告诉我世间所有数据都可以用 string, bool, list, tuple 来组合。它从来不像其他编程语言那样宣扬宗教理念和小技巧,核心东西就那么多,你永远可以信赖它,完美的原型设计语言,简单实用。
6. Ruby:喜欢看 Rails 作者 David 的博客,人生就应该像 David 那么精彩,而不是躲在键盘后面攻击他人炫耀自己。Ruby 语言灵活充满人情味,能够激发 “铸剑” 的乐趣,但是随着年龄增长,曾经满世界背包找的 Ruby 小技巧最后都无法对抗记忆衰退,尊敬 Ruby 的小情调,但是现在我更喜欢记忆负担小的 Python。
7. Vala:很多人没有听过的语言,Deepin Terminal 第一版的语言,一个 C 编译器的语法糖,C# 的手感,C 的编译和运行速度,第一版 Deepin Terminal 可以做到 50ms 内启动完毕,通过 GIR 自动对接 GObject 库,不用手动绑定,Deepin Terminal 几千行代码量,Github 居然统计我是国内写 Vala 代码最多的人。
8. Golang:公司主力语言,Python 手感,性能足够好,适当的 GC 比较适合业务逻辑编写,不会像 Ruby 那样内存爆炸重写,性能也比 Python 快太多了,可惜错误处理真的是丑啊,大公司的好处是背书和资源厉害,坏处是一些小细节就不听社区的反馈,而语法完美的语言生态发展缺钱,也许这就月有阴晴圆缺。
9. OCamel:函数式编程,但是没有 Haskell 那么‘纯粹’,也提供 OOP 的东西,自己研究一下玩一下还挺好玩,但是我想分享的是,函数式编程在列表处理的时候非常简洁好看,但是我们不能拿着函数式语言的锤子到处去找函数式场景的钉子,好看的衣服穿一穿可以,但是有时候也要下田处理一些脏活。
10: JavaScript:可能是世界上拥有程序员数量最多的语言,客观的说,这个语言没啥规范或者规范一直在变,变的都是语法这种无聊的事情。至从 V8 和 npm 出来以后,你别说,众多程序员鄙视的语言,好脏好乱好热闹的生态就比好山好水好无聊的世界好很多,有时候感叹,代码优雅比不上人多力量大啊。
11. CoffeeScript:2013 年的时候,我们一帮底层 C++ 程序员魔改了浏览器引擎,用 CoffeeScript 写 Linux 桌面前端,语法优美,F12 调试界面 CSS,好爽啊。但是后面微软大佬们发力做了 TypeScript 以后,CoffeeScript 这种语言就淡出人们的视野了。
12. TypeScript:如果你羡慕 JavaScript 轮子生态,有生产力,但是又鄙视 JavaScript 的混乱语法和标准,必须尝试 TypeScript,基本上是大前端的标配,像我这种野生程序员,不用太偏向语言派系之间的纯洁理念,架构好才是真的好,大部分代码都会被重构删除的,因为你的认知在不断提升。
13. Lua:用过一年 Mac,针对 Hammerspoon 写了一些配置,Lua 真的是快啊,语言超级简洁,机器码指令很少,效率很高,性能贼快贼快啊,为啥 Emacs 比不上 Neovim,就是 Lua 比 Elisp 转速高太多,但是这个语言不支持 Native Thread,所以通用型天赋受限制,再强 IPC 数据传输都比不上线程访问内存速度快呀。
14. Swift:梦中语言,兼顾简洁、性能和优美的语言,设计的非常好,但是对于我这种 Emacs 程序员,写代码一定是键盘流,但是 Mac 一定要用它那个图形 IDE 写代码我受不了啊,可惜了。传说 Swift 的语言作者也是 Rust 作者,所以 Rust 的一些细节审美还是可以的。
15. Rust:这门语言非常好,综合实力很强,我每天都感谢上苍 rg/fd 这两个工具节省我太多时间了,Rust 性能和无 GC 的设计真的没的说,最适合命令行工具、底层库,减少世界多少内存安全漏洞呀。我不喜欢它编译器话太多,强迫我关心内存安全,因为原型设计阶段根本不用关心内存安全,没心情就不想写。
作为曾经的 Haskeller,说一下我对 Rust 的感受,语言很有力量,但是不感冒这个语言的原因:
1). 世界上有很多业务性的逻辑是需要创造力和编程心流体验的,而 Rust 编译器总是打断你方向性的思考,强制让你关注设计阶段不重要的细节,丧失了很多编程乐趣。
2). Rust 社区的人似乎不懂得市场经济和成本概念,一个好的软件,不仅仅只是内存安全和绝对性能,代码可读性,场景适合性,认知深刻和持续维护的软件对用户才有价值,重写完一个软件,证明 Rust 比别的语言快和自己厉害,马上就弃坑的软件没有价值。
3). Rust 社区推崇内存的细腻控制,有时候就和 C++ 的开发人员一样讨厌,把指针或者生命周期控制能力当作比较的炫耀资本,Rust 更像是一种证明自己比别人厉害的工具。 我不是说它不好,而是不喜欢这种认为 Rust 就是天下第一的思想,什么都要用其重写的想法。
4). Rust 的强制内存管理,在编写复杂逻辑的时候,编译器打断太生硬了,导致人无法安静的思考最重要的架构设计。Rust 对于底层库或者实时性这些不需要 GC 或者性能苛刻的场景很适合,为了内存安全可以忍受编译器严格。但是现实大部分场景不是都是内存安全优先的,而是创造力和逻辑清晰优先的。
TIOBE 2023年十大编程语言对比(优缺点及应用场景)
一、Python
优点:
1.简单易学:相比其他编程语言,语法简单明了,易于理解和掌握。
2.开源:意味着用户可以免费使用,并自由地修改和分发它的源代码,促进了Python社区的发展。
3.可移植性:轻松地在不同平台之间进行移植,几乎可以运行在所有操作系统上,成为跨平台开发的理想选择。
4.丰富的库:大量的标准库和第三方库,可以快速地实现各种功能,大大提高了开发效率。
5.面向对象:支持面向对象编程,代码更加模块化、可维护和可扩展。
6.多用途:广泛应用于众多领域,例如数据科学、人工智能、Web开发、自动化等。
缺点:
1.运行速度较慢:解释型语言,相比于编译型语言,其执行速度较慢。但是,随着Python的不断发展,出现了许多能够提高Python性能的方法和工具。
2.内存占用较大:Python的动态类型和垃圾回收机制会导致内存占用较大,这在处理大规模数据时可能会成为一个问题。
3.设计限制:Python的设计有时会对某些特殊情况造成一定约束,例如GIL(全局解释器锁)限制了CPU多核利用效率。
应用领域:
1.科学计算和数据分析:可用于数学计算、统计分析、数据可视化等方面,以及各种科学计算包(如NumPy、SciPy、pandas、Matplotlib等)的使用。
2.机器学习和人工智能:最流行的机器学习语言之一,有很多强大的框架和库(如TensorFlow、Keras、PyTorch等)可用于构建和训练模型,并进行图像、语音和自然语言处理等任务。
3.Web开发:Django、Flask和Pyramid等Web框架可以使开发者快速构建高效的Web应用程序。
4.自动化测试:可以使用模拟浏览器行为的工具(如Selenium)来测试Web应用程序。
5.游戏开发:Pygame是一个流行的游戏开发框架,提供了丰富的游戏开发资源。
6.系统工具和管理员脚本:简单易用性使其成为编写系统脚本和工具的理想选择,例如,自动备份脚本等。
7.嵌入式设备:在嵌入式设备中运行Python可以进行控制、数据采集和处理等操作。
二、C语言
优点:
1.代码量小:用C语言编写的程序容量较小,相比于其他编程语言而言更加精简,程序执行速度更快。
2.运行速度快:编译型语言,编译器可以将代码转换为二进制机器码,执行速度比解释型语言更快。
3.功能强大:提供了大量的内置库和丰富的数据类型,可以实现各种复杂的数据操作、算法以及系统级编程。
4.跨平台性:跨平台性非常好,同一段程序可以在不同的操作系统上编译运行,例如Windows、Linux、MacOS等操作系统均支持C语言。
缺点:
1.数据封装性差:没有像面向对象编程语言那样提供封装性,因此数据的安全性相对较差,容易被非法访问或者修改。
2.对变量类型约束不严格:对变量类型的限制不够严格,如果不小心将一个变量赋值给错误的类型,可能会发生意外的行为,影响程序的正常运行。
3.容易发生指针错误:使用指针时需要非常小心,否则会发生内存溢出、非法访问等问题,导致程序崩溃或者出现安全问题。
应用领域:
1.操作系统开发:C语言最初是为Unix操作系统开发而诞生,自此以后,在操作系统、网络和文件系统等底层编程方面,C语言都得到了广泛应用。目前,Linux、Windows、Mac OS等操作系统内核仍然大量使用C语言编写。
2.嵌入式系统:许多嵌入式设备,如智能手机、平板电脑、家用电器、汽车电子等等,使用C语言的代码作为它们的内置软件。
3.数据库系统:许多数据库管理系统(例如MySQL、Oracle、SQLite)也是使用C语言来实现的。
4.编译器和解释器:C语言编写编译器和解释器是非常常见的,例如GNU C编译器就是一个基于C开发并使用C作为其源码的绝大部分。
5.游戏开发:许多游戏,特别是图形游戏(如FPS游戏和角色扮演游戏),会使用C语言与图形处理器交互,实现游戏动画和操作。
6.其他:音频处理、图像处理、通信、加密等方面,C语言也有很多应用。
三、Java
优点:
1.跨平台性:跨平台性非常好,同一段程序可以在不同的操作系统上编译运行,例如Windows、Linux、MacOS等操作系统均支持Java语言。
2.内存管理:提供垃圾回收机制,可以自动管理内存,减少了对内存的手动分配和释放。
3.安全性高:安全性很高,因为它实现了“安全沙箱”机制,确保代码在执行时不会损害系统或其他程序。
4.面向对象特性:面向对象的语言,支持封装、继承、多态等面向对象特性,帮助程序员更加高效地编写代码。
缺点:
1.使用大量的内存:垃圾回收机制需要占用大量内存,因此Java程序使用的内存较多,可能导致程序的运行速度相对较慢。
2.不能和底层打交道,不支持底层操作:Java使用虚拟机来实现,不能接近操作系统,也就不能和操作系统的底层打交道了。
3.启动时间慢:由于Java程序需要先启动虚拟机,再执行程序,所以启动时间相对其他编程语言较慢。
4.灵活性弱:因为Java删除了指针,所以不如C/C++等语言灵活。
应用场景:
Web编程:大部分企业喜欢使用Spring MVC构建Web应用程序的后端,使用Angular或React.js前端框架来构建应用程序的前端,并且最受欢迎的Java后端框架是Apache Struts。应用程序开发:Java被广泛用于开发桌面程序、移动应用和游戏等领域。例如,Android操作系统使用Java语言来构建应用程序。大数据技术:Hadoop和其他的大数据技术也在不同程度使用着Java,例如Apache的基于Java的Hbase、Accumulo和ElasticSearch。嵌入式设备:Java在嵌入式设备领域也有很大的应用,因为Java代码可以写成小型且可靠的二进制文件,并使用少量内存运行。管理工具:Java经常用于开发大型软件的管理工具,例如,Eclipse IDE就是一个用Java开发的项目管理工具。
此外,Java还可以用于开发安卓应用、游戏开发、金融和电子商务应用、科学和研究、企业应用、人工智能等多个领域。
四、C++
优点:
1.面向对象特性:面向对象的语言,支持面向对象的特性,例如封装、继承和多态等,可以写出更加高效、易于维护的程序。
2.性能高:编译型语言,与解释型语言相比,拥有更快的运行速度,可以开发高性能的应用程序。
3.可移植性高:可移植性很好,同一段程序可以在不同的操作系统上编译运行。
4.丰富的库支持:丰富的库支持,包括STL、Boost等,便于程序员编写程序。
缺点:
1.学习曲线陡峭:较为复杂,学习曲线较为陡峭,需要花费较长时间来掌握。
2.容易出现指针问题:使用指针时非常灵活,但也容易出现指针问题,例如空指针、野指针等,可能导致程序崩溃或出现安全问题。
3.微观管理内存:需要手动分配和释放内存,容易出现内存泄漏、重复释放等问题,给程序带来一定的风险。
4.可读性差:代码通常比较复杂,可读性可能不如其他编程语言,学习和维护程序的难度较大。
应用场景:
1.游戏开发:C++高性能,可以直接调用硬件资源,被广泛应用于游戏开发领域。例如著名的游戏引擎Unity3D就是使用C++编写的。
2.操作系统和驱动程序:由于C++可以直接访问硬件,因此它也被广泛用于操作系统和驱动程序的开发。例如Windows操作系统的大部分组件都是使用C++编写的。
3.嵌入式系统:C++也常常用于嵌入式系统的开发,它可以有效地利用硬件资源,并提高系统的性能。
4.金融和交易系统:C++在金融和交易系统中得到了广泛应用,例如高频交易系统和投资银行的交易平台。
5.图形图像处理:C++也被广泛应用于图形图像处理领域,例如Adobe Photoshop等软件都是使用C++编写的。
6.数据库开发:C++也可以用于数据库开发,例如Oracle数据库中的存储过程就是使用C++编写的。
综上,由于它的高性能和直接访问硬件的能力,C++在需要处理大量数据、实时性要求高、需要高效率的领域拥有着很强的竞争优势。
五、C#
优点:
1.简单易学:语法非常简单,易于学习和掌握。
2.安全可靠:强类型、类型安全和自动内存管理等特点,可以有效地避免程序中的内存泄漏和类型不匹配等问题。
3.面向对象:面向对象的编程语言,支持封装、继承和多态等面向对象的特性,可以大大提高代码的重用性和可维护性。
4.跨平台:C#语言可以运行在多种操作系统上,包括Windows、Linux和Mac OS等。
5.广泛应用:C#语言是微软公司的主打语言之一,被广泛应用于桌面应用程序、Web应用程序、游戏开发、移动应用程序等领域。
缺点:
1.依赖于.NET框架:C#语言需要依赖于.NET框架才能运行,这使得程序的运行环境比较庞大,可能会影响程序的性能。
2.开发工具较重:C#语言需要使用Visual Studio等比较重量级的开发工具进行开发,这使得开发环境的配置比较复杂,对计算机的性能要求较高。
3.学习曲线较陡峭:虽然C#语言的语法比较简单,但是对于初学者来说,学习曲线可能会比较陡峭,需要花费较长的时间和精力才能掌握。
应用场景:
1.Web应用开发:可用于开发ASP.NET Web应用程序,包括Web服务、Web应用程序和Web API。
2.桌面应用开发:可用于开发Windows桌面应用程序,如Windows Forms应用程序和WPF应用程序。
3.游戏开发:可用于开发游戏,特别是Unity游戏引擎的开发。
4.移动应用开发:可用于开发移动应用程序,如Xamarin和Unity等跨平台移动应用程序。
5.数据库应用开发:可开发数据库应用程序,如ADO.NET、LINQ和Entity Framework等。
6.科学计算和数据分析:可开发科学计算和数据分析应用程序,如Matlab和R等。
7.人工智能和机器学习:可开发人工智能和机器学习应用程序,如ML.NET。
8.云计算和大数据处理:可开发云计算和大数据处理应用程序,如Azure和Hadoop等。
六、Visual Basic
优点:
1.易学易用:语法简单,容易上手。
2.快速开发:可以快速创建图形化界面和数据访问应用程序。
3.面向对象:面向对象的编程语言,支持封装、继承和多态等面向对象的特性。
4.丰富的控件库:可以轻松创建各种图形化界面。
5.广泛应用:广泛应用于Windows平台上的各种应用程序,如办公软件、数据库应用程序、游戏等。
缺点:
1.性能较低:相比其他编程语言,VB语言的性能较低,运行速度较慢。
2.不支持跨平台:只能运行在Windows平台上,不支持跨平台,限制了其应用范围。
3.不适合大型项目:性能较低,不适合开发大型项目。
4.代码可读性差:由于VB语言的语法比较简单,代码可读性差,不利于维护和升级。
5.缺乏严格的类型检查:VB语言缺乏严格的类型检查,容易出现类型错误。
应用场景:
1.Windows桌面应用程序:VB最初就是作为Windows桌面应用程序开发工具而出现的。由于VB可以直接调用Windows API,因此它被广泛应用于Windows操作系统下的快速开发桌面应用程序,例如财务软件、ERP软件、文本处理工具等。
2.办公自动化:VB可以与Office等办公软件深度集成,提供宏和自定义函数的支持,可以方便地实现自动化操作,例如自动化批量处理Excel表格、Word文档等。
3.数据库应用开发:VB可以使用ADO(ActiveX Data Objects)来访问数据库,因此可用于快速开发数据库应用程序。
4.Web开发:虽然现在Web开发语言更为流行,但是VB也可以用于Web开发。例如ASP(Active Server Pages)就是基于VBScript脚本语言构建的。
总之,使用VB开发的应用程序可以很好地与Windows操作系统集成,并且适用于各种行业和领域。
七、JavaScript
优点:
1.快速的终端反应:JS在客户端执行,不需要服务器端支持就可运行,而且依赖任务的不同,结果几乎是立即完成的。
2.简洁性:JS使用DOM模型,提供大量的预编制的对象代码,使得开发一个满足用户需要的脚本变得轻而易举。
3.组件性和扩展性:JS的优秀组件特性可以通过第三方库和框架扩展,并且也支持与其他语言很好地交互。例如,使用Node.js服务器端可以使用JS语言。
4.事件驱动:JS以事件驱动的方式响应用户,通过在网页中执行操作生成的操作称为事件。例如,按下鼠标、移动窗口、选择菜单等都可以视为事件。
缺点:
1.安全问题:由于JS在客户端运行,所以可能会存在安全问题。黑客可以通过检查JS程序中的漏洞来攻击网站。
2.浏览器兼容性问题:不同的浏览器对JS解释的方式不同,可能会导致代码在不同的浏览器上运行出现不一样的结果。
3.开发效率低:JS的调试非常困难,因为代码运行在客户端环境,很难进行精确定位或无法复现的错误。
4.弱类型和松散的语法结构:JS是一种弱类型语言,没有严格的数据类型,这可能会导致非常难以调试和错误报告。此外,它还有一些松散的语法结构,可能会导致代码中出现一些难以诊断的问题。
应用场景:
1.Web前端开发:作为Web开发的核心语言之一,JS主要用于实现网页上的交互效果和动态特效,例如数据验证、鼠标悬停效果、轮播图、弹出框等。
2.前端框架开发:JS不仅可以应用在前端开发,也可以通过Node.js运行时环境用于后端开发。前端框架例如Angular、React、Vue等都是使用JS编写的。
3.移动应用开发:JS也可以通过各种跨平台开发框架(例如React Native、Ionic等)进行移动应用开发,甚至可以在iOS和Android系统中构建原生应用程序。
4.游戏开发:JS也可以用于浏览器游戏的开发,例如H5小游戏、HTML5游戏等,具有较高的移植性和扩展性[1]。
5.数据可视化:JS可以通过D3、Echarts等可视化库实现图表呈现和数据可视化。
总之,JS是一门非常重要且灵活的编程语言,广泛应用于Web前端开发、前端框架开发、移动应用开发、游戏开发和数据可视化等领域,随着互联网的快速发展,JS的应用场景不断拓展,并且不断提供更多的解决方案,因此学习JS对于当前和未来的开发工作都有很大的意义。
八、SQL
优点:
1.简单易学:SQL语言的语法较为简单,容易掌握。
2.数据完整性:SQL支持数据完整性,可以对数据进行约束,保证数据的完整性。
3.高效性:SQL可以快速地查询、更新、删除和插入数据。
4.数据安全性:SQL支持数据加密和访问控制,可以保障数据的安全性。
5.数据存储:SQL可以方便地存储和管理大量数据。
缺点:
1.复杂性:SQL的语法虽然简单,但是在处理复杂的查询和数据操作时,需要深入了解SQL的各种语法和函数,才能发挥其最大的作用。
2.学习成本高:虽然SQL语言的语法简单,但是需要花费一定的时间和精力学习。
3.数据规模限制:SQL在处理大规模数据时可能会出现性能问题,需要进行优化。
4.数据结构限制:SQL只能处理关系型数据,对于非关系型数据的处理能力较弱。
5.依赖于数据库:SQL是依赖于数据库的,如果数据库出现故障或者不可用,那么SQL也无法使用。
应用场景:
1.数据库管理系统:SQL是数据库管理系统中最常用的语言。它允许用户定义、操作和管理数据库中的数据。例如,MySQL、Oracle、Microsoft SQL Server等都是流行的关系数据库管理系统,它们都使用SQL语言。
2.数据分析:SQL语言可以用于查询、过滤、排序和汇总数据,因此它是数据分析师的必备工具。数据分析师可以使用SQL来提取数据并进行分析,以便为业务决策提供有用的信息。
3.网站开发:Web应用程序通常需要与数据库交互,以便从数据库中检索和存储数据。SQL语言可以用于编写与数据库交互的代码,例如,PHP、Python和Ruby等编程语言都提供了SQL数据库接口。
4.金融和会计:SQL语言可以用于处理大量的金融和会计数据。银行、保险公司和其他金融机构使用SQL来管理客户信息、交易记录和报告。
5.人力资源管理:SQL语言可以用于管理人力资源数据,例如,招聘、员工信息、薪酬和绩效管理等。许多企业使用SQL来存储和管理员工信息,以便进行人力资源规划和管理。
6.日志分析:SQL语言可以用于分析大量的日志数据。许多企业使用SQL来分析网站访问日志、应用程序日志和服务器日志,以便了解用户行为和系统性能。
7.嵌入式系统:SQL语言可以用于嵌入式系统中的数据存储和管理。许多嵌入式系统都需要存储和管理数据,例如,智能家居、智能医疗等。SQL可以用于在嵌入式系统中实现数据存储和管理。
九、PHP
优点:
1. 稳定性好:PHP是一种稳定的编程语言,能够保证代码的稳定性和可靠性。
2. 易于学习:PHP语言比较容易学习,语法简单,入门门槛低,适合初学者。
3. 开发效率高:PHP语言的开发效率很高,可以快速开发出功能完善的网站和应用程序。
4. 跨平台性强:PHP语言可以在多种操作系统上运行,包括Windows、Linux、Unix等。
5. 社区支持强大:PHP拥有庞大的开发者社区,提供了大量的开源代码和工具,可以帮助开发者解决各种问题。
缺点:
1. 性能有限:PHP语言的性能比较低,处理大量数据时会出现卡顿和延迟。
2. 安全性问题:由于PHP语言的开发门槛低,一些开发者可能存在安全意识不强的问题,容易出现安全漏洞。
3. 代码可读性差:PHP语言的代码可读性不高,难以维护和修改,需要开发者有一定的经验和技能。
4. 语言设计不够优雅:PHP语言的设计比较松散,缺乏一致性和优雅性,难以满足高级编程需求。
5. 生态环境不够成熟:相比其他编程语言,PHP语言的生态环境还不够成熟,缺乏完善的工具和框架。
应用领域:
1.Web开发:PHP可以用于开发各种规模的Web应用程序,从小型博客、社交媒体平台到大型电子商务网站等。
2.后端开发:PHP可以作为后端编程语言,为前端提供数据支持。同时,它也与其他后端技术(例如数据库)很好地集成。
3.数据库连接:PHP支持多种数据库,如MySQL、Oracle、PostgreSQL等,可以轻松连接和操作这些数据库。
4.服务器端操作:PHP可以在服务器端执行各种系统级操作,例如读取/写入/删除文件、处理数据等。
5.图像处理:PHP有许多图像处理库,如GD和ImageMagick,可以进行图像处理和生成缩略图等。
6.游戏开发:使用PHP和游戏引擎,可创建简单的Web游戏和游戏化应用程序。
7.命令行脚本:PHP也可以作为命令行脚本语言,为系统管理和维护提供自动化工具。
总的来说,它是一种流行的服务器端脚本语言,适用于各种大小的Web应用程序和其他用途。
十、GO
优点:
1.实现快:编译和执行速度非常快,可以处理大量的并发操作,适合开发高并发的Web应用程序和分布式系统。
2.资源占用低:使用的内存非常少,同时也具有垃圾回收机制,这使得它非常适合开发低资源消耗的应用程序。
3.任意环境随便跑:可以编译成不同平台的二进制文件,这使得它在不同的操作系统和硬件上运行都非常方便。
4.适合造轮子:适合用来开发各种工具和库,因为它具有简单、高效的特点,而且易于学习和使用。
5.适合实现C/C++一部分业务,Java的大部分业务:Go语言的语法和C语言比较相似,因此对于C/C++开发人员来说,学习起来比较容易。同时,Go语言也支持面向对象和其他高级特性,这使得它可以胜任Java等高级语言的大部分业务。
6.适合做最外层的胶水:通过RPC/REST/CGO粘合不同语言的模块,而在这个胶水层还可以实现各种业务逻辑,又不用像shell/py/node有诸多顾虑和局限。
7.提供了协程、指针、unsafe,cgo加上C/C++兼容的内存布局和跨平台的汇编,有了这些能做的事情的上限基本就非常高了。
缺点:
1.学习曲线陡峭:虽然Go语言的语法相对简单,但是由于其独特的特性和设计思想,对于初学者来说可能需要花费一定的时间来掌握。
2.不够灵活:Go语言的类型系统和语法规则比较严格,这会使得一些灵活的编程方式变得不易实现。
3.某些细节需要自己处理:在Go语言中,一些底层的操作需要自己手动处理,例如内存管理、协程管理等,这会增加开发人员的工作量和复杂度。
4.语言发展较慢:由于Go语言主要由Google公司维护,因此其语言的发展和新特性引入较为缓慢,这可能会使得Go语言在某些方面滞后于其他编程语言。
应用场景:
1.网络编程:由于Go语言内置了强大的网络编程支持,开发人员可以快速、方便地进行TCP/IP协议栈的编程,开发高性能Web应用或后端服务。
2.并发编程:Go语言采用了轻量级的协程,以及原生的goroutine和channel机制,相比于传统的线程,Go语言的并发编程更加方便、高效、安全、易于控制,使得开发高并发、分布式的应用变得更加容易。
3.云计算:因为Go语言的并发处理非常出色,所以在云计算领域使用很广泛,例如Kubernetes就是使用Go语言编写并且是目前最受欢迎的容器编排系统之一。此外,因为Go语言支持交叉编译,所以开发者可以在本地编译程序,然后将编译后的程序直接部署到云服务器上,非常方便。
4.大数据处理:由于Go语言具有高效、低时延的特点,所以在大数据处理方面也非常适合,例如使用Go语言处理大数据文件、编写ETL任务、编写数据分析程序等。
5.区块链开发:Go语言在区块链开发中应用非常广泛,许多区块链项目都是使用Go语言开发的。例如,知名的以太坊客户端Geth就是使用Go语言编写的。
总之,具有诸如高效、并发处理等特点的Go语言,对于网络编程、云计算、大数据处理、区块链开发等场景,都是一种非常优秀的开发语言。