Java与Python:哪一种最适合您? [信息图]

通过从应用程序中学习企业APM产品,发现更快,更高效的性能监控。 参加AppDynamics APM导览!

在软件开发中,很少有问题比选择编程语言更具分裂性或部落性。 软件开发人员经常以自己选择的工具来强烈地认同自己,将客观事实与主观偏好自由地混合在一起。

但是,在过去的十年中,生产中使用的语言数量以及单个开发人员可能会每天使用的语言数量都出现了爆炸式增长。 这意味着语言联系有时会在不同的代码库,框架和平台之间更加宽松和广泛地分布。 现代项目和现代开发人员越来越多,可以使用比以往更多的语言和库。 明智的选择仍然可以发挥作用。

从那繁华的编程语言市场中,让我们将关注范围缩小到1990年代两个有着不同起源故事的幸存者:Java和Python。

Python的故事

Python是这两种语言中的较老版本,由其发明者Guido van Rossum于1991年首次发布。 自成立以来一直是开源的。 Python软件基金会负责管理语言及其库的设计和标准化。 Python增强建议 (PEP)流程指导其开发。

在编程语言演进中,通常无限期地保持向后兼容性。 Python并非如此。 Python 2于2000年问世,Python 3于2008年问世。它们在很大程度上是兼容的,但是在功能和语法上的差异却足以将它们视为不同的语言。 Python 3并不是将更新的趋势和思想改编到Python 2中(使语言变得复杂和妥协),而是被认为是一种从Python 2的经验中学到的新语言。 Python 3(在撰写本文时为3.6版)是Python世界中当前发展和强调的地方。 Python 2的开发继续单独进行,但最终版本是2.7版,该版本将在2020年之后不再保留。

Python的语法体现了可读性的哲学,其简单且规则的样式鼓励简洁和一致的代码布局。 它起源于脚本语言,体现了Unix的哲学,即能够从旧开始编写新程序以及直接使用现有代码。 Python的动态类型系统帮助实现了这种简单性和可组合性。 它是许多平台上可用的一种解释语言,使其成为常规开发的可移植选项。

Python的参考实现是用C编写的,称为CPython,可在许多平台上使用,并且是最常用的参考实现。 其他小组已经创建了自己的实现,例如IronPython ,它是用C#编写的,并且与.NET运行时紧密集成。

Python是围绕可扩展对象模型构建的通用语言。 它的面向对象的核心并不一定意味着面向对象是开发人员使用Python编程时最常用的样式。 它支持过程编程,模块化编程以及功能编程的某些方面。

这种语言的名称来自英国超现实主义喜剧组织Monty Python,并且在其文档和库中也发现了不少幽默。

Java的故事

尽管Java直到1995年才发布,但Java的故事始于1991年。Sun Microsystems的James Gosling和其他人构思了一种用于对交互式电视系统进行编程的语言。 它的发布是一种可移植的互联网语言,尤其是在浏览器中。 现在距离这个起点和原始名称还有很长的路要走:Oak。

就像当时对于原始电视目标市场而言过于沉重一样,它失去了使用动态HTML和JavaScript(尽管它的名称与语言无关)的浏览器空间。 但是, Java很快在服务器和教室中找到了自己的位置,从而帮助确保了它在千年之交时成为主流语言的地位。

它的吸引力和价值的一部分是它的便携性和相对效率。 尽管不是诸如C和C ++之类的本地语言,但Java是一种编译语言。 与纯解释语言(例如Python和Perl)相比,其执行模型更加以机器为中心。 Java不仅仅是一种语言和库:它还是一个虚拟机,因此也是一个生态系统。 Java虚拟机(JVM)是​​一种理想的可移植平台,用于运行Java代码。 Java的承诺是编写一次即可在任何地方运行 (WORA) ,而不用担心硬件的特殊性和将代码移植到新平台上的麻烦。 这样一来,只要存在JVM,编译到其字节码中的任何内容都可以运行,并且可以轻松地与为JVM编写的其他任何内容交互。 JVM语言有很多,包括更像脚本的Groovy ,功能性Clojure ,对象功能的混合Scala甚至是Python变体Jython 。

Java是一种面向对象的语言,具有许多程序员都熟悉的类似于C / C ++的语法。 它是动态链接的,允许下载和运行新代码,但不能动态键入。 作为一种语言,Java的发展相对较慢,直到最近才合并了支持功能编程的功能。 另一方面,语言和VM的理念都是将向后兼容性视为主要指令。

在甲骨文收购Sun之后,该语言及其编译器最终开源。 该语言的发展受到Java Community Process (JCP)的指导,其中包括Oracle以外的公司和个人。

那么这两种语言如何叠加? 让我们按类别细分。

速度

