一句话选择现代编程语言

最近几年一直有新的编程语言变火,也不断的有新概念的出现。我一直有打算了解各种新的编程语言,并且如果有前景的话多学一门语言也是挺好的。因此本文总结我在了解一些流行的现代语言的过程中,记下来他们的各种特点。如果你也有兴趣尝试新的语言,那么希望这个文章可以帮到你~

关于语言的流行度可以参考TIOBE排名Github排名Stack Overflow排名。本文也不会详细介绍每个语言的特性,因为每种语言都用非常多的特性,而且很多也都还在不断开发中。正因如此,本文的评价也仅限用与写下本博客的时候。

本文主要关注通用程序语言,对于一些领域专用语言(Domain-Specific Language)如SQL就不比较了,因为他们是你需要的时候你就会用,你不需要的话也不需要学。

关于编程语言的演变,下面是一个很精炼的图(来源点我),如果想要更完整的演变关系的话可以参考维基的程序语言编年表(按年代按年份,推荐后面那个!),或者参考这个网站

现代编程语言的特性

在介绍语言之前,首先还是要介绍以下各种编程语言的概念,不然会埋没很多语言的优秀属性。语言详细特性的比较可以参考维基百科的比较,这里的介绍也都是粗略的简介,如果你有兴趣的话可以搜一下这些关键词了解了解~

  • 面向对象(Object-Oriented):如果有学过程序设计课程的话应该对这个是有了解的。面向对象主要指的是程序是围绕“类”(Class)来编写的。类包含了某一种对象的定义和方法,并且在此之上定义了继承关系,以便于简化代码。
  • 动态/静态类型(Dynamic/Static Type):静态类型指的是编程语言中所有变量都必须明确指定的类型,而动态类型语言则不需要指定变量类型。这两个特点是在灵活性和程序安全性之间做的权衡。这两个特性也被称为强/弱类型。在弱类型语言中,有**鸭子类型(Duck-typing)**的概念,也就是我们不关心变量具体是什么类型,只要它提供了指定的接口就可以了。
  • 元编程(Meta-Programming)/泛型(Generic Type):元编程指的是可以通过代码生成代码,最典型的例子就是C++的模板。而泛型在用法上很像元编程,但是它并不会显式地生成代码,而是可以看作支持带有“类型参数”的代码。
  • 命令式(Imperative)/声明式(Declarative)/函数式(Functional):命令式语言中,你需要一步步指定程序做什么;声明式语言中,你告诉语言你想要达到什么目的;函数式语言中,函数是一等公民,函数本身定义了你想达到什么目标,而程序通过不停地调用函数来实现。
  • 并行(Parallelism):并行指的是程序支持多个代码块同时执行。具体的并行三种方法可以参考我之前的博客《进程、线程与协程》
  • 数据科学:一些语言是针对数据科学设计的,他们主要的特点是有对高精度数值类型和多维张量的内置支持。
  • 测试驱动(Test-driven Development)/契约式(Design by Contract):这两个概念其实是不同的编程逻辑,测试驱动指的是程序最终的目的是通过一定的测试,而契约式编程则是指编写时,程序本身需要满足一定的条件关系。对测试和契约的支持虽然不是必须的,但是在现代大型程序中却是能大大提高程序编写效率和安全性的。
  • 虚拟机/中间语言(Intermediate Language):不少语言都通过虚拟机来完成跨平台的实现,编程语言的虚拟机会将语言特定的中间码翻译成机器码。其代表有JVM、CLR、LLVM。
  • 垃圾回收(Garbage Collection, GC):垃圾回收是不少语言运行时内置的功能,在有这个功能的语言中你不用操心变量的生命周期,因为对象的销毁由垃圾回收器帮你实现了。

下面开始介绍我对各个主流现代编程语言的一句话评价,这些语言主要选择自上文提到的排行榜。知乎有个类似的贴子,但是主要都是段子。

