编程语言大比拼:Go与Ruby的对决

发表时间: 2022-02-23 07:00


背景

软件应用程序的快速增长已经不再只是一件其本身受欢迎的事情了,它更是带来了深刻改善所有行业业务流程的真正机会。所以,对于企业、行业来说,通过合适的编程创建出出色的软件解决方案成为了竞争的关键。下面,我们来对比一下近年来比较出名的两种编程语言——Go和Ruby。


GO

介绍

Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。Go语言由于自身天生支持并发的特点完美契合当下的互联网环境,所以Go语言自发布之后便迅速风靡全球。

特点

  • 语言是开源的: go语言于2009年11月开源
  • 静态类型和编译型: go语言书写的程序必须通过编译生成归档文件或可执行文件,而后才能被使用或者执行
  • 跨平台: go语言本身支持跨平台开发,不论你是用什么样子的硬件环境还是软件环境基本上都可以进行去语言的开发(这句话有些多余,毕竟现在主流编程语言都支持不同的硬件与软件环境)
  • 自动垃圾回收: go语言的垃圾回收是由去语言本身去处理的,不需要人为干预,但是如果你想要对垃圾回收进行机制进行干预这个权限也是对开发者开放的
  • 原生支持高并发编程:原生支持高并发编程,拥有自己的并发编程机制。
  • 完善的构建工具:go程序的获取、编译、测试、安装都可以使用命令行语句完成
  • 多编程范式:go语言除了支持函数式编程,也支持面向对象编程,有接口类型和实现类型的概念,但是用嵌入替代了继承
  • 高效的编程和运行:这里面主要是强调编写代码的界面简洁,以及去语言程序能够充分调动计算机的运行资源,提高程序运行效率。
  • 丰富的标准库:go语言标准库中有很多好用的API。一定程度上面减少了对于第三方库的依赖,当然如果有好用的第三方库,作为开发者也还是会使用的
  • 代码风格统一:go 语言提供了一套格式化工具——go fmt。保证了不同开发者提交的代码都是统一的格式

缺点

  • 错误处理:Go 语言通过函数和预期的调用代码简单地返回错误(或返回调用堆栈)而帮助开发者处理编译报错。虽然这种方法是有效的,但很容易丢失错误发生的范围,因此我们也很难向用户提供有意义的错误信息
  • 软件包管理:Go 语言的软件包管理绝对不是完美的。默认情况下,它没有办法制定特定版本的依赖库,也无法创建可复写的 builds。相比之下 Python、Node 和 Ruby 都有更好的软件包管理系统

场景

鉴于Go语言的特点和设计的初衷,Go语言作为服务器编程语言,很适合处理日志、数据打包、虚拟机处理、文件系统、分布式系统、数据库代理等;网络编程方面,Go语言广泛应用于Web应用、API应用、下载应用等;除此之外,Go语言还适用于内存数据库和云平台领域,目前国外很多云平台都是采用Go开发。

  • web开发:Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。大量优秀的Web框架如Echo、Gin、Iris、beego等,而且 Go 内置的 net/http 包十分的优秀;
  • 游戏开发:对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持
  • 爬虫及大数据:Go语言天生支持并发,所以十分适合编写分布式爬虫及大数据处理;
  • 云平台领域: 云服务很多都是采用Go进行开发,比如国内著名的七牛云是全站采用Go开发;还有如盛大CDN、阿里云CDN,华为云等。而且云平台基础设施如docker、kubernetes等也是Go开发;
  • 分布式存储领域: etcd、Groupcache、TiDB、Cockroachdb、Influxdb等;
  • 区块链领域: 区块链里面有两个明星项目以太坊和fabric都使用Go语言;
  • 微服务:现在越来越多新的项目采用微服务架构,前面介绍的优秀项目中也看到很多Go提供的微服务框架,如git-kit、go-micro等。
  • 服务器编程:以前你如果使用C或者C++做的那些事情,用Go来做很合适,例如处理日志、数据打包、虚拟机处理、文件系统等。