尽管在软件中性能并不总是问题,但应始终将其作为考虑因素。 在网络I / O成本或数据库访问占主导地位的情况下,就整体效率而言,语言的特定效率不如技术选择和设计的其他方面重要。

尽管Java和Python都不特别适合高性能计算,但是当性能很重要时,Java在平台和设计上都具有优势。 尽管对某些Python实现(例如PyPy)的性能进行了微调,但原始的可移植性能并不是Python的亮点。

Java的许多效率都来自优化到虚拟机的执行。 JVM可以在程序执行时将字节码转换为本地机器代码。 这种即时(JIT)编译是Java的性能通常可以与本地语言相媲美的原因。 依赖JIT是一个合理可移植的假设,因为默认Oracle Oracle JVM HotSpot提供了它。

Java从其第一个公共版本开始就对并发提供支持,而Python绝对是一种顺序语言。 这意味着要利用当前的多核处理器趋势,而Java代码更容易做到这一点。 Python的主要实现方式CPython中的全局解释器锁 (GIL)阻碍了这种扩展。 存在不受命中限制的Python实现,但是依赖它们可能会干扰支持Python代码的某些可移植性假设。

遗产

ss

语言选择通常与语言本身的设计和内在品质无关。 存在用于创建代码的语言,并且该代码具有业务,经济学,历史,软件体系结构,技能和开发文化的上下文。

传统系统在其现有技术方面存在惯性。 更改将更容易遵循已经设定的路径,而不是通过重写和革命来逐步地,逐步地转移。 例如,与重写相比,现有的Python 2代码库更有可能在Python 3中找到新的生命周期。 现有Java企业项目的后端可能会通过添加更多Java代码来扩展其功能,可能会迁移到该语言的最新版本,或者通过在其他JVM语言(例如Scala和Groovy)中添加新功能。

Java在企业中的历史及其较为冗长的编码风格意味着Java遗留系统通常比Python遗留系统更大且数量更多。 另一方面,组织可能惊讶地发现将IT基础架构结合在一起的脚本和胶合代码由Python组成。 两种语言都有一个遗留问题,但通常呈现的方式有所不同。

实践敏捷

开发文化和趋势使Java和Python受益。 通过使用Java作为通用语言的出版物和专注于Java的工具,人们经常看到Java与敏捷开发及其社区有着更紧密的联系。 但是,没有一个社区是静态的,因此很难定义。 Python一直存在于敏捷领域,并且由于许多原因(包括DevOps运动的兴起)而变得越来越流行。

Java比Python拥有更一致的重构支持,一方面是由于它的静态类型系统使自动重构更加可预测和可靠,另一方面是因为Java开发中IDE的普及(例如,IntelliJ,Eclipse和NetBeans)。 Python的更具动态性的类型系统鼓励代码的另一种敏捷性,着重于简洁性,流动性和实验性,而Java可能被视为更严格的选择。 但是,相同类型的系统可能会成为Python自动重构的障碍。 Python的文化偏向于广泛的编辑器,而不是基于IDE,这意味着人们对强大的自动重构支持的期望越来越低。

JUnit的早期流行及其与测试驱动开发(TDD)的联系意味着,在所有语言中,Java可能对任何语言的单元测试都拥有最一致的开发人员热情。 在IDE中自动包含JUnit起到了很大的作用。

也就是说,Python起源于脚本编写并将测试功能包含在其标准库中,这意味着Python对现代开发中对自动测试的强调并不陌生,尽管它更可能是集成而不是单元测试。

人力资源

有时,语言选择更多是关于技能的应用,而不是软件应用程序本身。 人员配备可能比语言设计和工具更重要。 如果该工作的理想语言是没有人具有技能,也没有人想要技能,那么这可能毕竟不是该工作的理想语言。 另一方面,如果开发人员热衷于接受一项新技术,那么在其他所有条件都相同的情况下,这可能是使用该技术的足够充分的理由。 在Java世界中,通常可以通过拥抱另一种JVM语言(例如使用Groovy或Clojure进行自动化测试)或完全走出Java领域(例如使用Python处理Python的操作方面)来获得遗留Java代码库的好处。系统。

人员配备问题的另一方面是技能市场。 Java和Python都是TIOBE Index编程语言受欢迎度排名前10位的清单。 Java一直比Python流行得多,但是Python经历了这两种语言的更大发展,在Perl和Ruby下降的领域有所发展。

遵循对个人选择和就业兴趣都产生最大影响的想法就是您所知道的,这两种语言在教育中都有很强的立足点,Java通常用于大学课程,而Python通常用于高中。 当前的IT毕业生在简历上几乎都默认使用这两种语言中的一种或两种。

建筑

