我也来凑热闹了,这个问题前几天就看到了,懒得多说,但是居然那位写的最长的匿名的同学怒了,然后我不小心中了第一枪,这不是逼我卷袖子上场么这不是。
首先声明啊,我不打算直接就是论事,我本来就不是因为想要就事论事来回答的。
最烦这种话了,动辄就往人脑袋上扣帽子说什么屁股决定脑袋,还装模作样地表示理解,理解你个蛋蛋。还有人说要放上利益相关,特么技术的东西有什么好利益的啊,有些人眼里就只看得到屁股了是吗?而且想装平和就装像一点,装到底,不要中间暗搓搓来一枪,现在这种做法再我看来就三个字:
不过那位同学知错能改善莫大馬,我表示炉子可教(有些评论现在看不到了是因为被人举报了于是知乎删掉了谁啊那么脆弱):
嗯,言归正传。
Java能不能跨平台?当然能了。它是标准的“二进制跨平台”,就是所谓一次编译到处跑跑,在这个领域里简直毫无敌手,但问题还是在这里,作为这个领域的第一名,也几乎是唯一的一名,它还是没法突破“谁信谁傻逼”这点。
首先,二进制跨平台本身就是个很难靠谱的玩意儿,因为各个平台都有差异,这个差异要统一就要放弃很多东西,所谓Every abstraction is leaky,你二进制统一了又如何?你一次编译到处能跑又如何?用来做Client(随你SWT还是Swing了)慢得一逼丑得二逼。用来做Server,呵呵那高大上的NIO到了什么时候才在Windows上支持IOCP的?谁给查查是Java 7还是Java 8来着?要知道IOCP是NT 3.5里出现的功能啊,1994年啊,跟Java是特么的同龄人啊。
其次,二进制跨平台本身也是个伪需求。老是有人说Java流行是因为跨平台,真是跨个蛋蛋。你有过多少需求动不动把一个项目从一个平台搬到另一个平台上啊?别看我的屁股大部分是坐在.NET上面的,我在十八摸呆过啊,我也WebSphere和Tomcat之间迁移过应用啊(当然两件事没太大联系),修修改改调调到蛋疼。我一直纠正别人说,你就直接说Java可以跑在Linux上就行了,这跟跨平台关系不大。
当然我知道很多很多很多人是在Windows上写程序然后生产环境是Linux一样,我的博客也是在Win上写,然后部署在Ubuntu上面。那么都是怎么做的呢?开发一点部署一点测试一点啊,每天甚至每次提交都在测试环境的Linux服务器上部署一份啊,谁家开发的时候是在Windows上写到底,然后直接发布到生产环境的Linux里的?比如你开发出来的NIO服务器应用,在Windows上跑得性能肯定上不去啊,没IOCP啊。
总之“二进制跨平台”在我看来本身就是不靠谱的玩意儿,你Java想要做第一你自己去,反正没人跟你争十六强。
现在靠谱的跨平台都是“源代码跨平台”,就是大家都遵守一个标准,遵守一个子集,争取相互之间可共享的利益最大化,然后充分尊重各平台上的不同之处,提供各自独特的部分,要用的时候大家各自编译去。大伙儿不求100%代码共享,就求个80%万岁,然后三个平台各实现剩下的20%,你条件编译也好,通过项目结构来组织也罢,各管各的,这才叫棒。
Mono,或者说Xamarin早就这么搞了,你们还以为Mono是跟Java一样那种跨平台法?人家早就发力到各平台的Native Binding了好么。.NET推出了Portable Class Library这个Profile了好么,.NET里的Profile概念早就出现了好么,谁像Java还设法用一个普世实现想统一全世界啊?有人还拿Android做Java跨平台的例子,简直就是呵呵呵,它只是用了Java语言和一小部分核心API好吗?整套GUI框架都是不一样的,编译出的bytecode都是不一样的,完全摆脱了“二进制跨平台”的意图,充分进入了“源代码跨平台”领域好吗?这才有现实意义。
所以什么是靠谱的跨平台方式?跟我念:“源代码跨平台”,C啊C++啊Mono啊,这种才叫靠谱的跨平台方式。
至于他说:
这简直就是典型的你和他谈跨平台,他和你谈性能,你和他谈性能,他和你谈语法,你和他谈语法,他和你谈社区,你和他谈社区,他和你谈跨平台的典型了啊
跨平台还不能谈跨平台的质量了?那位同学非要说这种跨平台多么多么了得,那么就去跨好了,蛋蛋程序员最擅长说“做完了”但其实做成渣渣也无所谓,我这种专业程序员(出身的娱乐圈人士)对质量要求高。
总之最重要的是:光说“实现了”而不管“实现质量”和“现实意义”的那就是耍流氓,说谁信谁傻逼一点没错。
PS:说完了,写代码去了,别跟我争论,没出息。