正文
C# 在很多方面与 Java 相似,在 Sun 和 Microsoft 解决关于 J++(微软实现的 Java 语言)和标准 JAVA 不一致的问题失败后,它是作为J++的替代语言出现的。像 Java 一样,它也是一个受欢迎的商业应用开发语言,有一系列其它语言针对共享 .NET CLR(公共语言运行库)的实现,包括 Python 的 IronPython 实现(原始的 IronPython 1.0 中的核心组件被抽取出来创建 .NET 动态语言运行库的中间层)。在很长的一段时间里,.NET是只能在 Windows 系统中使用的专有技术,有一个跨平台的开源代码 mono 重新实现了.NET,但在 2015 年初,微软宣布了 .NET 开源计划。
与列表里大多数语言不同,我并不推荐在日常使用 Eiffel。它之所以在推荐列表里,是因为这门语言有着大量优良的面向对象设计思想,包括以“正确可信”作为程序的设计目标。(同时,Eiffel 也告诉我对于大多数的软件开发,并没有以“正确可信”为设计目标,这是因为正确可信的软件确实无法妥善处理不确定的情况。当很多相关约束还不清楚,需要在不断迭代的过程中去逐步完善的时候,这种设计理念就完全不适合了)
学习这类编程语言,就需要去熟悉继承模型、契约设计、类不变项、前置条件、后置条件、协变(covariance)、逆变(contravariance)、方法查找路径、泛型编程,以及其他各种在 Python 的类型系统上也支持的特性。此外还有很多标准库模块和第三方框架,会用到“显示的面向对象”设计风格,例如 unittest 和 loggingmodules,以及 Django 框架里基于类的 view。
使用 CPython 的一种方式,是把它的内核当做一种“包含对象的 C 语言”的编程环境 – CPython 是通过 C 语言的风格去实现面向对象编程,也就是用 C 的结构体描述数据,然后把结构的实例指针作为第一个参数传给那些数据处理函数(也就是 CPython的C 里面的 omnipresentPyObject* 指针)。这种设计模式被有意复制到 Python 里,在实例方法和类方法需要显示的指定 self 或者 cls 参数。
C++ 的目标是在源码级完全兼容 C 语言,在此之上增加了一些高级特性,例如原生的面向对象编程支持和基于模板的元程序开发。C++ 的晦涩和复杂是臭名昭著的(即使 2011 年的语言标准的更新解决了大量最糟糕的问题),不过就算这样,C++ 仍然是很多场景下的选择,包括 3D 建模图形引擎和跨平台应用开发框架,如 Qt。
D 编程语言也很有趣,因为它和 C++ 的关系很像 Rust 与 C 语言之间的关系:设计 D 语言的目的是,既要保留 C++ 的大部分优点,也要避免 C++ 中存在的很多缺陷(比如缺乏存储安全性)。与 Rust 不同,D 语言不是一个从零开始设计的全新编程语言,相反,它是直接从 C++ 衍生出来的语言,尽管它不像 C++ 那样是 C 语言的严格超集,但它遵守一个设计原则,任何落入 C 语言和 D 语言公共子集中的代码,在两种语言中的行为必须相同。
学习这些语言有利于深刻理解把高级语言特征和底层 C 运行时模型相结合的复杂性。学习 C++ 也有助于使用 Python 操作已有的用 C++ 编写的库和工具包。
面向数组的数据处理: MATLAB/Octave, Julia
面向数组的编程用于数值编程模型:基于矩阵代数和相关的数值方法。
虽然 Python 的标准库并没有直接支持,不过在语言设计上已经做了考虑,一系列语法和语义上的功能支持,有助于第三方库 NumPy 以及类似的面向数组的工具。
在很多情况下,Python科学计算 软件系列都被当做专用的 MATLAB 编程环境的替代者,被广泛用于科学和工程上的建模、仿真和数值分析。开源项目 GNU Octave 的目标是在语法上与MATLAB代码兼容,让人可以比较面向对象编程的这两种方式。
Julia 是另一个相对较新的语言, 它的主要特点是支持面向数组编程和基于类型的函数重载.
学习一种这样的语言有助于深入理解 Python 科学计算工具包的威力,同时,学习这样的语言有助于研究如何利用 OpenCL 和 Nvidia 的 CUDA 等类似的技术实现硬件级并发执行,也有助于研究如何使用 Apache Spark 和 Blaze 等数据处理框架实现分布式数据处理。
由于有越来越多的大数据集需要处理。因此需要一种免费的能处理这样的数据集的分析工具,编程语言 R 就是一种这样的工具,它特别注重统计数据分析和可视化。
学习 R 语言有助于深入理解 Python 科学计算工具包的统计功能,特别是其中的数据分析库 pandas 和统计可视化库 seaborn 。
计算管道建模语言:Haskell, Scala, Clojure, F#
面向对象数据建模和面向数组数据建模主要用于对数据进行静态建模,有两种建模方式,一种是把数据保存在对象的各个属性中,另一种是把结构化的数据保存为数组。
相比之下,函数式编程语言更强调以计算流的形式对数据进行动态建模。只要学一下函数式编程基础,就会显著提高使用数据转换操作对数据建模的能力,这对于使用其他范式的编程语言(比如面向过程、面向对象、面向数组的编程语言)开发应用程序也是有帮助的。
Haskell 是一个函数式编程语言,对 Python 的设计产生过重大的影响, 最明显的就是 Python 2.0 引入的列表解析。
Scala 毫无疑问是基于JVM的函数式编程语言,与Java, Python和R一样,是Apache Spark数据分析平台的四门主要编程语言之一。在设计上支持函数式编程方式的同时,Scala的语法、数据模型和执行模型在设计上尽量避免为原有的Java程序员带了太大的障碍(从这个角度上看,Scala更恰当的分类应该是有着强函数式语言支持的面向对象的编程语言)。
Clojure是另一门基于JVM的函数式编程语言,被看作是Lisp的一个变种。它在我们的清单中具有一席之地,是因为它为Python的函数式编程工具箱toolz的实现带来灵感。
我自己对F# 并不熟悉,不过由于它是 .NET CLR 推荐的语言,所以还是值得关注的。
学习这些编程语言,有助于了解 Python 自身的计算管道建模工具,包括容器推导表达式、生成器、生成器表达式、functools 和 itertools 标准库模块,和第三方函数式 Python 工具如 toolz。
事件驱动编程语言:JavaScript, Go, Erlang, Elixir
计算管道是处理数据转换和分析问题的一种很好的方法,不过很多问题需要程序以持久的方式运行,等待事件发生,然后处理这些事件。对这类服务,通常可以并发的处理多个事件,来实现同时为多个用户(或者至少多个行为)提供服务。
JavaScript 最初是为浏览器开发的事件处理编程语言,可以让 web 开发人员处理客户端本地的用户行为(例如鼠标移动和按键)和事件(例如页面渲染结束)。所有现代的浏览器都支持 JavaScript,与 HTML5 的 DOM 一起,已经成为用户界面的外观和行为事实上的标准。
Go 是Google设计出来的,设计这个语言的目的是为了创建高度可扩展的网络服务,Go语言非常适合开发命令行程序。从设计编程语言的角度看,最引人注目的是Go语言在它的核心并发模型中使用了“顺序通信过程(Communicating Sequential Processes)”这一概念。