对比Java、Python、Golang等常用编程语言的特性及适用的场景。 多学一些编程语言,不一定将其用在生产中,更重要的是汲取其背后的思想,提升自己的境界。

有个权威的编程语言排名网站,可以看到当前主流的编程语言是哪些。

program-language

编程语言特性汇总

Python

Python 是一种面向对象的、解释型的、通用的、开源的脚本编程语言,Python出现的早,流行的早,受众比较广泛,而且国外的大学教学也选择了Python,这是现在机器学习、大数据领域Python比较火的原因,生态非常丰富。 Python的思想是简明、优雅、强大,在人工智能、云计算、金融分析、大数据开发、web开发、自动化运维、测试等方向应用广泛。

作者

吉多·范罗苏姆(Guido van Rossum)

诞生时间

1991年

类型

解释型编程语言

解决的问题(产生的原因)

Guido希望创造一种C和shell之间,功能全面,易学易用,可拓展的语言。

Guido知道如何用C语言写出一个功能,但整个编写过程需要耗费大量的时间 (即使他已经准确的知道了如何实现)。他的另一个选择是shell。Bourne Shell作为UNIX系统的解释器(interpreter)已经长期存在。UNIX的管理员们常常用shell去写一些简单的脚本,以进行一些系统维护的工作,比如定期备份、文件系统管理等等。shell可以像胶水一样,将UNIX下的许多功能连接在一起。许多C语言下上百行的程序,在shell下只用几行就可以完成。然而,shell的本质是调用命令。它并不是一个真正的语言。比如说,shell没有数值型的数据类型,加法运算都很复杂。总之,shell不能全面的调动计算机的功能。

Guido希望有一种语言,这种语言能够像C语言那样,能够全面调用计算机的功能接口,又可以像shell那样,可以轻松的编程。

优点

  • 语法简单。简单到什么程度呢,举个例子来说,同样一个程序,使用C可能需要1000行代码,使用Java需要100行代码,而使用Python则只需要20行代码。它没有那么复杂的逻辑,代码简洁规范,关键字也相对较少,说明文档还非常简单,极易上手。

    • Python 对代码格式的要求没有那么严格,这种宽松使得用户在编写代码时比较舒服,不用在细枝末节上花费太多精力。比如行末不需要写分号,定义变量时不需要指明类型。
  • 免费开源,简单地说,你可以自由地发布这个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。

  • 开发速度快效率高,Python 的底层是用 C 语言写的,很多标准库和第三方库也都是用 C 写的,因此Python运行速度非常快,开发效率非常高。

  • Python是高级语言,封装较深,屏蔽了很多底层细节,比如 Python 会自动管理内存(需要时自动分配,不需要时自动释放)。

  • Python 是完全面向对象的编程语言。面向对象是现代编程语言一般都具备的特性,否则在开发中大型程序时会捉襟见肘。Python 支持面向对象,但它不强制使用面向对象。Java 是典型的面向对象的编程语言,但是它强制必须以类和对象的形式来组织代码。 函数、模块、数字、字符串都是对象,在 Python中一切皆对象。Python完全支持继承、重载、多重继承,支持重载运算符,也支持泛型设计。

  • Python 功能强大(模块众多)。Python 的模块众多,基本实现了所有的常见的功能,从简单的字符串处理,到复杂的 3D 图形绘制,借助 Python 模块都可以轻松完成。Python 社区发展良好,除了 Python 官方提供的核心模块,很多第三方机构也会参与进来开发模块。

  • Python可扩展性强。Python 的可扩展性体现在它的模块,Python 具有脚本语言中最丰富和强大的类库,这些类库覆盖了文件 I/O、GUI、网络编程、数据库访问、文本操作等绝大部分应用场景。这些类库的底层代码不一定都是 Python,还有很多 C/C++ 的身影。当需要一段关键代码运行速度更快时,就可以使用 C/C++ 语言实现,然后在 Python 中调用它们。Python 能把其它语言“粘”在一起,所以被称为“胶水语言”。Python 依靠其良好的扩展性,在一定程度上弥补了运行效率慢的缺点。

