卍 花径不曾缘客扫, 蓬门今始为君开. 古佛拈花方一笑, 痴人说梦已三生!

如果让我推荐编程语言的话

GO 拈花古佛 7849℃ 0评论 繁體

如果让我推荐编程语言的话

早期经常有人问我学习编程语言应该从哪一门入手,我一般会推荐 Java 和 Python,这两门分属静态语言和动态语言,应用广泛,上手方便,上能九天揽月,下可五洋捉鳖,能写出小工具小网站,也构建出世界级的大型互联网帝国,比如淘宝,比如豆瓣。我一般很少推荐 C 或者 C 这种前进的路途上密布荆棘和陷阱的语言,人还没看到鲜花,可能已经从入门到放弃了。

现在会有人问我,投资自己的时间去学习最有价值和前景的编程语言,你会推荐哪些?以我个人拙见,我会推荐 Go、Python、Lua 和 Java。

世间没有无缘无故的爱,推荐当然也有理由,比如 Go 在服务器端强大的并发处理能力,优雅的类型设计和简洁的语法。推荐 Python 是因为这门古老的语言在大数据和机器学习时代重新焕发了生机,几乎所有顶级的机器学习项目,比如 TensorFlow,都优先把 Python 作为第一支持的语言。推荐 Lua 是因为 OpenResty 的崛起,大部分互联网应用都会涉及到服务器端的负载和连接能力,这方面 Lua 有着得天独厚的能力,目前 OpenResty 创始人章亦春已经开始提供基于 OR 的商业化解决方案,未来,也许可以用 Lua 构建大部分业务系统呢。至于 Java,据说前端开始统治世界了,他们手里的屠龙刀就是这门语言。

今天闲话一下 Go 吧,希望能写个小系列。

以前开玩笑总说 Go 站在编程语言鄙视链顶端,鄙视其他所有语言。关于这一点 Lisp 是不服气的,因为 Lisp 是编程鼻祖,PHP 也是不服气的,因为 PHP 是世界上最好的语言。但我这么说也不是没有道理,因为 Go 「世出名门,雍容华贵」,具备正宗的编程血统。使用 Go 语言编程的程序员们都像手拿 AK47 的企鹅,雄赳赳,气昂昂,杀进互联网。

什么名门呢?

2009年,世界上最大的互联网公司 Google 推出了一门新的编程语言 Go,也叫 Golang,这是一门静态类型、编译型、并发型并具备垃圾回收机制的编程语言。这门语言的三个设计者对于程序员来说如雷贯耳,他们分别是:

Robert Griesemer:曾协助实现 Java 的 HotSpot 编译器和 Java V8 引擎。

Rob Pike:曾是贝尔实验室的 Unix 团队和 Plan9 操作系统成员,与 Thompson 一起创造了 UTF-8 字符编码。

Ken Thompson,不用多说了,技术圣殿的人物,创造了 C 语言和 Unix,获得了 1983 年图灵奖和 1988 国家技术奖。

据说这些大神们创建 Go 语言的初衷是:近十年来开发程序之难让我们有点沮丧。于是 Go 诞生了。

Golang 是一门全新的、现代的、语法简洁并容易上手的编程语言,它不像 Scala 或 JRuby 这样的语言,要依附或脱胎于其他平台或语言,而是抛开历史包袱完全重新设计的、致力于充分发挥现代硬件性能的一门工程语言,具备独立的运行时库,就像 C 语言一样。

C 语言的强大勿用多言,但我们不得不承认,C 是一门既简单又极度复杂的语言,以至于你每写一行代码,都能想象出编译后指令的执行,堆栈的分配,C 充满了太多不着边际的规则,程序员如同行走在黑暗的森林里无所适从。Go 就好得多,语法关键字和控制语句都做到了最简模式,并且规则严谨,少有歧义,不像 Ruby 那样可以写出各种「奇技淫巧」的黑魔法代码。无论是高手还是初学者,大家写出来的代码都差不多,如同太祖长拳,在普通拳师和乔峰手里,威力大不相同,但招式都差不多。这是简单的本质。

Go 语言的 Hello World 是这样的:

package main

func main() {

println(“Hello, World”)

}

写一段异步执行的程序也非常简洁,比如在执行程序的时候你想异步记录一些日志:

func log(msg string){

}

go log(“Bad things happened…”)

Go 语言简化了自增和自减运算符,保留了指针,把切片(slice)和字典(map)作为内置类型,从运行时层面进行了优化,保证了语言的简洁和容易使用。

其并发模型是使用 Go 编码的程序员们最喜欢的特性之一。到了多核的时代,并发编程差不多成了程序员必备技能。哪一种并发模型更好?Java 的 ForkJoinPool,还是 Erlang 的 Actor Message,还是 Objective C 的 Grand Central Dispatch:Block Queue,亦或是 Hadoop 的 MapReduce……最终 Go 推出了自己的并发模型 goroutine 和 channel。

大部分异步模型都是显式的,一旦要开启异步模式都会大喊一声,闪开,我要创建线程了,并配以明显的出场标志(比如披风和外穿红色内裤)。Go 就低调的多,它通过类协程的方式处理并发单元,从语言层面对并发编程提供支持,比如 go log(…) ,这条简单到二爷都能看懂的代码已经默默的完成了所有异步功能,低调的就像日理万机而又默默无语的安姐(她帮别人解除焦虑的起始句是:我19岁大学毕业的时候……听完大家都焦虑了)。

与 Erlang 相比,Go 并没有实现严格的并发安全,允许全局变量、指针等共享内存,这就需要编程人员自行维护数据的一致性和完整性,于是引出了 channel 的概念。channel 实现了 CSP(Communicating Sequential Processes) 模型,各个并发单元间的数据解藕了,我们可以通过 channel 在两个或多个 goroutine 之间传递消息,我们认为 cahnnel 是一种类型安全的管道,数据和消息在其中自由流转,安全并且顺畅。

Go 语言的编程模型大大提升了服务器端的处理能力,我们可以轻松构建出 C100K 这样的高性能服务器,甚至处理更多的请求。

Go 语言采用 tcmalloc 方式进行内存分配,tcmalloc 是一套针对高并发的内存设计的组件,Go 的内存分配器完整保留了 tcmalloc 的原始架构,确保了在高并发压力下能优秀的完成内存分配任务。在最近的几个版本,Go 的编译器做了很大的改进,它尽可能把对象分配在栈上,以降低垃圾回收的压力,减少消耗,提高性能。

说到自动垃圾回收,算是 Go 的一个痛点,关于这一点,Java 是先行者,不过也被低效的垃圾回收策略拖累了很多年。Go 面临的问题更复杂一些,因为指针的引入,需要垃圾回收算法更加精确有效。网络和生活中遇到垃圾人,我们可以不理,但程序产生的内存垃圾不回收,会有系统宕机的危险。Go 最初采用的是标记清扫算法,到了 1.5 开始引入三色标记和写屏障,垃圾回收的性能才有了好转。这套机制最终的目标就是在用户业务无感知的情况下实现垃圾回收,希望未来的版本这部分有更优秀的表现。

作者: 池建强

转载请注明:拈花古佛 » 如果让我推荐编程语言的话

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址