OIer从入门开始,使用的只有C++语言,最多听说过Pascal,可能以为编程只存在于OI了。殊不知,这是坐井观天的行为,井外还有一整个大千世界。了解、学习一下其余编程语言,对于提升OIer的个人素养无疑是极有好处的。

注:可能带有个人观点或列举不全,欢迎补充和纠正

编程语言的分类

此处依据语言范式分类。语言范式,即语言的计算模型,是区别各语言的一个重要的特征。另外还有领域专用语言-通用语言等的区分,留给OIer课后了解。

命令式

包括C++、C、Pascal、Java等

命令式程序明显的有“命令”的特征,即其程序由一行行指令构成,电脑按次序执行这一行行指令。

命令式可进一步细分为面向对象和面向过程,可以自行了解。

函数式

包括Haskell等

函数式语言最明显的特征是其没有副作用(即没有赋值语句与变量),这导致了其程序有高度的可并行性。函数式语言的工作原理为“映射”,通过函数将输入数据映射成输出数据。

函数式语言的工作方式较反人类,这导致了其较难推广和在工程上大规模使用。

纯函数式语言似乎只有Haskell,其余均为多范式语言,这体现了函数式语言的小众。

声明式

包括SQL、Prolog等

该语言最显著的特征是高度专业性。语言通过描述解的特征来给出解,类似于描述蛋糕的外观,产生制作蛋糕的程序。这导致该语言只能在一个特定的领域工作,例如SQL在数据库领域,Prolog在逻辑推理领域。

SQL已在工业中广泛运用。

多范式

包括F#、Scala、Lisp系等。

该语言支持多种编程范式,可以说是结合了多种范式的优点。大多数语言是综合了命令式和函数式,有助于程序员一边用着命令式一边尝试其函数式特性。C++在面向对象的传播中起到了类似作用。

此处“跨范式”不包括面向对象-面向过程的区分,因此C++不算在内。

学术界编程语言

学术语言

这类语言的学术价值较高,经常在学术界作研究项目存在。

  • Haskell
    • 特点:纯函数式编程语言,不支持任何赋值语句、变量等特性。有大量书籍
    • 优点:作为纯函数式编程语言,学术价值极高
    • 缺点:学习曲线陡峭、易沉迷,反人类
  • Scheme
    • 特点:作为Lisp方言,语法纯粹简洁,在SICP中作教学语言
    • 优点:多范式(偏向函数式),易于讲解多种计算模型
    • 缺点:学习曲线较陡峭,语法反人类

学术界语言

即“学术界的工程语言”的简称,在学术界被广泛应用,用于数据处理和计算等。

  • Python
    • 特点:OIer应该很熟悉
    • 优点:库函数较多(例如OIer认识的FFT就包含在库里面,直接调用就好),编写效率高
    • 缺点:强制缩进,对养猫的人不太友好
  • R
    • 特点:在学术界被广泛使用,工程界较少
    • 优点:其在统计方面十分突出,用于统计的函数较多
    • 缺点:与Python相比,仅有统计较突出,其他完败
  • MATLAB(Matlab)
    • 特点:有脚本性质的语言,用于科学计算
    • 优点:在科学计算方面库函数较多,并且社区良好(意味着会有很多书籍,以及很多能解答你问题的人),在向量计算上十分突出
    • 缺点:循环语句效率低,以及其作为一门语言比较糟糕
  • Wolfram语言(感谢rvalue修正)
    • 特点:函数式语言,用于数学建模较多
    • 优点:符号计算天下无敌,Mathematica软件交互方便,作为一门语言价值较高
    • 缺点:比较小众,入门较难,可能比较反人类
  • Fortran
    • 特点:上世纪六十年代的编程语言,现在仍有应用
    • 优点:没有指针一类的玩意儿,所有数据都能在编译时确定地址,因此运行速度快
    • 缺点:难以构建复杂的系统和计算任务

教学编程语言