缺点

  • 执行速度慢。运行速度慢是解释型语言的通病,Python 也不例外。

Python 速度慢不仅仅是因为一边运行一边“翻译”源代码,还因为 Python 是高级语言,屏蔽了很多底层细节。这个代价也是很大的,Python 要多做很多工作,有些工作是很消耗资源的,比如管理内存。

Python 的运行速度几乎是最慢的,不但远远慢于 C/C++,还慢于 Java。

但是速度慢的缺点往往也不会带来什么大问题。首先是计算机的硬件速度运来越快,多花钱就可以堆出高性能的硬件,硬件性能的提升可以弥补软件性能的不足。

其次是有些应用场景可以容忍速度慢,比如网站,用户打开一个网页的大部分时间是在等待网络请求,而不是等待服务器执行网页程序。服务器花 1ms 执行程序,和花 20ms 执行程序,对用户来说是毫无感觉的,因为网络连接时间往往需要 500ms 甚至 2000ms。

  • 代码加密困难

不像编译型语言的源代码会被编译成可执行程序,Python 是直接运行源代码,因此对源代码加密比较困难。

  • 语言设计上存在限制

Python是动态类型的,在编程时无需声明变量类型,但这也增加了运行时错误的风险。

  • Python不能利用多CPU

这是Python被人诟病最多的一个缺点,GIL即全局解释器锁(Global Interpreter Lock),是计算机程序设计语言解释器用于同步线程的工具,使得任何时刻仅有一个线程在执行,Python的线程是操作系统的原生线程。在Linux上为pthread,在windows上为Win thread,完全由操作系统调度线程的执行。一个Python解释器进程内有一条主线路,以及多条用户程序的执行线程。即使在多核CPU平台上,由于GIL的存在,所以禁止线程的并行执行。

Python语法糖

Python语法糖

最新版本特性

Python3新特性

Java

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者社区。

作者

Sun Microsystems

诞生时间

1991年

类型

编译型编程语言

产生的背景

Java诞生于1991年,当时Sun公司有个称为Green项目,目的是开拓消费类电子产品市场,例如,交互式电视、烤面包箱等家用电器的控制软件。该小组的领导人是James Gosling(Java之父)。在1991年6月份开始准备开发一个新的语言,那么给它起一个什么名字呢?Gosling回首向窗外望去,看见一棵老橡树,于是建一个目录叫Oak,这就是Java语言的前身(后来发现Oak已是Sun公司另一个语言的注册商标,1995年才改名为Java,即太平洋上一个盛产咖啡的岛屿的名字)。

java-feature

优点

  • 相对简单。

java语法是简单明了的、易于编写、学习、维护、理解和代码是易于debug的。并且,java没有其他语言如:C/C++那么复杂,因为很多复杂的特性如:显示的指针概念、类存储、操作符重载等都已经从java中移除掉了。

  • 面向对象

java是一种面向对象的语言,它能帮助我们增强代码的灵活性和可重用性。利用OOPs的概念我们可以在其他程序中很轻松的重用对象。它可以用过将数据和方法绑定到单个单元中同时阻止被外部世界访问以提高程序的安全性。

  • 安全

java通过避免采用显示的指针以减少安全攻击和风险。因为,指针存储了另一个值得内存地址,而这个值可能导致内存被未经授权访问。而java的安全管理器可以为每一个应用定义存取规则。

  • 维护成本低

java程序可独立于特定的硬件基础设施运行,即是可以在任何机器上运行(安装对应的JVM),这样可减少额外的维护成本。

  • 平台独立

只要机器上安装了对应的java虚拟机(JVM),经过编译的字节码就可以在该机器上(任何系统)上运行。

  • 高级语言、可读性高

java与C++一样,与人类语言具有相似性、可读性高,语法简单易于维护。

  • 可移植

由于java语言的平台独立性决定了,java应用可以从一个平台移植到其他任何的平台上。

  • 内存自动回收

java虚拟机(JVM)中内置于内存自动管理机制,当java程序中的对象不再使用时java虚拟机内存管理机制会自动触发并销毁对象回收内存,而不需要程序显示的做任何事情。

  • 支持多线程

