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)”这一概念。
Erlang 是爱立信设计出来的,设计这个语言的目的是为了制造高度可靠的电话交换机以及类似的设备,著名的开源框架RabbitMQ的消息服务器就是用Erlang实现的。Erlang使用Actor模型实现了核心并发原语,不允许不同线程直接共享数据,线程间的通信只能靠传递消息。尽管我自己从来没有使用过Erlang语言, 但我的第一份工作涉及到了一个基于Actor模型开发的并发框架,它是一个前爱立信工程师用C++开发的,我自己也基于TSK(任务)和MBX(邮箱)原语开发过这样的框架,是在德州仪器的轻量级DSP/BIOS运行时(现在叫TI-TROS)中实现的。
Elixir 能够出现在这个名单中的理由是,虽然它运行在Erlang虚拟机中,与编程语言Erlang具有相同的并发语义,但它也包含了一系列额外的语言级特征,提供了更全面的开发环境,更容易吸引从其他编程语言(比如Python、Java或Ruby)转过来的开发者。
学习一种这样的语言有助于深入理解Python本身是如何支持并发和并行的,包括原生协程、基于生成器的协程、concurrent.futures和asyncio标准库模块、第三方网络服务开发框架(比如Twisted和Tornado)、Django中新引入的channels概念和GUI 框架中的事件处理循环。
动静混合类型: TypeScriptPython 3.5 引入的特性里,最有争议的一项是新的类型模块,为 Python 体系加上了混合类型的支持。
对于那些接触过的静态类型编程语言主要是 C, C++ 和 Java 的开发者来说,这简直就是一个及其可怕的想法。
Microsoft 的 TypeScript 为 JavaScript 应用提供动静混合类型支持,让你对这个概念会有好一些的看法。TypeScript 代码会编译成 JavaScript 代码(编译后不包含任何运行时类型检查),主流的JavaScript 库的 TypeScript 注释(annotations)在DefinitelyTyped代码库里可以找到。
正如 Chris Neugebauer 在澳大利亚 PyCon 大会的报告上指出的那样,这很像是 Python 与类型提示库 typeshed 以及类似 mypy 那样的类型推导和分析工具之间的关系。
本质上,TypeScript 和 Python 的类型提示都是实现特定测试程序的方式,不管是独立文件(常规的测试程序),还是内嵌在主代码里(类似静态编程语言的类型声明)。不管哪种情况,你都可以运行单独的命令检查剩余的代码是否符合已知的类型约束(对于 JavaScript 和 TypeScript,在编译阶段会隐式的去完成,对于 Python 的类型提示,则是可选的静态分析任务)。
动态元程序设计: Hy,Ruby像 C、C++、C#、Java 这样的编程语言给 Python 带来的一个有点让人不安特性是“代码即数据”:类似函数和类都是运行时对象,可以被其他对象操作。