技能和现有软件系统以及选择会告知任何给定软件体系结构中使用的编程语言。 软件体系结构还涉及框架和库,重用和集成。 在许多情况下,人们想要利用这种技术来决定语言选择,而不是相反。 围绕Python Web框架构想的软件体系结构对于仅Java的开发团队来说是遥不可及的。

Java和Python都享受着源源不断的开源库,这些源库由已经解决了常见和不常见问题并乐于共享的个人和公司的代码组成,这些人和公司乐于分享,以便其他人可以利用他们的解决方案。 确实,两种语言都受益于在线论坛和开放源代码开发并受其影响。

当遗留,重用,性能和开发技能的问题都考虑在内时,某些体系结构决策仍然可以使语言选择保持开放。 例如,微服务架构的兴起(将面向互联网的系统划分为小的协作过程),使得语言的选择更多地取决于局部细节,而不是整个项目的主要考虑因素。

对于现代编程领域及其软件体系结构中存在的所有多样性,一些团队和企业更愿意减少他们的某些技术选择,而不是忍受过去的决策和个人异想天开。 但是合并可以减少选择的余地,因此这并不是一个轻率的决定。 值得留意语言和框架的趋势,以免走错路。

结论

Java和Python都可以长期使用。 自1990年代以来,他们与开发社区一起不断发展和适应,找到了新的利基市场并取代了其他语言,有时甚至在同一领域竞争。 两种语言都与开放性相关联,因此公司,团队和开发人员在做出决策时最好保持开放的态度。

通过从应用程序中学习企业APM产品,发现更快,更高效的性能监控。 参加AppDynamics APM导览!

翻译自: https://www.javacodegeeks.com/2017/06/java-vs-python-one-best-for-you.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349710.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

零基础学习java------day11------常用API

API概述 API(application Programming Interface, 应用程序编程接口),是一些预先定义的函数。目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节 比如我需要在一个程序里面嵌入…

.net 下的集合

集合的操作在编码的时候很常见。但是由于经常使用几种集合。而忽略了一些不常用的集合。在这里我整理下。 首先先了解下接口&#xff1a; 1、IEnumerable&#xff0c;返回一个循环访问集合的枚举器。 2、IEnumerable<T>&#xff0c;返回一个循环访问指定集合T的枚举器。 …

aspects_具有Aspects的Java中的Mixin –用于Scala特性示例

aspectsScala特征允许将新行为混合到一个类中。 考虑两个特征&#xff0c;可以向JPA实体添加审核和与版本相关的字段&#xff1a; package mvcsample.domainimport javax.persistence.Version import scala.reflect.BeanProperty import java.util.Datetrait Versionable {Ver…

TCP服务端实现并发

socket 在 tcp 协议下通信 客户端 import socket ​ # 创建客户端TCP协议通信 c socket.socket() # 与指定服务端握手 c.connect((127.0.0.1, 8080)) ​ # 通信循环 while True:# 向服务端发送信息msg input(>>>)if len(msg) 0:continuec.send(msg.encode(utf-8))#…

问题 1052: [编程入门]链表合并

题目描述已有a、b两个链表&#xff0c;每个链表中的结点包括学号、成绩。要求把两个链表合并&#xff0c;按学号升序排列。 输入第一行&#xff0c;a、b两个链表元素的数量N、M,用空格隔开。 接下来N行是a的数据 然后M行是b的数据 每行数据由学号和成绩两部分组成 输出按照学号…

ssh 看apache_使用Apache KeyedObjectPool的ssh连接池

ssh 看apache我发现org.apache.commons.pool非常有用且健壮&#xff0c;但没有充分记录。 因此&#xff0c;我将在这里帮助您解释如何使用Apache KeyedObjectPool 。 什么是KeyedObjectPool &#xff1f; 它是一个映射&#xff0c;其中包含多种类型的实例池。 可以使用任意键访…

问题 1066: 2004年秋浙江省计算机等级考试二级C 编程题(2)

题目描述输入一个正数x和一个正整数n&#xff0c;求下列算式的值。要求定义两个调用函数&#xff1a;fact(n)计算n的阶乘&#xff1b;mypow(x,n)计算x的n次幂&#xff08;即xn&#xff09;&#xff0c;两个函数的返回值类型是double。 x - x2/2! x3/3! ... (-1)n-1xn/n! 输出…

Ubuntu16.04下安装多版本cuda和cudnn

Ubuntu16.04下安装多版本cuda和cudnn 原文 https://blog.csdn.net/tunhuzhuang1836/article/details/79545625 前言因为之前针对Pytorch&#xff0c;caffe&#xff0c;torch等&#xff0c;装了cuda8.0和对应cudnn5.1&#xff0c;但是最近在装MxNet的时候&#xff0c;发现官网上…

什么是javax.ws.rs.core.context? [ 第1部分 ]