java是一种多线程语言,即是在同一时刻可以有多个线程在执行。多线程可以帮助我们最大化CPU的利用率。多线程共享相同的内存空间,提升应用的效率和性能。各个线程之间独立运行互不影响。

  • 稳定性

java每次发布的版本都会增加一些新特性,让java变得更加的稳定。

  • 高效内存分配策略

java将内存主要分为堆区域和栈区域两部分,任何时候只要声明了一个变量,JVM就会为变量自动分配内存空间(堆空间/栈空间)。

  • 分布式语言

java是一种分布式语言因为它提供了在多个计算机之间共享数据和程序的机制以便改善系统的性能和效率。java的远程方法调用(RMI)为分布式处理提供了支持。并且,java也支持Sokcet编程和CORBA技术以帮助我们在分布式环境中共享对象。

缺点

  • 运行速度相对较慢、性能相对较低

由于java程序编译成字节码后需要解释成机器码,在JVM解释的过程中需要额外的抽象动作以及消耗更多的内存,并且,在垃圾回收的过程中需要消耗额外的CPU时间,这就降低了运行速度和性能。这也是java比原生的底层语言C或C++运行速度慢及性能低的原因。

  • GUI外观及体验不佳

尽管java处理许多图形界面工具如:Swing,SWT,JavaFX,JSF等但是它们都不适合用于复杂的UI。

  • 没有备份工具

  • 占用更多的内存

因为java运行垃圾回收时会消耗更多的内存空间,影响系统的效率和性能。

  • 代码不够简洁

Java代码是冗长的,即是有许多单词和许多长而复杂的句子,难以阅读和理解。

Java语法糖

Java语法糖

Java新版本特性

Java9到Java15新特性 为什么很多公司还在用Java8

Golang

Go语言(或 Golang)起源于 2007 年,并在 2009 年正式对外发布。Go 是非常年轻的一门语言,它的主要目标是“兼具 Python 等动态语言的开发速度和 C/C++ 等编译型语言的性能与安全性”。

go是一个Google公司推出的一个开源项目(系统开发语言),它是基于编译、垃圾收集和并发的编程语言。并将其开源并在BSD许可证下发行。Golang天生支持并发,语言结构精简,更加工程化。Go可以运行在Linux, Mac OS X, FreeBSD, OpenBSD, Plan 9 和 Microsof windows系统上,同时也支持多种处理器架构:I386, AMD64和ARM。

解决的问题(产生的原因)

最近十年来,C/C++在计算领域没有很好得到发展,并没有新的系统编程语言出现。对开发程度和系统效率在很多情况下不能兼得。要么执行效率高,但低效的开发和编译,如C++;要么执行低效,但拥有有效的编译,如.NET、Java;所以需要一种拥有较高效的执行速度、编译速度和开发速度的编程语言,Go就横空出世了。

Go的作者们都是计算机科学领城的重量级人物,他们设计Go语言的初衷是满足 Google 的需求。设计此语言花费了两年的时间,融入了整个团队多年的经验及对编程语言设计的深入认识。设计团队借鉴了 Pascal、Oberon 和C语言的设计智慧,同时让Go语言具备动态语言的便利性。因此,Go语言体现了经验丰富的计算机科学家的语言设计理念,是为全球最大的互联网公司之一设计的。Go语言的所有设计者都说,设计Go语言是因为 C++ 给他们带来了挫败感。

作者

Google

诞生时间

2009年

类型

编译型编程语言。

Go 自带了编译器,因此无须单独安装编译器。 Go 使用编译器来编译代码。编译器将源代码编译成二进制(或字节码)格式;在编译代码时,编译器检查错误、优化性能并输出可在不同平台上运行的二进制文件。要创建并运行 Go 程序,程序员必须执行如下步骤。

  • 使用文本编辑器创建 Go 程序;

  • 保存文件;

  • 编译程序;

  • 运行编译得到的可执行文件。

优点

  • 性能

GoLang是一种编译语言,可以编译为机器代码,编译后的二进制文件可以直接部署到目标机器而无需额外的依赖。性能优于那些解释语言,比如Python。