用于教学的语言,大多是OIer所熟悉的

  • BASIC(Basic)
    • 特点:微软家语言,在上世纪风靡一时
    • 优点:似乎是装机自带,为许多老程序员的童年回忆
    • 缺点:较古老和落后
  • Pascal
    • 特点:OI界语言,被NOIP认可
    • 优点:语法严谨,OI界书籍较多,坑较少
    • 缺点:语法繁琐,2022年将退出OI圈
  • C/C++
    • 特点:被NOIP认可的语言
    • 优点:C++的STL功能强大,语法较简单
    • 缺点:微言大义的坑极多(if(n=1))
  • Python
    • 特点:似乎是高考指定用语言?
    • 优点:入门简单,学习曲线平缓,趣味小项目多(Pygame)
    • 缺点:运行速度较慢,常数大

工程界编程语言

在工程界被使用的语言。

Web

Web,即网页编程。包括洛谷、百度等。一些语言仅列举名称。

  • JavaScript
    • 特点:在前端被广泛使用,一种脚本语言
    • 优点:语法灵活,前端的库较多
    • 缺点:语法混乱,如JavaScript真值表(图1)
  • PHP
  • SQL
  • Java
  • Python
  • Node.js
  • Ruby
    • 特点:动态类型语言
    • 优点:开发效率高,Ruby on Rails开发中小网站较好
    • 缺点:难以进行大规模开发

图1:JavaScript真值表

Java生态环境

能运行在Java虚拟机上的语言。由于Sun公司的宣传,Java在工程界的地位现在还几乎无人能撼。

  • Java
  • Scala
    • 特点:混合范式语言,支持函数式编程
  • Clojure
    • 特点:Lisp方言,开发效率极高
  • Kotlin

微软生态环境(.NET)

微软家的语言,大多基于.NET环境、

  • C#
  • F#
  • Q#
  • Visual Basic

苹果生态环境

在苹果操作系统(Os)开发中使用的环境。

  • Objective-C
  • Swift

硬件编程语言

用作底层编程,在单片机或者操作系统编程中使用。

  • C
  • ASM

其他

其他比较有名的编程语言

  • GO(谷歌设计开发的语言,后将其开源)
  • C++

搞怪语言

即不为实际使用而创造的语言,有些十分有名。仅列举一部分。

  • Brainf**k(BF)
  • Ook!
  • Whitespace
  • INTERCAL
  • Lolcode
  • Befunge
  • Chef
  • Piet
  • Shakespeare
  • BIT

对于OIer

如果是要搞好竞赛,仅仅掌握C++就好了。但是,正如前言所说,学习几门新语言,对于开拓视野,提升个人素养,改善代码风格,最终成为大佬,泡到妹子,是有极大助益的。

Common Lisp

作为Lisp家的方言,Common Lisp语法简洁,并且带有浓厚的函数式味道,对于OIer个人素养的提升有巨大作用。

有人说编程语言的发展就是从抽象层次低的语言发展成抽象层次高的语言,那么,我认为Lisp系语言就是未来的编程语言。Lisp系语言抽象层次极高,这体现在其极高的开发效率、简洁的语法和极少的代码量上面。有人做过统计,完成同一个任务,Lisp语言的代码量约是C语言的1/7。

对于Lisp语言的优点,可以看这篇文章

学习了基础Common Lisp之后,建议阅读SICP(《计算机程序的构造和解释》),然后就能放下了(或者刷点L99)。【不像人家Haskell,初学者都不知道什么时候放下

环境:推荐Emacs+Slime+SBCL。Emacs建议设置主题,其余插件都不是必需品。环境配置有些麻烦,预计需要一天时间。

参考书目:

练习题:

  • L99 界面丑,还是英文,不过各位大佬不会在意的

写在最后

我们可以看到,国外的谷歌、微软、苹果三大IT公司均有其设计、开发和维护的编程语言,如Google就设计了GO语言(并将其开源)。然而,国内的BAT却迟迟没有新语言发布的消息。实际上,几乎没有国产编程语言被大规模的用于工程、学术界(易语言除外)。这究竟是为什么呢?这是个值得深思的问题。