Go不适合领域

  • GUI: 例如开发IDE、移动App
  • 企业软件: 需要COTS交付、二次开发,基于非源代码的接口扩展,可以在重启或运行时启用新特性,无需编译整个系统的源代码。这类软件常常用像annotation一样的APT机制对语言元素做一定程度的元编程或修改
  • 超大型软件和团队:需要很明确的on the fly地知道哪个接口被哪些类型实现了,哪些类型实现了哪些接口。Eclipse有1000W行LOC,InteliJlDEA有700W,JDK自身也有700W,Hadoop+HBase有400w,JBoss等应用服务器有600W,Spring框架有200W,其它第三方库...日常开发的JAVA商用软件,你常常跟几千万LOC打交道。但好像GO超过50W的开源项目只有限的Docker、K8S等。GO的开源生态系统仍然极其弱小,能用于商用产品质量的开源库只有Beego等屈指可数的几个。许多依赖开源库只有2位数的star。


Ruby

介绍

Ruby,一种简单快捷的面向对象(面向对象程序设计)脚本语言,在20世纪90年代由日本人松本行弘(Yukihiro Matsumoto)开发,遵守GPL协议和Ruby License。它的灵感与特性来自于 Perl、Smalltalk、Eiffel、Ada以及 Lisp 语言。由 Ruby 语言本身还发展出了JRuby(Java平台)、IronRuby(.NET平台)等其他平台的 Ruby 语言替代品。自从 1995 年公开发布以来,Ruby 在全球吸引了许多忠实的程序员。2006 年,Ruby 得到广泛接受,各大城市都有活跃的用户组,以及 Ruby 相关的开发者大会.

特点

  • Ruby 是开源的,除了不收费之外,还可以自由使用、复制、修改和分发。
  • Ruby 是一种通用的、解释的编程语言。
  • Ruby 是一种真正的面向对象的编程语言。在 Ruby 中,一切皆对象。所有的信息和代码都拥有属性和行为
  • Ruby 是一种类似于 Python 和 Perl 的服务器端脚本语言。
  • Ruby 可以用来编写通用网关接口(CGI)脚本。
  • Ruby 可以被嵌入到超文本标记语言(HTML)。
  • Ruby 语法简单,这使得新的开发人员能够快速轻松地学习 Ruby。
  • Ruby 与 C++ 和 Perl 等许多编程语言有着类似的语法。
  • Ruby 可用于开发的 Internet 和 Intranet 应用程序。
  • Ruby 采用虚拟机实现跨平台
  • Ruby 支持许多 GUI 工具,比如 Tcl/Tk、GTK 和 OpenGL。
  • Ruby 可以很容易地连接到 DB2、MySQL、Oracle 和 Sybase。
  • Ruby 有丰富的内置函数,可以直接在 Ruby 脚本中使用。
  • Ruby 是一门相当灵活的语言,允许用户改变自身。 Ruby 的核心部分可以更改,也可以重新定义。此外,还可以在现有功能的基础上增加新功能。Ruby 不想阻碍程序员的创造力。

缺点

  • 性能不如纯静态编译语言,例如C,但可以通过用C语言来扩展来解决
  • 完全没有类型检查,灵活但容易隐藏潜在的问题
  • 使用Module来实现多重继承,不如JAVA所采用的接口(Interface)方式清晰,而且由于没有严格的类型检查,所以框架层的设计无法对实现有很严格的约束
  • 没有很完善的开发,重构的工具,虽然现在Eclipse已经提供Ruby的开发插件,但还没有实现重构,跳转和自动代码生成等很有用的功能,主要原因是由于Ruby支持动态类型
  • 依然保留部分非面向对象的语法,例如全局变量,全局方法
  • 允许在扩展代码中随意替换现有类的方法定义或变量,非常灵活,但可能会因为错误地修改了框架逻辑而引发难以发现的错误,但可以用freeze方法来组织被修改
  • 不支持真正的多线程,多线程环境是通过在虚拟机环境中模拟出来的,不能充分发挥多CPU的功能,如果一个线程在执行底层调用被Block住则整个应用程序也被Block住。
  • 对Unicode和多国语言的支持不好

场景