如何使用Context批注 JAX-RS API提供了一种非常方便的机制&#xff0c;可以将各种有用的资源&#xff08;例如HTTP标头&#xff09;注入到端点中。 Context注释是一个通用注释&#xff0c;它注入以下对象的实例&#xff1a; HttpHeaders- > HTTP标头参数和值 UriInfo- >…

spring的事件

理论 异步的实现方式可以使用事件&#xff0c;或者异步执行&#xff1b; spring中自带了事件的支持&#xff0c;核心是ApplicationEventPublisher; 事件包括三个要点&#xff1a; 事件的定义&#xff1b;事件监听的定义&#xff1b;发布事件&#xff1b;实战 代码路径&#xff…

[多项式算法]多项式求逆 学习笔记

多项式求逆 和整数的乘法逆元定义类似&#xff0c;对于多项式\(A(x)B(x)1\)&#xff0c;则称\(A(x),B(x)\)互为乘法逆元。 \(A(x)\)存在乘法逆元的充要条件是\([x^0]A(x)\)存在乘法逆元。 现在思考如何用\(O(n\log n)\)的时间计算\(A(x)\)的乘法逆元&#xff1a; 考虑倍增&…

java jax-rs_在Java EE 6中将Bean验证与JAX-RS集成

java jax-rsJavaBeans验证&#xff08;Bean验证&#xff09;是Java EE 6平台的一部分提供的新验证模型。 约束通过以JavaBeans组件&#xff08;例如托管Bean&#xff09;的字段&#xff0c;方法或类上的注释形式的约束来支持Bean验证模型。 javax.validation.constraints包中提…

ubuntu16.04+cuda9.0_cudnn7.5+tensorflow-gpu==1.12.0

1、查找可用的tensorflow源&#xff0c;该命令运行后终端会输出所有可用的源 anaconda search -t conda tensorflow2、这里name是上一步中输出源的tensorflow name栏的名称&#xff0c;show命令会在终端输出该源具体的信息和下载需要的指令,执行后如图&#xff1a; anaconda sh…

介绍OpenHub框架

本文介绍了OpenHub框架 -基于Apache Camel的新的开源集成解决方案。 本文回答了一些问题&#xff0c;为什么您应该关心另一个集成框架&#xff0c;强弱属性以及如何使用OpenHub启动新项目。 OpenHub框架是Apache Camel&#xff0c;但经过改进…… 当然&#xff0c;您只能使用A…

问题 1072: 汽水瓶

题目描述有这样一道智力题&#xff1a;“某商店规定&#xff1a;三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶&#xff0c;她最多可以换多少瓶汽水喝&#xff1f;”答案是5瓶&#xff0c;方法如下&#xff1a;先用9个空瓶子换3瓶汽水&#xff0c;喝掉3瓶满的&#xff0…

呼叫我或异步REST

本文是使用Spring Boot Java 8创建的工作正常的异步REST应用程序的非常简单的示例。SpringBoot使得开发Web应用程序几乎非常容易&#xff0c;但是为了简化任务&#xff0c;我从Spring存储库中举了一个例子&#xff0c;称为rest- service &#xff0c;将其分叉到我自己的存储库…

NOIP模拟测试22「位运算」

范围n-----$100000$ m $30$ 输出方案 这是一个很好的$dp$题 首先我们应该看出来一条性质只要你最后有方案达到$n$个$1$&#xff0c;那么你可以达到任何一种$n$个$1$的情况 例如 你最后可以达到$3$个$1$ 那么你可以达到$11100 $ $ 01110$ $01011$ $01101$等方案 证明&a…

系统测试集成测试单元测试_等待正确的时刻–集成测试

系统测试集成测试单元测试当您必须测试多线程程序时&#xff0c;总是需要等到系统达到特定状态为止&#xff0c;此时测试可以验证是否已达到正确的状态。 这样做的通常方法是在系统中插入一个“探针”&#xff0c;该探针将向同步原语发出信号 &#xff08;例如Semaphore &…

Apollo的基本概念和集成实战

基本概念 使用场景 是一个分布式的配置中心。适用于微服务&#xff1b; 核心功能 集中管理不同环境&#xff0c;不同集群的配置&#xff1b;配置修改后可以实时推送到应用端&#xff1b;具备规范的权限&#xff0c;流程治理特性&#xff1b;开发技术 服务端使用springboot,spri…

flatMap()和事件顺序– RxJava常见问题解答

正如我们已经发现的&#xff0c; flatMap()不会保留原始流的顺序。 让我们使用上一篇文章的GeoNames API示例进行说明 &#xff1a; public interface GeoNames {Flowable<Long> populationOf(String city);}通过使用flatMap()请求多个城市的人口&#xff0c;我们不能保…