为什么要学习Go
Go是未来的服务端语言— Tobias Lütke, Shopify。在过去的几年中,Golang逐步流行起来。
还有什么能比一门新语言让码农们疯狂呢? 因此,我开始学习了一段时间Golang,在这里我将告诉你为什么你也应该学习这种新语言。
在本文里我不会告诉你怎么写hello world。 我要分析计算机硬件软件的当前阶段,以解释为什么我们需要像Go这样的新语言?
硬件限制
摩尔定律正在失效 第一个具有3.0GHz时钟速度的Pentium 4处理器是由英特尔于2004年推出的。 而今天,我的Mackbook
Pro 2016的CPU时钟速度为2.9GHz。 可以看到在过去的十年中,CPU处理能力没有太大的进步。 您可以在下面的图表中看到这一点。
从上面的图表可以看出,单线程的性能和处理器的频率在过去的十年内保持平稳。如果你认为添加更多的晶体管是解决方案,那么你错了。这是因为在较小的尺度上一些量子性质开始出现(如隧道,因为它实际上用掉更多的更多的晶体管(为什么?)并且添加晶体管的性价比在下降。
所以制造商开始向处理器添加越来越多的核心。现在我们有四核和八核CPU可用。 同时我们还引入了超线程。还向处理器添加更多缓存以提高性能。
但上述解决方案也有其局限性。我们不能向处理器添加更多的缓存以提高性能,因为缓存具有物理限制:缓存越大,缓存越慢。向处理器添加更多核心也具有成本。此外,这都不能无限扩展。这些多核处理器可以同时运行多个线程,并在纸面上带来并发性。我们稍后将讨论这一问题。
所以,如果我们不能完全依靠硬件的改进来提升性能,更高效的软件也是我们需要考虑的手段。但遗憾的是,现代编程语言并不高效。
Go has goroutines!!
如上所述,硬件制造商正在向处理器添加越来越多的核心以提高性能。使用这些处理器的所有数据中心,在未来几年内核数量将会大大增加。更重要的是,今天的应用程序使用多个微服务来维护数据库连接,消息队列和缓存。因此,我们开发的软件和编程语言应该轻松支持并发性,并且它们应该随着核心数量的增加而轻松扩展。
但是,大多数现代编程语言(如Java,Python等)发明于90年代的单线程环境。当然这并不意味着他们不支持多线程(译者的话Python确实不支持多线程)。大多数编程语言支持多线程。真正的问题来自并发执行和线程锁,竞争条件和死锁。这些东西使得在这些语言上创建多线程应用程序很困难。
例如,在Java中创建新线程会消耗大约1MB的内存堆大小。最终如果你创建了数千个线程,这将对堆内存造成巨大的压力,并将由于内存不足而被操作系统杀死。此外,如果你想在两个或多个线程之间进行通信,也比较困难。
另一方面,Go在2009年发布时,多核处理器已经流行起来。这就是为什么GoLang以并发为第一要务。
Go使用goroutines而不是线程。新建goroutine只使用近2KB的内存,你可以创建数百万goroutine。
当然还有其他的好处:
- 具有可增长的分段堆。这意味着他们只在需要时才使用更多的内存。
- Goroutines的启动时间比线程快。
- Goroutines带有内置的原语,以便在它们之间(channel)安全地通信。
- Goroutines允许您避免在共享数据结构时使用互斥锁。
- 此外,goroutines和OS线程不是1:1映射。 单个goroutine可以在多个线程上运行。 Goroutine被复用到少量的OS线程中。
以上几点,使Go非常强大,可以在处理并发(如Java、C和C++)的同时保持代码的优雅(像Earlang)。
Go直接运行在硬件上
使用C、C ++的一个最大的好处是它们的性能比其他现代高级语言(如Java / Python)更强。 因为C / C
++是编译执行而不是解释执行的。
当您使用Java或其他基于JVM的语言构建应用程序时,它将代码编译为字节码,在执行时,JVM解释字节码并将其转换为处理器可以理解的二进制代码。
而C、C 不在VM上执行,从执行周期中删除一个步骤,并提高了性能。 他们直接将代码编译成二进制代码。
但是在C/C中释放和分配内存太过痛苦。 即使大多数编程语言可以使用垃圾收集器或引用计数算法处理对象分配和删除。
Go同时拥有上面提到的好处。 Go是像C/C++这样的低级语言并且是编译型语言。 这意味着它的性能几乎更接近低级语言。
并且Go还使用垃圾回收来分配和释放内存。 所以不需要malloc和free!!!
Go代码容易维护
Go有着非常整洁和干净的语法。Go的设计者在创建语言时考虑到了这一点。 由于google有非常大的代码库,成千上万的开发人员正在使用同一个代码库,代码应该易于其他开发人员理解。这将使代码易于维护和修改。 Go故意去掉了很多现代OOP语言具有的功能。
- 没有类。 Go只有结构体而不是类。
- 不支持继承。 这将使代码容易修改。 在其他语言(如Java / Python)中,如果ABC类继承了类XYZ,并且在类XYZ中进行了一些更改,那么这可能会在继承XYZ的其他类中产生一些副作用。 通过删除继承,Go使得很容易理解代码(因为没有超类)。
- 没有构造函数。
- 无注解(annotation)。
- 没有泛型(generics)。
- 没有异常。
以上的差异使Go与其他语言非常不同。 当然你可能不喜欢上面的一些点。 但是,在没有上述功能的情况下 你需要做的仅仅是多写2-3行代码。 然而这样会使你的代码更加简洁易懂。
上图显示Go几乎与C/C++一样高效,同时保持代码语法简单,如同Ruby,Python。 这是一个对人类和机器来说双赢的局面! 与其他新语言(像Swift)不同,Go的语法非常稳定。 自从2012年首次公开发布1.0版以来,它保持不变。这使得它向下兼容。
Go的背后是Google
- 虽然这不是直接的技术优势。 但Go是由Google设计和支持的。 Google拥有世界上最大的云基础架构之一,并且可以大规模扩展。Go是由Google设计的,以解决他们需要的可扩展性性问题。这些也是你在创建自己的服务时将面临的问题。
- Go也被一些大公司使用,如Adobe,BBC,IBM,英特尔等等。
结论
- 即使Go和其他面向对象的语言非常不同,但它同时为您提供高性能(如C/C++),超级好用的并发处理(如Java)和简洁的代码(如Python/Perl)。
- 如果你没有任何计划学习Go,我还是会说软件开发人员需要写出超高效的代码。开发人员需要了解硬件并相应地优化程序。优化软件以运行在更便宜和更慢的硬件(如IOT设备)以提升最终用户体验。
作者:方圆
来源:51CTO