前言
自Lisp语言横空出世后,高级语言的发展便一发不可收拾,如今计算机编程语言市场百花齐放,各式各样的编程语言花样繁多,让人眼花缭乱。本文将粗略地介绍50种编程语言,并简单地进行分类。
语言受欢迎程度排名
先让我们看看语言受欢迎程度的排名
(摘自2017年10月TIOBE榜单)
https://www.tiobe.com/tiobe-index/
1~20名
Oct 2017 | Oct 2016 | Programming Language | Ratings | Change |
---|---|---|---|---|
1 | 1 | Java | 12.431% | -6.37% |
2 | 2 | C | 8.374% | -1.46% |
3 | 3 | C++ | 5.007% | -0.79% |
4 | 4 | C# | 3.858% | -0.51% |
5 | 5 | Python | 3.803% | +0.03% |
6 | 6 | JavaScript | 3.010% | +0.26% |
7 | 7 | PHP | 2.790% | +0.05% |
8 | 8 | Visual Basic .NET | 2.735% | +0.08% |
9 | 11 | Assembly language | 2.374% | +0.14% |
10 | 13 | Ruby | 2.324% | +0.32% |
11 | 15 | Delphi/Object Pascal | 2.180% | +0.31% |
12 | 9 | Perl | 1.963% | -0.53% |
13 | 19 | MATLAB | 1.880% | +0.26% |
14 | 23 | Scratch | 1.819% | +0.69% |
15 | 18 | R | 1.684% | -0.06% |
16 | 12 | Swift | 1.668% | -0.34% |
17 | 10 | Objective-C | 1.513% | -0.75% |
18 | 14 | Visual Basic | 1.420% | -0.57% |
19 | 20 | PL/SQL | 1.408% | -0.12% |
20 | 16 | Go | 1.357% | -0.45% |
21~50名
SAS,Transact-SQL,COBOL,Fortran,Dart,D,ABAP,Crystal,Scala,(Visual) FoxPro,Lua,Prolog,Ada,Apex,Lisp,VBScript,LabVIEW,Erlang,Alice,Logo,Kotlin,Awk,Julia,Bash,Scheme,Rust,Clojure,F#,ML,Hack
51~100名
4th Dimension/4D, ABC, ActionScript, APL, AutoLISP, bc, Bourne shell, C shell, CFML, cg, CL (OS/400), Clipper, Common Lisp, Elixir, Elm, Euphoria, Forth, Groovy, Haskell, Icon, Inform, Io, J, Korn shell, Ladder Logic, Maple, MOO, Moto, MQL4, MUMPS, NATURAL, NXT-G, OCaml, OpenCL, OpenEdge ABL, Oz, PL/I, PostScript, PowerShell, Q, REXX, Ring, RPG (OS/400), Smalltalk, SPARK, SPSS, Stata, Tcl, Verilog, VHDL
分类
了解了编程语言排名,我们知道了那些语言更受欢迎或更有前景(某种意义上相当于现阶段用的多的)。下面我们对这些语言进行简单的分类,我们可以对比排名和分类结果中了解一些信息。
以下的分类没有办法把所有语言都囊括进来,实际上很多语言本身的分类也比较模糊,不便分类。
按运行类型分类
实际上各个语言的运行类型现在都趋于模糊化了,下面指的是应用比较多的情况下的运行类型。
编译型语言
这里指一般直接编译到本地代码(不需要虚拟机)的语言(实际上MSVC++超出操作系统自带的新版本是需要另外运行时环境的,这是因为类库的扩展,这种不视为需要虚拟机)。
C、C++、Assembly、Delphi/Pascal、Swift、Objective-C、Visual Basic、Go、Fortran、D、Ada、Lisp、Rust……
实际上一些语言,如Java(Java编译到本地代码的项目很多;Kotlin,Kotlin Native项目)、C#(VB.NET,.NET Native项目)近期也支持了编译到本地代码(native code)的功能,所以上面举的例子是通常(比如C shell的特例)编译到本地代码的语言。
解释型语言
实际上现在很多基于虚拟机的解释型语言,其虚拟机大多支持JIT(即 及时编译),也就是说这些语言实际上兼有编译型和解释型语言的特征,很少纯解释型语言。譬如Java,JVM支持JIT,甚至Java 9还推出了jshell,可以把Java当成脚本语言来用。因此本节不再举例。
按编程方式分类
面向过程
C、Pascal、Visual Basic、Go、Fortran……
面向过程的语言大多出现年代比较早,这是时代局限性导致的。面向过程某种意义上可以视为面向汇编面向机器思考的方式。
面向对象
如今大多数语言都是面向对象的,面向对象的语言更加适应大型项目的构建,程序的模块化在OO下是自然而然的事情(这不代表面向过程就不可以,只是OO更加适应)。
Java、C++、C#、Python、PHP、VB.NET、Ruby、Delphi/Object Pascal、Swift、Objective-C、Dart、D、Scala、Lua、Kotlin、Rust、Smalltalk(面向对象语言的鼻祖)……
面向函数
函数式语言鼻祖Lisp是最早出现的编程语言之一(将数学的表示方式引入计算机编程领域,可以想到这对数学家很友好),然而函数式语言在编程领域一直不温不火,只在数学研究、人工智能(实际上AI在60~70年代是很热门的)领域有所体现。近期CPU从高频率转向多核心的方向发展,面向过程和面向对象的编程语言表达并行程序比较乏力(主要指程序不易于设计,而不是无法表达),而函数式编程语言所具有的纯函数(也就是没有状态)先天具备并行能力,使得函数式编程思想在近期又开始火热起来,很多面向对象的语言Java、C++、C#、Python等等等等都引入了lambda表达式和函数式编程所需要的库。因此本节只介绍一些纯的函数式语言或主要的函数式语言:
Common Lisp、Lisp、Scheme、Clojure、Scala、F#、Haskell、(O)Caml……
按变量模式分类
如果一个语言的变量一经声明类型即确定(包括编译器自动推导变量类型的),则这个语言称为静态语言,否则称为动态语言。一般脚本语言都是动态语言。函数式语言如Haskell没有变量一说,因此不参与分类。
静态语言
静态语言的好处是能在编译期间检查代码,提升代码查错率,借助IDE的强大提示能力,帮助我们快速找到想要的API。以下是静态语言:
Java、C、C++、C#、VB.NET、Swift、Objective-C、Visual Basic、Go、Fortran、D、Scala、Common Lisp(包含面向对象成分)、Kotlin……
动态语言
Python、JavaScript、PHP、Ruby、Perl、Matlab、Bash、Lua、ActionScript(Flash的控制语言)、Groovy……
按内存管理分类
此分类下我们只讨论堆空间的管理方式。
手动管理内存
手动管理内存指的是代码手工申请堆空间内存并主动释放(比如C的malloc/free,C++的new/delete,Pascal的new/free,Fortran的ALLOCATE/DEALLOCATE),这类语言多直接生成本地代码,效率较高(毕竟是手动管理内存),但管理内存较麻烦,且易出错。
C、C++、Fortran、Pascal、Delphi/Object Pascal、C#/VB.NET(Unsafe模式下)……
自动管理内存
自动管理内存指的是语言自带垃圾回收器(GC),基于虚拟机的语言几乎都自带GC,剩下的语言基本都是自带GC的。带GC的问题就是程序会经常暂停(Stop the World),暂停所有线程执行垃圾回收,对响应时间敏感的需求不适合使用这类语言(比如金融领域)。
按适用领域分类
先举一些通用语言,通用语言指一般可以胜任绝大多数工作(设计面向多用途)
Java、C、C++(通用性尤甚)、C#、Python、JavaScript(起初是仅面向前端,随着node.js的出现,JS已经可以担负大量的工作)、VB.NET、Swift、Objective-C……
通用语言量比较大,不再多举例。
本分类只是讲分类下用的比较多的语言,用的比较少的语言不会举例,遗漏会比较多,欢迎指出。
面向数学(数据)
Matlab、R、COBOL、Fortran、SAS……
函数式语言某种意义上也可以视为面向数学的。
面向后端
PHP(多用于编写网站后台)、Go(多用来开发服务器后端)、Python(快速开发)、Java/C#(后端领域全能)
面向终端
Bash(Unix、Linux、Mac OS平台)、Powershell(Windows平台)
面向底层
面向底层可以理解为用于硬件开发,比如嵌入式开发、操作系统开发等。
Assembly、Ada、C、C++、Objective-C(用的很少)、Pascal(用的很少)、Rust(用的很少)、D(要打问号)
面向桌面开发
C/C++(依赖系统API、或一些类库如wxWidget、Qt)、Java、C#/VB.NET(一般用于Windows)、JavaScript(配合HTML和CSS,依托node环境可以制作出桌面级应用程序,比如Atom、Visual Studio Code编辑器和GitHub客户端)、Swift/Objective-C(一般用于macOS)
面向移动开发
C/C++、Java(一般用于Android和老人机Java ME)、C#/VB.NET(一般用于Windows Phone,但后来出现的Xamarin使得其可以跨Android和iOS平台)、Swift/Objective-C(用于iOS平台)
其他
Verilog(面向硬件设计开发)、FoxPro(面向数据库)、Prolog/Erlang(逻辑编程语言)
按平台分类
这里的平台指虚拟机平台,很多语言自带虚拟机,但JVM(最初为Java设计)和CLR(最初为C#、VB.NET设计) 2个虚拟机平台收获了大量第三方语言,壮大了虚拟机的使用场景。
JVM系列语言
指允许运行在JVM上的语言
Java、Kotlin、Groovy、Clojure(Lisp方言)、Scala、JRuby(Ruby的移植)、Jython(Python的移植)……
.NET CLR系列语言
C#、C++/CLI、F#、J#(Java的语法)、PowerShell、IronPython(Python的移植)、IronRuby(Ruby的移植)、VB.NET、A#、IronLisp、P#(Prolog的移植)、Oxygene(Pascal的移植)、Phalanger(PHP的移植)……
小结
就分类来看,出现次数最多的几种语言,也恰好是受欢迎程度最多的语言。但是领域多决定语言,我们不是为了学语言而学,而是从中窥探到哪些领域十分活跃,然后再深入研究。语言可以1星期速成,因此选语言不是头等大事(甚至在公司间工作会经常换语言),语言只是我们表达思想的工具,很多语言的出现也是为了更好的解决某一方面的问题。