文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

软件开发总有不少关于编程语言选择的问题是非常纠结的,而且很容易引起争吵。

软件开发者一般都会强烈的认同他们所选择的工具,这其中混杂了主观偏好和一些客观事实。

然而,在近十年里,开发人员可使用的语言数量增长不少。这意味着语言的关联在不同的代码库、框架和平台上越来越分散。现代项目和现在的开发者也就变得越来越多元化,必须通晓多门语言,熟悉越来越多的语言和开发库。但仍需要一些关于语言的明智选择方法来指引。

第 1 段(可获 1.36 积分)

在那让人眼花缭乱的语言集市中,让我们聚焦于两种同样从20世纪90年代(1990)幸存到现在,却有着完全不同的起源故事,的两种语言:Java和Python。

Python的故事

Python在两种语言中更老一些,第一个版本发布于1991年,开发者是Guido van Rossum。是开放源代码的语言。python软件基金会(Python Software Foundation)管理着这门语言的设计和库的标准。python增强建议( Python Enhancement Proposal (PEP))过程指导着它的发展。

在语言的发展过程中,保持向后兼容是很常见的。但Python没有这么做。Python 2 发布于2000年,Python 3发布于2008年。兼容性还可以,但很多功能和语法都发生了变化,几乎可以认为是两种不同的语言了。比起改造以把新趋势新想法融合进Python 2(需要合并与妥协)中,Python 3被构思为一种基于Python 2经验的新语言。Python 3—最新版本是3.6—是被Python主流世界推荐的。Python 2开发者还在坚持,但Python 2的最终版是2.7,并将在2020年停止维护。

第 2 段(可获 2.56 积分)

Python的语法体现了可读性的哲学,简单又常规的风格鼓励简洁而一致的代码样式。它起源于脚本语言,体现了Unix的哲学,很简单就能用旧程序组装新程序,直接利用现有代码也很简单。这种简单性和可组合性也得益于Python的动态语言特性。它是一种在很多平台都可用的解释型语言,使其成为了通用开发的可移植项。

Python的实现,有用C编写的CPython,也在很多平台可用,也是最常用的。其他组织也有自己的实现,比如IronPython, 是用C#写的,提供了与.NET运行环境的紧密结合。

第 3 段(可获 1.51 积分)

Python是建立一个可扩展的对象模型的常用语言。用于面向对象的设计并不意味着开发者用Python写代码时最常用的风格就是面向对象的风格,它同样支持过程式编程,模块化编程和某些方面的函数式编程。

这个语言的名字----和数量不少的隐藏在文档和库中的小幽默—来自英国的超现实主义喜剧组 Monty Python.

Java的故事

虽然它1995年才发布,但Java的故事开始于1991年。James Gosling和其他在Sun Microsystems任职的人设想了一种用于和 电视系统互动的程序。它真正开始被大张旗鼓的宣传,是作为一种可移植的网络语言,尤其是应用于浏览器。它从这个起点还有很长的路要走,尤其是当时的名字尚是:Oak。

第 4 段(可获 1.68 积分)

只是相对于原定面向的电视市场而言,它太过重量型了,没办法拥有浏览器的一席之地,败给了动态HTML与JavaScript(只是名字像,实际上没啥关系)。然而,Java 很快就开发了服务器模式,转型成了中型语言,来确保主导语言中的排名。它吸引力与价值的一部分是它的可移植性与相对效率。虽然不是原生语言,例如C和C++,Java是编译型语言,它确切的运行模式更像是以机器为中心而不是完全的解释型语言,例如Python或者Perl。Java不仅仅是一种语言或库:它还包括一个虚拟机,或者说,一个生态系统。Java虚拟机(JVM)是一个理想的可移植性平台,用以运行Java代码,而不需要考虑硬件环境并写具有移植性的代码。Java承诺,一次编写,到处运行(Write Once, Run Anywhere (WORA))。只要JVM还存在,任何编译好的字节码都能很轻松的运行和交互。有很多JVM语言,包括更像脚本语言的Groovy,函数式语言的Clojure,对象过程混合的Scala,甚至是Python的变体,Jython

第 5 段(可获 2.69 积分)

Java是一种面向对象的语言,有着和C/C++近似的语法。它是动态链接,允许新的代码在运行时加载与运行,而不是动态类型的。Java的演变相对较慢,最近才合并了一些功能用以支持函数式编程。相对的,这种语言和VM的哲学都是将向后兼容作为首要指令。

在Oracle买下了Sun之后,这门语言和编译器最终还是开源了。这门语言的进化由Java Community Process (JCP)指导,JCP包括Oracle以外的公司和个人。

第 6 段(可获 1.31 积分)

那么这两种语言谁表现更好呢?让我们仔细的看一看。

性能

虽然性能不总是软件的突出问题,但也应该纳入考虑。网络I/O开销或者数据库访问控制占主导地位,比起其他方面的技术选择和设计时,语言的性能并不是那么重要,因为这涉及到整体效率。

然而Java和Python都不是特别适合高性能计算,但硬要说的话,Java是得益于平台与设计的。即使Python有些考虑性能的变种,比如PyPy,稍微提升了性能,却降低了可移植性,并不是Python的闪光点。

第 7 段(可获 1.31 积分)

很多Java的效率来自于虚拟机优化执行。JVM会将字节码转化为本地机器码,并作为程序执行,Just-In-Time (JIT) 编译是Java的性能总能与原生语言竞争的原因。依赖的JIT也是可移植的,比如HotSpot,默认JVM就使用了它。

