Go语⾔和Java、python等其他语⾔的对⽐分析
⼀、Go语⾔设计初衷
1、设计Go语⾔是为了解决当时Google开发遇到的问题:
⼤量的C++代码,同时⼜引⼊了Java和Python
成千上万的⼯程师
数以万计⾏的代码
分布式的编译系统
数百万的服务器
2、Google开发中的痛点:
编译慢
失控的依赖
每个⼯程师只是⽤了⼀个语⾔⾥⾯的⼀部分
程序难以维护(可读性差、⽂档不清晰等)
更新的花费越来越长
交叉编译困难
3、如何解决当前的问题和痛点?
Go希望成为互联⽹时代的C语⾔。多数系统级语⾔(包括Java和C#)的根本编程哲学来源于C++,将C++的⾯向对象进⼀步发扬光⼤。但是Go语⾔的设计者却有不同的看法,他们认为值得学习的是C语⾔。C语⾔经久不衰的根源是它⾜够简单。因此,Go语⾔也是⾜够简单。
所以,他们当时设计Go的⽬标是为了消除各种缓慢和笨重、改进各种低效和扩展性。Go是由那些开发⼤型系统的⼈设计的,同时也是为了这些⼈服务的;它是为了解决⼯程上的问题,不是为了研究语⾔设计;它还是为了让我们的编程变得更舒适和⽅便。
但是结合Google当时内部的⼀些现实情况,如很多⼯程师都是C系的,所以新设计的语⾔⼀定要易学习,最好是类似C的语⾔;20年没有出新的语⾔了,所以新设计的语⾔必须是现代化的(例如内置GC)等情况。最后根据实战经验,他们向着⽬标设计了Go这个语⾔。
手机登录界面代码是什么4、Go语⾔的特⾊:keyboardsplitter下载
没有继承多态的⾯向对象
强⼀致类型
interface不需要显式声明(Duck Typing)
没有异常处理(Error is value)
京东python入门教程基于⾸字母的可访问特性
不⽤的import或者变量引起编译错误
完整⽽卓越的标准库包
Go内置runtime(作⽤是性能监控、垃圾回收等)
⼆、Go语⾔的优势
1、学习曲线容易
Go语⾔语法简单,包含了类C语法。因为Go语⾔容易学习,所以⼀个普通的⼤学⽣花⼏个星期就能写出来可以上⼿的、⾼性能的应⽤。在国内⼤家都追求快,这也是为什么国内Go流⾏的原因之⼀。
Go 语⾔的语法特性简直是太简单了,简单到你⼏乎玩不出什么花招,直来直去的,学习曲线很低,上⼿⾮常快。
2、效率:快速的编译时间,开发效率和运⾏效率⾼
开发过程中相较于 Java 和 C++呆滞的编译速度,Go 的快速编译时间是⼀个主要的效率优势。Go拥有接近C的运⾏效率和接近PHP的开发效率。
C 语⾔的理念是信任程序员,保持语⾔的⼩巧,不屏蔽底层且底层友好,关注语⾔的执⾏效率和性能。⽽ Python 的姿态是⽤尽量少的代码完成尽量多的事。于是我能够感觉到,Go 语⾔想要把 C 和 Python 统⼀起来,这是多棒的⼀件事啊。
3、出⾝名门、⾎统纯正
streaming service什么意思之所以说Go出⾝名门,从Go语⾔的创造者就可见端倪,Go语⾔绝对⾎统纯正。其次Go语⾔出⾃Google公司,Google在业界的知名度和实⼒⾃然不⽤多说。Google公司聚集了⼀批⽜⼈,在各种编程语⾔称雄争霸的局⾯下推出新的编程语⾔,⾃然有它的战略考虑。⽽且从Go 语⾔的发展态势来看,G
oogle对它这个新的宠⼉还是很看重的,Go⾃然有⼀个良好的发展前途。
4、⾃由⾼效:组合的思想、⽆侵⼊式的接⼝
Go语⾔可以说是开发效率和运⾏效率⼆者的完美融合,天⽣的并发编程⽀持。Go语⾔⽀持当前所有的编程范式,包括过程式编程、⾯向对象编程、⾯向接⼝编程、函数式编程。程序员们可以各取所需、⾃由组合、想怎么玩就怎么玩。
5、强⼤的标准库
这包括互联⽹应⽤、系统编程和⽹络编程。Go⾥⾯的标准库基本上已经是⾮常稳定了,特别是我这⾥提到的三个,⽹络层、系统层的库⾮Go 语⾔的 lib 库⿇雀虽⼩五脏俱全。Go 语⾔的 lib 库中基本上有绝⼤多数常⽤的库,虽然有些库还不是很好,但我觉得不是问常实⽤。Go 语⾔的 lib 库⿇雀虽⼩五脏俱全。
题,因为我相信在未来的发展中会把这些问题解决掉。
6、部署⽅便:⼆进制⽂件,Copy部署
这⼀点是很多⼈选择Go的最⼤理由,因为部署太⽅便了,所以现在也有很多⼈⽤Go开发运维程序。
4、简单的并发
并⾏和异步编程⼏乎⽆痛点。Go 语⾔的 Goroutine 和 Channel 这两个神器简直就是并发和异步编程的巨⼤福⾳。像 C、C++、Java、并⾏和异步编程⼏乎⽆痛点。
Python 和 JavaScript 这些语⾔的并发和异步⽅式太控制就⽐较复杂了,⽽且容易出错,⽽ Go 解决这个问题⾮常地优雅和流畅。这对于编程多年受尽并发和异步折磨的编程者来说,完全就是让⼈眼前⼀亮的感觉。Go 是⼀种⾮常⾼效的语⾔,⾼度⽀持并发性。Go是为⼤数据、微服务、并发⽽⽣的⼀种编程语⾔。
Go 作为⼀门语⾔致⼒于使事情简单化。它并未引⼊很多新概念,⽽是聚焦于打造⼀门简单的语⾔,它使⽤起来异常快速并且简单。其唯⼀的创新之处是 goroutines 和通道。Goroutines 是 Go ⾯向线程的轻量级⽅法,⽽通道是 goroutines 之间通信的优先⽅式。
创建 Goroutines 的成本很低,只需⼏千个字节的额外内存,正由于此,才使得同时运⾏数百个甚⾄数千个 goroutines 成为可能。可以借助通道实现 goroutines 之间的通信。Goroutines 以及基于通道的并发性⽅法使其⾮常容易使⽤所有可⽤的 CPU 内核,并处理并发的 IO。相较于 Python/Java,在⼀个 goroutine 上运⾏⼀个函数需要最⼩的代码。
8、稳定性
Go拥有强⼤的编译检查、严格的编码规范和完整的软件⽣命周期⼯具,具有很强的稳定性,稳定压倒⼀切。那么为什么Go相⽐于其他程序会更稳定呢?这是因为Go提供了软件⽣命周期(开发、测试、部署、维护等等)的各个环节的⼯具,如go tool、gofmt、go test。
三、对⽐其他语⾔
Go的很多语⾔特性借鉴与它的三个祖先:C,Pascal和CSP。Go的语法、数据类型、控制流等继承于C,Go的包、⾯对对象等思想来源于Pascal分⽀,⽽Go最⼤的语⾔特⾊,基于管道通信的协程并发模型,则借鉴于CSP分⽀。
Java
编译语⾔,速度适中(2.67s),⽬前的⼤型⽹站都是拿java写的,⽐如淘宝、京东等。主要特点是稳定,开源性好,具有⾃⼰的⼀套编写规范,开发效率适中,⽬前最主流的语⾔。
作为编程语⾔中的⼤腕。具有最⼤的知名度和⽤户。⽆论风起云涌,我⾃巍然不动。他强任他强,清风拂⼭岗;他横由他横,明⽉照⼤江。
c#
执⾏速度快(4.28),学习难度适中,开发速度适中。但是由于c#存在很多缺点,京东、携程等⼤型⽹站前⾝都是⽤c#开发的,但是现在都迁移到了java上。
C/C++
现存编程语⾔中的⽼祖,其他语⾔皆由此⽽⽣。执⾏速度最快⽆⼈能及。但是写起来最为复杂,开发难度⼤。
Javascript
编程语⾔中特⽴独⾏的傲娇美⼥。前端处理能⼒是其它语⾔⽆法⽐拟。发展中的js后端处理能⼒也是卓越不凡。前后端通吃,舍我其谁?Python
脚本语⾔,速度最慢(258s),代码简洁、学习进度短,开发速度快。⾖瓣就是拿python写的。Python著名的服务器框架有
django,flask。但是python在⼤型项⽬上不太稳定,因此有些⽤python的企业后来迁移到了java上。
scala
编译语⾔,⽐python快⼗倍,和java差不多,但是学习进度慢,⽽且在实际编程中,如果对语⾔不够精通,很容易造成性能严重下降。,后来⽐如Yammer就从scala迁移到了java上。微服务框架有lagom等。
Go
编程界的⼩鲜⾁。⾼并发能⼒⽆⼈能及。即具有像Python⼀样的简洁代码、开发速度,⼜具有C语⾔⼀样的执⾏效率,优势突出。
四、最后
因为Go的语法和Erlang、Python类似,所以我们将这三门语⾔做个详细的对⽐。
相⽐于Python的40个特性,Go只有31个,可以说Go在语⾔设计上是相当克制的。⽐如,它没有隐式的数值转换,没有构造函数和析构函数,没有运算符重载,没有默认参数,也没有继承,没有泛型,没有异常,没有宏,没有函数修饰,更没有线程局部存储。
但是Go的特点也很鲜明,⽐如,它拥有协程、⾃动垃圾回收、包管理系统、⼀等公民的函数、栈空间管理等。
Go作为静态类型语⾔,保证了Go在运⾏效率、内存⽤量、类型安全都要强于Python和Erlang。
Go的数据类型也更加丰富,除了⽀持表、字典等复杂的数据结构,还⽀持指针和接⼝类型,这是Python和Erlang所没有的。特别是接⼝类型特别强⼤,它提供了管理类型系统的⼿段。⽽指针类型提供了管理内存的⼿段,这让Go进⼊底层软件开发提供了强有⼒的⽀持。
Go在⾯对对象的特性⽀持上做了很多反思和取舍,它没有类、虚函数、继承、泛型等特性。Go语⾔中⾯向对象编程的核⼼是组合和⽅法(function)。组合很类似于C语⾔的struct结构体的组合⽅式,⽅法类似于Java的接⼝(Interface),但是使⽤⽅法上与对象更加解耦,减少了对对象内部的侵⼊。Erlang则不⽀持⾯对对象编程范式,相⽐⽽⾔,Python对⾯对对象范式的⽀持最为全⾯。
在函数式编程的特性⽀持上,Erlang作为函数式语⾔,⽀持最为全⾯。但是基本的函数式语⾔特性,如lambda、⾼阶函数、curry等,三种语⾔都⽀持。
xml格式word可以打开吗建站与备案的具体流程是什么控制流的特性⽀持上,三种语⾔都差不多。Erlang⽀持尾递归优化,这给它在函数式编程上带来便利。⽽Go在通过动态扩展协程栈的⽅式来⽀持深度递归调⽤。Python则在深度递归调⽤上经常被爆栈。
Go和Erlang的并发模型都来源于CSP,但是Erlang是基于actor和消息传递(mailbox)的并发实现,Go是基于goroutine和管道(channel)的并发实现。不管Erlang的actor还是Go的goroutine,都满⾜协程的特点:由编程语⾔实现和调度,切换在⽤户态完成,创建销毁开销很⼩。⾄于Python,其多线程
的切换和调度是基于操作系统实现,⽽且因为GIL的⼤坑级存在,⽆法真正做到并⾏。
⽽且从笔者的并发编程体验上看,Erlang的函数式编程语法风格和其OTP behavior框架提供的晦涩的回调(callback)使⽤⽅法,对⼤部分的程序员,如C/C++和Java出⾝的程序员来说,有⼀定的⼊门门槛和挑战。⽽被称为“互联⽹时代的C”的Go,其类C的语法和控制流,以及⾯对对象的编程范式,编程体验则好很多。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论