Go 和 Java 的感受

首先,我是个用了许多年Java 的家伙,下面我从语言和平台层次聊聊这两个语言和平台的感受,各有优势,这两个不应该放到一起比较,这篇文章纯属YY,完全没有较真的必要,这只是一个用了多年的Java 和有段时间Go 的一些牢骚和体会。

从语言上说,Java 和Go ,一个推出了10几年,一个只有三年多,Java 十几年语法不怎么变化,除了Java 8加了lambda,几乎还是门静态语言,function不是first class,函数值不能支持多个返回,强制你必须oop,接口的实现必须要有依赖,无数的设计模式和各种ioc和aop框架来支撑这语言的不足,想想一个十几年语法都不怎么变的语言,很让人搓火,但是jvm恐怕是这个世界上虚拟机领域最强大的平台,无数在这个平台衍生的语言已经开始展露头角,clojure, jython,scala等等。

写Java 是特别锻炼一个人对业务层面的理解的一门语言,由于其语言的各种缺陷,导致了例如设计模式,等各种aop和ioc等框架的推出(当然这不完全是,但的确设计模式和框架在拟补它的不足),你可能会说spring是个多么伟大的框架,我不认为,我在05年接触和使用了spring,在消除依赖性和减少代码方面spring很有优势,我不觉得解决个ioc和aop就是很伟大了,搞的很神秘一样,没想到那么多配置却让你又陷入另外一个泥潭吗?Java 太适合构建一个超大项目了,30w行代码你都不好意思说自己是做Java 的,怎么也得上百万吧?这就是Java 的整体概念,一弄就是上百万级别的项目,弄个虚拟机都是上百G的,庞大到让你跪,后面我会谈谈jvm,而不怎么喷Java 了。

再谈Go 语言,很nice,一个静态编译让我直接跪了,无需部署,扔一个exe就可以跑,多平台直接编译,Go 是解放程序员心智的一门语言,我在使用Java 的时候,无时无刻都在考虑设计模式和oop的结构是否合理等等,让人很蛋疼,而且这个时间特别可怕,是你无法估计的,因为我需要不断的重构,重构,再重构,Java 你要重构,没有ide很可怕,你几乎忘记了你所使用的这个接口在哪里用过,当然你项目变大了这是通病。 Go 最nice的还是其并发的简单,反向接口的设计(根本无需知道实现,而且无需依赖,这里面我用了反向是跟Java 的进行了对比),语法可以用无可挑剔来形容,并且从语言层次禁止你循环引用。如果能制造一个Go lang to jvm的东西出来,估计我的疑虑将全部打消了(在我写完这段话,去Go ogle搜索找到jGo 这东西,看来很多人跟我的想法一样,想即用上jvm强大的平台,又能在语言这个层次不必受Java 所限制,用过的朋友留个言~

Java 的jdk库恐怕是这个世界上最全面、最稳定的库,因为无数的牛人给这个库注入新鲜的血液,我也不得不说Doug Lea这个大牛写的并发库了,这个库实在是瞠目结舌,让整个Java 生态体系在并发领域有了一个新的高度,在我很多年前认为Java 就是jvm的时候,哪个时候的并发库就认为是jdk里提供的,的确,说Java 庞大,是因为很多的库你很少有机会使用到,很多时候是在开源的库里看到,这个体系实在是太全面了,拿来就能用,而且还极其稳定和优秀,这让很多Java 程序员入门的门槛很低,但是想写出高效的代码却很难,用C++的同学有些瞧不起用Java 的,说你们都不关心内存,对效率这回事基本都不在乎,的确,这就是jvm平台的副作用,太优秀了,让Java 程序员忘记了自己需要实现类库。

要写自己的库,或者自己想实现特定的库,这个是需要长时间在jdk和各种开源库中探索和战斗过、并且自己踩过各种坑,并理解这些库为什么要构造这么一个类和接口,一方面对于业务必须有非常强的认识和理解,一方面又能清楚的知道性能关键点,这不必用c++的人考虑的少啊。

c++拥抱的底层和各种机器的平台(linux,win等等),而Java 世界拥抱的是jvm,这个超巨型的平台,jvm就是平台,一切都可以从研究jvm开始,说研究Java 不如说你在研究jvm,Java 语法很多坑,想起N年前问一个类的初始化顺序的一个问题,这就是自己闲的蛋疼把一个简单的问题搞复杂,如同这些坑你都知道,你能做这样的设计吗?为什么可以自己规避这样的简单问题,非要认为这是Java 语法的强大,这些坑我们不能不知道,但不能拿出来炫耀你有多么了解Java 。

Go 提供的channel, routine,function第一类型, 多返回值还有interface,让代码变的异常简单,这些相对Java 就是解放了你的心智,我常常在oo的领域里面写实际代码的机会很少,一直在不断的重构结构,重构你的接口,而Go 的概念是你给我library,我需要组装这些library,当然这不全是,只是理念上有很大不同。

先写到这里吧,聊起来太多了~~

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。