Java的第一个版本就已经支持并发了,而Python更坚决的使用顺序型语言。并发有利于利用当前多核心处理器的优势,Java代码更容易就能做到。全局解释器锁(Global Interpreter Lock (GIL)),占主导地位的Python和CPython,就是使用的这种方式。Python的运行并没有数目限制,但对此过于依赖可能会干扰可移植性。

第 8 段(可获 1.7 积分)

遗留

语言的选择并不仅仅受限于是语言本身的设计和内在品质。语言存在就是为了创造代码,而代码受商业、经济学、历史、软件体系结构、技能和发展文化的影响。

遗留系统总是对现有技术有着惰性的影响。改变总是比继承更简单,渐进,而不是重写或革命。利用现存的Python 2代码库开发Python 3新版本总是比重写一个要简单。现存的Java后台项目总是多写一些代码来增加功能,也许是迁移到更多版本的语言,或者通过其他JVM,比如Scala and Groovy,来添加功能。

第 9 段(可获 1.64 积分)

Java的历史,在企业与其稍微冗长的编码风格,意味着Java的系统遗留要比同样的Python实现大得多。另一方面,组织可能会惊讶的发现,他们的IT设备中,这么多的脚本和胶水语言都是由Python写的,这两种语言都有遗留问题,但表现形式不同。

实际的敏捷性

开发者文化和趋势同时受益于这两种语言。By virtue出版社使用Java作为通用语言和工具,并专注于Java,Java通常被认为与敏捷开发和社区有着紧密的联系,但没有社区是静态又容易定义的。Python一直在敏捷社区存在,越来越受欢迎的原因很多,包括DevOps运动的兴起。

第 10 段(可获 1.85 积分)

Java享受着比Python更一致的重构支持,一方面由于它是静态类型,这使得它重构更可靠,更自动化。另一方面还有很多可用的IDE作为Java工具(IntelliJ, Eclipse,和NetBeans,什么的)。而Python是动态系统类型,鼓励代码的敏捷性,专注于简洁性,流动性和实验性,但Java是更严格的语言。但这样,也干扰了Python自动重构的可能性。Python文化有利于多种多样的编辑器而不是集中在特定IDE之间,这也意味着对自动化的更少期待。

第 11 段(可获 1.41 积分)

早期大受欢迎的JUnit,与测试驱动开发(TDD)联系紧密,这也意味着,在所有的语言中,Java可能享受了最强烈的测试驱动开发热情。IDE包含JUnit,在很大程度上,帮助了重构。

也就是说,Python的脚本起源和在标准库中对测试特性的包含,意味着Python对现代开发中的自动化测试并不是漠不关心,但这些特性更像是一种集成而不是一种测试。

第 12 段(可获 1.14 积分)

人力资源

有时语言的选择更多的是技能的应用而不是语言本身的应用。人员可能比语言设计与工具占更高的地位。如果工作的理想语言面临这样的问题,没有人会----也没有人想会----那么这可能不是工作的理想语言。另一方面,如果开发者们热切拥抱一种新技术,那么其他的事就没那么重要了,这是一个使用这种技术的足够好的理由。在Java世界,传统代码库的治病良方往往是由其他JVM语言提供的,比如Groovy或者Clojure做自动化测试,或者走出Java世界,比如用Python操作系统端。

第 13 段(可获 1.79 积分)

另一个人员问题是技能市场。Java和Python都是TIOBE Index 编程语言前10的中坚力量。Java一贯比Python更受欢迎,但Python成长很快,而Perl和Ruby已经开始衰落了。

遵循你所了解的情况,根据个人选择和就业兴趣,来决定你想选择的语言,这两种语言都有着充足的教育资源,Java在大学课程中出现更多,Python在高中出现更多。当前的IT毕业生简历上有这两者中的一种或两者都有几乎已经是一种默认的情况了。

第 14 段(可获 1.43 积分)

架构

选定语言的技能和现存的软件系统也影响着给定的软件架构,软件架构也受框架,库,重用和集成的影响。许多情况下,技术人员想利用选定语言的直接优势,而不是间接优势。将被纯Java开发团队维护的软件架构却使用Python web框架肯定是走不远的。

Java和Python享受着看上去无尽的支持,解决了常见和非常见问题的,热衷于解决问题与分享的,公司和个人,填充了开源代码库。事实上,两种语言都受益于----并塑造于----在线论坛和开源开发。

第 15 段(可获 1.58 积分)

当遗留问题,重用,性能和开发技能都重要时,一些架构决策仍然可以保持语言的选择开放。举个例子,微服务架构的崛起(面向互联网的系统被划分成小的,合作的进程) 使得语言的选择依赖于本地细节而不需要作为整个项目的主要考虑因素。

由于现代编程环境和其软件架构的多样性,一些团队和企业宁愿减少一些他们的技术选择,而不是生活在过去的决定和个人心血来潮的混乱中。虽然合并能减少选项,但是这并不是一个能掉以轻心的决定。对语言和框架的趋势保持关注是有益的,这样能避免走上岔路。

第 16 段(可获 1.65 积分)

结论

Java和Python都还有很长的路要走。自20世纪90年代以来,伴随着他们的社区发展, 他们一直在进化和适应,寻找新的细分市场,取代其他语言—有时在相同市场竞争。这两种语言都与开放性有关,所以公司、团队和开发人员在做出决策时最好保持开放的心态。

第 17 段(可获 0.78 积分)

文章评论