(点击上方蓝字,快速关注咱们)
编译:开源中国
www.oschina.net/translate/languages-to-improve-your-python
如有好文案投稿,请点击 → 这儿认识详情
27 种语言
过程型编程语言: C, Rust, Cython
面向对象数据建模语言: Java, C#, Eiffel
C 的面向对象衍生语言: C++, D
面向数组的数据处理: MATLAB/Octave, Julia
统计数数据分析: R
计算型管道建模: Haskell, Scala, Clojure, F#
事件驱动编程: JavaScript, Go, Erlang, Elixir
渐变类型: TypeScript
动态元编程: Hy, Ruby
实用问题处理: Lua, PHP, Perl
计算型思维: Scratch, Logo
做为这个世界上最流行的编程语言之一的合作设计者,我经常遇到一种令人非常懊丧的行径( Python 社区和其它行业中都存在)便是社区中有影响力的人尝试去在其它开源社区中灌输针对”缺失“的恐惧感,并以此驱动别人对本社区做出贡献(我自己偶尔亦会做出这般欠妥的行径,当别人掉进这个陷阱时我亦更易觉察出来)。
虽然借鉴其他编程语言社区的经验是一件好事,但用基于恐惧的办法来推动行动有很大问题,社区成员为了吸引代码贡献者的重视,容易把其他社区的成员视为竞争对手,而不是做为潜在的盟友一起迎接挑战,推动软件研发技术的进步。还会引起社区排斥哪些爱好其他编程语言的人,把她们当做敌人。
事实上,咱们期盼有更丰富的跨平台开源编程语言可供选取,编程语言是最重要的思维工具,能够把咱们的想法转换成计算机能理解的知道的条款。倘若人们发掘了某种语言既适合她们的大脑又能直接处理问题,这就很好了,不必关心她们到底选的是那种语言。
因此呢我要给 Python 社区提三个详细的需求和一个更广泛的意见,首要说这些需求:
1.当咱们想要激励部落成员,加强社区吸引力时,咱们不该该运用恐惧法,相反咱们应该运用自豪法。当运用恐惧法激励时,例如说这般的话:“倘若咱们不处理问题 X,那样 Python 研发者将会减少,他们将会转而去运用语言 Y”,那样咱们就在故意地向全世界自由贡献代码的人传递负能量。但倘若咱们运用自豪法,说出来的话将是这般的:“Python 中的问题 X 的确难以处理,瞧瞧语言 Y 的社区,她们用一个极好的办法处理了这个问题,咱们亦能够在 Python 中尝试这个处理方法,以一样优雅的方式处理 Python 中的问题”。积极地强调“以咱们自己的奋斗为自豪”,有利于促进 Python 社区中持续学习的文化,还会持续促进与其他社区关系的发展。
2.克制对其他编程语言社区蔑视的态度,尤其是对哪些有大牛存在,能自己处理遇到的问题,不必等待商场软件供应商屈尊处理问题的社区。世界上的大都数重要的问题都不是利益驱动的问题(哪些人想要处理问题,不是为了谋取财富,亦无公司出钱帮助她们),因此咱们应该鼓励和赞扬哪些加紧尝试处理问题的人。不必管她们运用的是什么技术。
3.倘若咱们认识的人刚起始学习编程,即使她们所选的编程语言是咱们自己所不爱好的。咱们亦要支持她们,由于她们比咱们清楚什么更适合她们的大脑。因此对咱们合适的语言不必定适合她们。倘若她们起始对当初的选取感到懊丧,以至于完全打消了她们学习编程的积极性,此时给她们举荐编程语言才更有道理。这个意见乃至亦对咱们其中做过改进网络安全方面工作的人有用,针对本来不安全的语言,咱们的处理方式是,经过改善操作系统中的沙盒功能,渐进地破除这个语言选取阻碍,用原生系统的安全属性,改善了编程语言默认行径,不该该从应用安全的方向评估编程语言的好坏,迷惑初学者。(倘若有人请编程新手写了一个未经审计的软件,却安排为处理安全敏锐的问题,这不是程序员的问题,而应该怪那个安排的人无尽职调查软件的源自和安全属性。)
我更加多的意见是针对人起始遭遇 Python 的核心程序集的境界,亦因此呢起始探索更加多的 Python 自己的“思维工具”。
咱们做 Python 核心研发过程的一部分事情是因为领会的特点拥有在其他语言咱们拥有优良,是不是能够用一种合适的方式让 Python 代码容易读写。这寓意着学习别的程序语言能够知道特定的风格,并且在 Python 中编程加强人对软件研发的认识。
为了有助于这般的奋斗, 我已然列出了下面可供探索的行业,还有有些对这些行业可能供给额外见解的语言。我尽可能的链接到 Wikipedia 页面而不是直接转向关联的首页,由于维基百科经常会给出有些有趣的历史背景,当选取一门新的编程言做为一项学术型的练习而不是被立即用来实践性运用的时候,这些背景值得去探索。
然而就我个人而言, 我熟练许多的编程语言(并且已然运用了其中的有些进行研发生产系统) 。所有的举荐包含我间接认识的语言(或经过阅读有些材料和设计文档,又或是从和我信任的伴侣之间的交流中得知一门语言的优良和劣势)。
本应该有非常多的与沿出此刻名单之中,然则针对列出来的这些特定的语言只是随意的有些子集,它们从某些程度来讲是基于我自己的兴趣而选出来的(例如说:我重点的兴趣点在于占安排地位的Linux,Android 和 Windows生态系统,因此在这儿我就忽略了封闭然则更加有利可图的以 Apple 为中心的 Objective-C 和 Swift 编程语言,况且我针对专注于艺术环境的编程语言就不太认识,如Processing,我乃至需要猜测从其中学到的东西怎么样能够指点一个 Python 研发者)。针对一个更全面的编程语言名单而言需要思虑非常多原因,除了思虑一个编程语言能够指点你作为一个研发者外,IEEE Spectrum 的一年一度关于编程语言流行度和增长的排名亦非常值得认识一下。
面向过程编程语言 C,Rust,Cython
Python 默认的运行模型是过程型的:咱们从主模块的顶部起始而后一句一句执行。所有的 Phthon 针对其他数据和计算模型的办法支持都是基于它是过程型的这一特性。
C 语言毫无疑问仍然是底层编程语言的统治者. 它是实现 Python 解释器的核心语言,一样亦是实现 Linux 操作系统内核的核心语言。做为软件研发人员,学习 C 语言是学习更加多关于软件所运行的底层硬件的最好起点 – C 语言经常被描述为“可移植的汇编语言”,一般运用 C 语言编译器做为交叉编译器,为新的 CPU 体系结构编译出第1个应用程序。
Rust,相比之下, 是一个由 Mozilla 创建的比较新的语言。它能够进入这个名单的原由是,Rust 吸取了工业界已知的关于不可在 C 语言中做什么的教训,并且被设计成能够与 C 库互操作的语言,它对硬件的掌控达到了和低级系统编程语言相同的精度,但它运用区别的编译时办法进行数据建模和内存管理,在结构上消除了许多平常的困惑 C 程序的的缺陷(例如缓存溢出、重复释放内存错误、空指针拜访以及线程同步问题)。我是一名嵌入式系统工程师,经过培训具备了最初的专业经验,我已然看到,当前被 C 语言和定制汇编代码统治的各个行业特别有可能会被 Rust 取代。
Cython 亦是一种默认的更底层的语言,然则与通用目的语言 C,Rust 区别,Cython 重点用于书写 CPython 扩展模块。Cython 被设计做为一个 Python 的超集,让程序员选取何时支持纯 Python 语法的灵活性,当 Cython 语法支持的扩展使其能够生成的代码相当于本地C代码的速度和内存效率。
学习这些语言之一是以实用的方向加强其对内存管理,算法效率,二进制接口兼容性,软件可移植性,将源代码转换成运行系统的深刻理解。
面向对象的数据建模: Java, C#, Eiffel
编程中最重点的任务之一是为现实世界的状态建模,这方面最一般的办法是面向对象语言所供给的哪些原生的语法支持:把数据结构、操作这些数据结构的办法组合成类。
Python原生设计上就能够直接运用面向对象的特性,而不需要一上来先学习怎样编写自己的类。不是每种语言都才有这般的方式 – 针对本节列出的这些语言,学习面向对象的设计思想是运用这些语言的前提。
得益于 Sun Microsystems 在 20 世纪 90 年代中后期对 Java 语言的市场推广,Java 成为了非常多大专院校计算机科学入门课程的默认语言。虽然此刻在非常多教育行业它正被 Python 淘汰,但它在商场应用程序研发行业仍然是一种最受欢迎的语言。有一系列其它语言针对公共的 JVM(Java 虚拟机)运行时的实现,包含 Python 的 Jython 实现。Android 系统的 Dalvik 和 ART 环境是基于 Java 编程 API 实现的。
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。
面向对象的 C:C++, D
运用 CPython 的一种方式,是把它的内核当做一种“包括对象的 C 语言”的编程环境 – CPython 是经过 C 语言的风格去实现面向对象编程,亦便是用 C 的结构体描述数据,而后把结构的实例指针做为第1个参数传给哪些数据处理函数(亦便是 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 便是一种这般的工具,它尤其注重统计数据分析和可视化。
学习 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)”这一概念。
Erlang 是爱立信设计出来的,设计这个语言的目的是为了制造高度靠谱的tel交换机以及类似的设备,著名的开源框架RabbitMQ的信息服务器便是用Erlang实现的。Erlang运用Actor模型实现了核心并发原语,不准许区别线程直接共享数据,线程间的通信只能靠传递信息。尽管我自己从来无运用过Erlang语言, 但我的第1份工作触及到了一个基于Actor模型研发的并发框架,它是一个前爱立信工程师用C++研发的,我自己亦基于TSK(任务)和MBX(邮箱)原语研发过这般的框架,是在德州仪器的轻量级DSP/BIOS运行时(此刻叫TI-TROS)中实现的。
Elixir 能够出此刻这个名单中的理由是,虽然它运行在Erlang虚拟机中,与编程语言Erlang拥有相同的并发语义,但它亦包括了一系列额外的语言级特征,供给了更全面的研发环境,更易吸引从其他编程语言(例如Python、Java或Ruby)转过来的研发者。
学习一种这般的语言有助于深入理解Python本身是怎样支持并发和并行的,包含原生协程、基于生成器的协程、concurrent.futures和asyncio标准库模块、第三方网络服务研发框架(例如Twisted和Tornado)、Django中新引入的channels概念和GUI 框架中的事件处理循环。
动静混合类型: TypeScript
Python 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 带来的一个有点让人不安特性是“代码即数据”:类似函数和类都是运行时对象,能够被其他对象操作。
Hy 是一个 Lisp 的变种,能够在 CPython 虚拟机和 PyPy 虚拟机上运行。Lisp 在“代码即数据”上做到了极致,Lisp 代码本身便是由描述需要实现的操作的嵌套的列表构成的(这门语言的名字就源自”LISt Processor”)。Lisp 风格的语言,最强大的一点是它们能够很容易的实现自己的行业特定语言(DSL),不外这有时候亦为阅读其他人的代码带来困难。
Ruby 在非常多方面都与 Python 很类似,然则做为更为开放的社区,Ruby 更接受动态元程序设计,而针对 Python,这方面只是“支持,但不鼓励”。这方面的功能包含重定义类加入有些办法,用闭包实现语言核心结构如迭代器。
学习这些语言能够帮忙深入认识 Python 自己的动态元程序设计的支持,包含函数和类装饰、monkeypatching(动态修改代码)、unittest.mock 标准库模块以及第三方对象代理模块入如wrapt(我还没找到什么编程语言有助于认识 Python 的元类(metaclass),倘若有人有好的意见,能够在评论里告诉我。元类的高级特性包含核心类型、抽象基类、枚举类型和混合类型(动态类型和静态类型混合)表达式的运行时执行)。
实用主义者:Lua, PHP, Perl
流行的编程语言一般并不是孤立的 —— 她们属于庞大的生态系统的一部分(商场和社区都是这般),另外还有终端用户、框架研发者、工具研发者、教育人员等等。
Lua是一门流行的编程语言,重点做为脚本引擎内嵌于大型的程序里。值得一提的例子有,为魔兽争霸游戏客户端编写的插件,在很多 Linux 发行版存在的 RPM 工具亦内置了 Ruby。与 CPython 相比,Lua 运行时体积仅有其非常之一,并且它的弱反省(weaker introspection)的能力亦能让它更易独立于应用程序的其他部分和宿主操作系统。一个值得说到的来自 Lua 社区对 Python 生态系统的贡献是,CPython 和 PyPy 采用 LuaJit FFI(Foreign Function Interface)做为其 JIT 友好的 cffi 接口库的基本。
PHP 是另一个受欢迎的编程语言,因为PHP善于生成HTML页面,被初期的虚拟服务器主机供给商广泛运用,因此呢它做为 LAMP stack(Linux-Apache-MySQL-PHP)的构成部分被广为人知。尽管PHP在设计中存在非常多令人苦恼的概念上的缺陷,它仍然成为了非常多著名的开源web 服务的基本,包含Drupal内容管理系统、WordPress博客引擎和支撑Wikipedia的MediaWiki引擎。PHP亦能支撑非常多重要的服务,例如众包社区所运用的分布式事件报告平台 Ushahidi。
和PHP同样,Perl 亦是Linux系统上的一个受欢迎的语言,与PHP区别,Perl不是做为网站研发平台被人熟知的,它更平常的用途是做为系统管理员管理系统的工具,它既能运用正则表达式处理字符串又能处理基于文本的Linux操作系统命令的输出结果。只运用Perl就能处理所有的任务,不需要再运用Whensh、awk和sed等工具了。
学习其中的一门语言并不可供给任何好的见解在审美上美丽或在理念上简洁的程序语言设计。可能的结果是在实践中供给有些编程语言的结构和采纳的知识,以及认识关于偶然的机会、历史的累积和降低入门门槛(经过重新分配使缺省变得可能)所起到的功效,这些都强于语言本身固有的能力。
尤其是,它能够供给有些见解关于 CKAN、OpenStack NFV、Blender、SciPy、OpenMDAO、PyGMO、PyCUDA、 Raspberry Pi Foundation 和 Python 的项目道理,经过广泛的商场组织,保证 Python 生态系统的公司投资连续进行。
数值计算的思想:Scratch,Logo
最后想说的是,我常常陷入这般的讨论,即结构化编程和面向对象倡导者的争论。后者自叫作面向对象编程语言和结构化编程语言同样易学。
当咱们谈论的是经过详细的数值实验来教育(设备人学),科研对象在仿真软件中的模型有着直接现实世界的参照物时,例如学生们能够接触到传感器,发动机,继电器等。我认为支持面向对象的小伙伴们有必定的道理。
然而针对其他人来讲,我遇到的一个典型的挑战是:拿起一本食谱,将其中一个菜谱转换成你认为易学的面向对象编程语言,而后找到一个理解这门编程语言的学生,沿着我的思路,来继续转换这个菜谱。(我期待着看到学术研究人员真正践行这般的学习过程,——我会发自内心的为这般的状况感到欣慰。)大都数的状况下,小伙伴们不必遵循这般的流程——仅仅需要在头脑中进行思维的实验就足以让她们感受到想要学会这“易学的”编程语言需要多少预备知识。
然而另一一个处理此问题的办法是学习哪些用于教育小孩儿数值计算的编程语言。
其中一种最流行的莫过于 Scrach,它是一种让学生利用拖动的方式来操作封闭的图形化环境,从而能够看到图形化界面中相应的移动和反应的编程接口。像 Scrach 这般的图形化环境是一种类似于利用连环画帮忙孩儿们逐步学习读书认字的方式的程序设计方式。
然而,这种利用一种特殊教育目的编程语言来操作一个图形化界面的想法并不新奇,随着的初期最经典环境之一的 Logo 环境在 2 0世纪 60 年代的创建(类似于 Python 自己的海龟模块),那时候,你所接触的重点的东西是一个“海龟”,你能够用命令它的移动来画线,从而改变图形环境。经过这种方式,像命令行、迭代、状态(例如:向上划、向下划)都以一种创立在人们的自然直观的思维方式(想象一下,假如你是一只海龟,倘若向右旋转 90 度将会出现什么?)的基本上来介绍。
回归本源,做为一名富有经验的程序员,重新学习以上的任何一门编程语言是最有效的方式来忘掉所学(抛弃有些轮子):这些语言工具所涵盖的概念帮忙咱们回想起哪些咱们曾经认为理所当然的概念,然则需要以初学者的眼光重新学习。当咱们这么做的时候,由于咱们更加愿意回想起全部的规律链条,包含哪些咱们之前认为理所当然而省略的思维过程,咱们会更加有效地和学生以及其他的初学者一块工作。
看完本文有收获?请转发分享给更加多人
关注「Python研发者」,提高Python技能
|