go语言目前可以达到c/c++80%的性能,远快于c/c++的编译速度,目前很火的开源软件docker、kubernetes、lxd等软件都是使用go语言编写的。

  • 动态的语言感受

GoLang是一种静态语言,但它给开发人员带来了动态语言的感觉。作为静态语言,在进行编译时可以检测到许多隐藏的问题,尤其是语法错误。此外,有许多软件包供开发人员使用,在开发过程中很容易导入它们,这使我们不再担心它的功能,让我们觉得我们正在处理动态语言。

  • 并发 & 通道

这可能是GoLang最受好评的特色。它支持并发,因为它诞生了。它可以充分利用多核功能。GoLang使用goroutine来实现并发性,它提供了一个非常优雅的goroutine调度程序系统,可以很容易地生成数百万个goroutine。堆栈使用也可以动态扩展/收缩,这使内存使用更加智能。这与Java线程不同,后者通常只允许创建数千个线程。

通道是 goroutines 之间通信的优先方式。

  • 快速的编译时间

当前我们使用 Go 编写的最大微服务的编译时间只需 6 秒。相较于 Java 和 C++呆滞的编译速度,Go 的快速编译时间是一个主要的效率优势。

  • 内置运行时支持GC

虽然它的GC并不完美,但它可以满足大多数关于垃圾收集的要求。

  • 简单易学

GoLang的作者都有C背景,GoLang有C基因。有25个关键词但具有丰富的表达能力。它可以支持几乎所有在其他语言中看到的功能,如继承,重载,对象等。

  • 工具链

有许多易于使用的内置工具可以帮助开发人员编写可维护和可读的代码。效率大大提高。这些包括gofmt,goimport等。它们可以使我们的代码看起来标准化,并且可以简化审查工作。

  • 本机C支持

您可以在Go程序中嵌入C代码,以便可以使用许多功能强大的C库。

缺点

  • 缺乏框架

GoLang开发人员没有重要的框架。但是有其他语言。Ruby有Ruby on Rails,Python有Django,PHP有Laravel。

  • 错误处理

如果可能出现错误,Go程序需要函数来返回错误。这可能导致错误跟踪丢失导致缺少有用的错误处理逻辑的问题。有些工具可以帮助检测这种错误,例如errcheck和megacheck。但它们更像是解决方法。开发人员还需要编写大量的if块来检查错误并处理它,这使得代码不那么干净。

  • 包管理

Go中的包管理并不完美。默认情况下,它无法创建具有固定包版本的依赖关系树,这意味着在不同时间构建时,创建的生成可能基于不同版本的包。相比之下,Python,NodeJS(npm)和Ruby都有相对维护良好的包管理系统。例如,在Ruby on Rails项目中,您可以拥有一个Gemfile文件,该文件定义依赖项及其依赖版本,这意味着即使将来某些版本的某些版本稍后会更新,也会使用相同版本的软件包来创建新版本。

当前Golang的依赖管理工具有godep、govendor、glide、gvt、gopack等。

Golang语法糖

golang中常用语法糖

PHP

PHP 全称 PHP Hypertext Preprocessor,是“超文本预处理器”的意思。它是一种跨平台的、开源的、免费的脚本语言,其语法吸收了C语言、Java 和 Perl 的特点,利于学习,使用广泛,主要适用于 Web 开发领域。

作者

拉斯姆斯·勒多夫(Rasmus Lerdorf)

诞生时间

1994年

类型

解释型编程语言。 将PHP代码解释为opcode之后再交由Zend引擎执行。

解决的问题(产生的背景)

1994 年,拉斯姆斯·勒多夫(Rasmus Lerdorf)创造了 PHP,这个时候的 PHP 只是用 Perl 语言编写的一系列 CGI 脚本,用于跟踪他在线简历的访问情况,统计他自己网站的访问者。

勒多夫把这些 CGI 脚本命名为“Personal Home Page Tools”。这里我们姑且将之称为 PHP1 吧!这个早期的 PHP Tools 并不是一门语言,只是一些工具,提供基本的变量,并使用嵌入式 HTML 句法自动处理表单变量。

优缺点

PHP优缺点

语法糖

PHP语法糖

参考