很多人在日常工作使用 Ruby。也有人只是将它作为一种业余爱好。在这里,你看到的只是现实世界中 Ruby 的冰山一角。

  • 仿真模拟:NASA 兰利研究中心使用 Ruby 进行仿真;摩托罗拉的一个研究小组使用 Ruby 写了一个生成场景和处理数据的模拟器。
  • 三维建模:Google SketchUp 是一个 3D 建模应用,使用 Ruby 作为它的宏脚本接口。
  • 商业:多伦多康复中心使用基于 RubyWebDialogs 的应用来管理、跟踪呼叫和现场服务,为 IT 帮助台和 IT 运营团队提供支持。
  • 机器人学:在 MORPHA 项目,Ruby 用来实现西门子服务机器人的反应控制部分。
  • 电讯:朗讯一个 3G 无线电话产品中使用了 Ruby。
  • 系统管理:Level 3 Communications 公司的 Unix 容量和规划系统负责收集分散在全球超过 1700 台 Unix(Solaris 和 Linux) 服务器的性能统计数据, 它的中央数据收集部分是由 Ruby 编写的。
  • 网页应用: RubyonRails框架的公司; SASS 世界上最成熟、稳定和强大的专业级 CSS 扩展语言;A List Apart 建立于 1997 年的杂志网站,最近使用自定义的 Ruby on Rails 重新构建。
  • 安全:由 Rapid7 管理的社区开源项目 Metasploit Framework 是一个免费的渗透测试平台,旨在帮助 IT 专业人员评估网络和应用程序的安全性。项目由超过了 70 万行代码组成,2010 年已经下载超过一百万次。Rapid7 开发的商业版本 Metasploit Express 和 Metasploit Pro均基于 Ruby 开发。


总结

Ruby vs Go:性能

Go开发的关键原则是简单性和生产力。Go语言的语法简单、直观,易于阅读,能够让程序员快速学习。Go语言的主要作者之一Rob Pike曾表示该语言就是专门为简化开发过程和快速获得结果而创建的。Ruby的设计也注重简洁性和生产力,其粉丝都称其是一种美丽、巧妙的语言。Ruby和Go都受到C系列编程语言的影响,相对年轻,但是却俘获了不少人的心,这其中包括程序员和业务决策者。Go非常适合解决简单和复杂的多线程任务,这也是当初谷歌设计这门语言的目的。受到流行的Ruby on Rails框架的影响。Ruby非常适合创建小型商业项目、博客和个人页面。但是面对复杂的解决方案,Ruby有点力不从心,性能速度低,这可能会影响要求苛刻的客户的总体满意度。根据我们的性能测试结果,在相同的环境下,Go项目比Ruby编写的类似项目运行得更快。

Ruby vs Go:社区

根据Tiobe和Stack Overflow的调查,Go是近年来发展最快、最受欢迎的编程语言之一,而Ruby则表现相反,近几年中越来越不受欢迎。Ruby是由个人创建的,而Go则由Google设计的,其包括有广泛的云基础架构,支持性社区、论坛、教程,以及最重要的其他库,可帮助语言向前发展。此外,Go是许多重要公司的首选,如Docker,BBC,SoundCloud,Facebook,Dropbox,甚至是Medium。这些企业用户也是Go进一步发展的保证。与之对应的,Ruby也被Twitter,Shopify,Crunchbase等大公司选中。

Ruby vs Go:兼容性

编程语言和软件堆栈其他部分集成是可以直接影响将新解决方案、功能或改进添加到现有程序的速度。由于Go与其他语言(特别是C系列语言)的自然兼容性,许多程序员甚至在使用不同堆栈(如Python和Go或PHP和Go)时都可以使用Go来提高应用程序的性能。此外,Go作为服务器端语言可与几乎所有数据库交互。至于Ruby,它的兼容性仅限于最流行的数据库。

Ruby vs Go:开发经验

我们的团队多年来一直在使用这两种语言进行开发,他们各自都有其优点和缺点。根据我们的经验,Go非常适合任何规模的后端系统和高度可扩展的网络服务器。Go是一种现代竞争性的语言,能够为您提供快速、高质量的性能,简洁的环境以及与其他技术的良好兼容性。但如果您更看重结果的快速交付,对于性能质量没有苛刻的要求,那么Ruby可能更适合您。