一(N)句话描述为什么选择这门语言

  • C: YYDS,是这里面最接近汇编的语言,性能好且依赖少,C语言的ABI能够被绝大多数语言调用。
  • CoffeeScript: 加糖版Javascript
  • C++: 最强大的语言之一,完整的面向对象和元编程支持,兼容C
  • C#: 语法糖超级多,最近微软拥抱开源使得编程资源也变多,比Java快
  • D: 目标是替代C++,有很多现代语言特性的支持,如契约编程
  • Dart: 谷歌背书的取代的Javascript的语言,但是也就仅此而已了
  • F#: C#的函数式版本
  • Fortran: 古老的语言,但运行非常快,甚至快过C
  • Go: 编译巨快,独立无依赖的可执行文件,内置有完整的协程支持
  • Groovy: Apache开发的动态类型版Java,对标Ruby
  • Haskell: 函数式语言代表作,有很多语法概念都是从Haskell走出来的
  • Java: 在服务器后端应用特别广的语言,有垃圾收集,包特别多
  • Javascript: 前后端都非常流行的语言,语言灵活,被浏览器支持,也有非常多的包
  • Julia: 面向科学计算的语言,运行速度快,内置支持多维张量,有望替代Fortran
  • Kotlin: JetBrains开发的加语法糖的Java,而且都是很现代的语法糖,可以编译为Java或者Js
  • Matlab: 针对工程师和科学家的语言,工具包非常全,Simulink暂无敌手
  • Objective-C: 有啥优点吗?
  • Perl: 适合用作脚本语言或者胶水语言,字符串处理方便
  • PHP: 可以嵌入HTML,灵活,语法简单,针对服务器端
  • Python: 非常灵活,所有东西都是对象(包括类、函数),可读性强,与C/C++兼容好,包非常丰富
  • R: 针对统计科学家的语言,包也很全
  • Ruby: 链式调用、语法糖、跟Python一样的灵活性
  • Rust: 语法保证的内存安全、无垃圾回收、也就意味着运行很快
  • Scala: 相比于Kotlin,像是JVM上的C++,而Kotlin像是JVM上的C#
  • Swift: 苹果开发来用以替代Obj-C的语言,定位上类似Java
  • Typescript: 强类型版的Javascript
  • Vala: 目标是替代C/C++在Linux的GUI编程中的地位,可以编译成C代码,因此性能不错
  • Visual Basic: 微软曾经在很多软件中都内置支持

一(N)句话描述为什么劝退这门语言

  • C: 功能过于简陋,需要用结构体和指针实现面向对象,不安全
  • CoffeeScript: 感觉没有核心竞争力,更多的人会用Typescript
  • C++: 模板编译难以纠错,编译也很慢,语法糖靠各种模板和标准库实现,不优雅,
  • C#: .NetStandard标准混乱,API经常变且不向后兼容
  • D: 没有好爹,没有生态
  • Dart: 感觉不如选择Typescript
  • F#: 没人用哈哈哈哈,要么都去用C#了
  • Fortran: 老式语法,没有什么现代语言特性
  • Go: 没有泛型、不许有未使用的变量和模块
  • Groovy: 如果不限于JVM平台的话有更好的选择
  • Haskell: 学它像是搞工程的人去学理论数学,包也不多
  • Java: 语法繁琐落后,不如C#写着优美,也不如C#性能好
  • Javascript: 单线程,语言过于不严格,参见下面著名的三位一体图
  • Julia: 超级难用的包管理器,语法也很蛋疼
  • Kotlin: 编译慢,此外没有特别大的缺点,不过如果不限于JVM平台的话有很多其他的选择
  • Matlab: 语言本身是Mathworks的专利,并且使用一定要装Matlab软件,大部分功能都可以用Python和Julia实现了
  • Objective-C: 只有苹果开发曾经在用,可读性差
  • Perl: 晦涩难懂,过于灵活,性能也不行,感觉不如用Python
  • PHP: 单线程,仅适用于Web开发,通用性和社区活跃程度不如JS
  • Python: 性能差,单线程(GIL)
  • R: 比Matlab语法还蛋疼
  • Rust: 编译器太严格、字符串操作很蛋疼
  • Ruby: 目前主要是后端工程师使用,性能差
  • Scala: 比Kotlin难上手,与Java互操作性也较差
  • Swift: 如果不是开发iOS和OSX没必要用
  • Typescript: 如果不是Web开发没必要用
  • Vala: 主要用户是Gnome和ElementaryOS,生态还不是很完善
  • Visual Basic: 如果没有历史包袱就不要用了