两篇博文相继推出,似乎掀起了一轮新的(古老的)论战:.net好还是java好。(观战请戳链接:《Java的跨平台就是一句谎言。》、《.net 跨平台也是一句谎言》)
首先我要说明我的观点:语言没有好坏之分。语言背后所体现的不过是不同平台之间利益的一种博弈。
因此,各位,这有啥可争的?谁“好”谁“坏”又怎样?对于堆代码的人来说,哪个能挣钱,哪个就是好语言。Object-C好不好。iPhone火热之前甚至连提都懒的提,完全处于角落里。但是现在呢?究竟是什么原因让Object-C火起来?是执行效率还是开发效率?都是扯!市场决定一切!.net、java和object-c分别代表了MS、SUN(Oracle?)和Apple的实力!
语言之争说完了,说说我心中的跨平台。跨平台就是一种谎言!!!
曾几何时,我们听过太多的跨平台:一次编译,多处运行。但是每当你亲身实践,你就会遗憾的发现,这一切都是一个美丽的谎言!Java和.Net,二位先驱已经在各自的文章中阐述了各自的观点。我想说的是又一次被跨平台这个美丽的谎言所包裹起来的——RIA开发。
现在RIA最火的无外乎两种:Flash和Silverlight。从理论来说这两者都是走的插件运行环境的路数(谁又不是呢。。Java虚拟机。。.Net Framework。。),我们能够听到的,无外乎既可以支持PC,又可以支持移动设备云云。。但是事实呢??
不知道有多少人做RIA开发。Flash什么时候出的移动版本(不算阉割的哪个)?PC上运行的Flash可以直接在移动版本上运行么?iPad为什么干脆不支持Flash(iPad为什么可以选择不支持Flash)?Silverlight有PC和Mac的Runtime,但是Windows Phone 7为什么尚不支持“浏览器内运行的Silverlight?”(目前Windows Phone 7的开发框架为Silverlight,但是这和PC上运行的Silverlight Runtime有很大的区别。)
上面提到的Flash、Silverlight是RIA领域的翘楚。每一个都包裹着跨平台的外衣。但是直到你真正去尝试“跨平台”,你才发现这一切都是美丽的谎言。
但是另外一个事实我不得不说,那就是:跨平台只不过是程序员的一厢情愿;平台商的一种宣传策略。跨平台根本是不可能的!
各位,不要狭隘了!编译通过能运行就叫跨平台,是做技术人的悲哀!PC用鼠标,手机用手指头,你光编译过了有个什么用?客户能用么?PC多大的分辨率,手机多大的分辨率?你光能“显示”有什么用?用鼠标点,拿手指头戳,手机上面连hover都没有,PC上的东西手机上就算运行了又能怎样?
因为硬件设备和运行环境的不同带来的用户体验的不同,才是跨平台最大的障碍!这一障碍,不是任何一个“技术”或“技术提供商”可以解决的!
========== Jeffrey Zhao的分割线 ============
#8楼 2010-05-31 00:32 Jeffrey Zhao那个啥,我说一个观点,和讨论可能关系不大。
就是说,其实我很不看中“跨平台”这一点的,因为正经的项目好像基本不会有跨平台的需求。我重视mono,但也不是看中它的跨平台性,而是看中它也是个足够成熟的执行环境。
换句话说,我用mono,也是在开发阶段就在mono上跑,不是先用ms .net开发,再用mono跑。
回复:
你的观点我非常同意。正因为“跨平台”不是一件关键的事情,因此才是各个利益集团宣传的“噱头”。在这种包装下的“跨平台”是没有意义的。
就像你所说,为什么你不是在ms.net上开发,在mono上跑。因为“跨平台”本身就不现实(不需要修改代码、不用担心兼容问题、不担心执行效率)。为了保证程序开发出来在mono中运行良好,你就不得不在mono环境中开发。
保证开发环境和真实环境是一样的,是最节省成本的方式,包括后期的部署、测试等等。因此,如果哪怕是因为任何一点点原因而不能达到“开发无关”的跨平台,那跨平台本身就是没有意义的!
因此,跨平台只不过是理想化的一种描述,是静水楼台。还是将跨平台描述为“增强代码的可移植性”更靠谱一些吧!
#23楼 2010-05-31 09:16 Jeffrey Zhao
@刘晨_以然胜甲
语言和平台分开谈才有意义,关键是才能谈清楚,因为现在一个平台上可以使用的语言太多了。你混着谈优势或劣势,那么它究竟是语言带来的还是平台带来的?
这个话题这里没法展开,感兴趣的话可以来我的博客讨论。
回复:
@Jeffrey Zhao
个人感觉你还是比较支持.net的。平台和语言~建议你写篇博客专门展开一下。好让我们比较有机会讨论~
========== Ivony的分割线 ============ #10楼 2010-05-31 01:32 Ivony...
首先,跨平台不等于全平台,如果你想你的程序编译一次就能在你家的微波炉上运行那的确是不可能的。这个是平台能力问题。
其次,不同的平台(手机、桌面、云端),其交互界面是截然不同而又不可调和的(至少现在是),所以一切有交互的程序现在来说都不可能不作任何修改在所有平台上得到最好的用户体验。但把这说成跨平台是不可能的未免就太搞笑了。
在不涉及到交互界面的服务端程序,.NET、Java、PHP、C++都有非常漂亮的跨平台实例。在这种背景下抛出一个“跨平台是不可能的”观点实在很蛋疼。
回复:
应该是我才疏学浅,我确实不知道哪些程序可以在不做代码修改的情况下跨平台。建议你仔细阅读以下JefferyZhao的观点,而不用先蛋疼。老赵的观点其实是非常有价值和现实意义的。我的服务跑在Linux上,我会在意这段程序是否可以再Windows上运行么?如果我要在Windows上运行我的服务,我一定会在Windows上去开发和测试。
对于你“微波炉”的观点:没有人说跨平台就是全平台。你的跨平台界定的是几个平台呢?1个(还跨啥),2个(哪两个),还是多个(。。)?
我敢说你不是做UI的,因此你只将跨平台限定在“服务端程序”。但是跨平台的概念可不是仅仅局限于“服务端程序”。在我看来,平台的变化和用户环境的变化是不可分割的,难道有前提条件的跨平台不是更加蛋疼的一件事情么?
#35楼 2010-05-31 11:17 Ivony...
如果LZ认为Windows 95和Windows 7的区别只是在于数字的话,那的确没办法。
不得不说LZ的狭隘之处,并不是所有的程序都需要与用户来交互。没有用户交互的程序,这并不是限制,而是程序本来就是这样。程序本身是可以跨平台的,但交互界面不能。譬如说Windows Phone没有任务栏,这关程序什么事儿?如果我的程序与任务栏没关系,界面小到可以放到任何屏幕,功能简单到在任何设备都能交互。譬如说就是一个袖珍计算器。老实说我没看出来在浏览器和WP里面运行需要改多少代码,他们只是承载的容器不同。也就是说,我只需要做一个计算器的控件,WP放在WP的容器里,浏览器放在浏览器的容器里,甚至于WPF的应用程序,也可以直接拿来编译下,放在WPF的容器里面就好了。
所以这些限制,完全是由于交互界面所造成的,当我们的程序简单到可以满足所有交互界面的要求的时候,就自然而然的轻松跨平台了。LZ不可能不知道这个事实,只是因为自己一些蛋疼的牢骚就嚷嚷什么“跨平台是不可能的”,实在是蛋疼。
回复:
首先,你将“跨平台”限制为“不考虑交互界面”,这本身就是狭隘的做法!
相对于你所言,只要UI可以满足跨平台,程序就可以跨平台?我看未必吧!你说容器。。这不是又回到了问题的原点,如果有一个“容器”是跨平台的,那下面开发出来的程序当然是跨平台的!现在的问题就是没有跨平台的容器!(这个容器包含runtime,framework..等等运行环境,别说我狭隘啊)
交互界面不能实现多平台兼容,只是跨平台是伪命题的一个例证!
相比你说的而言,老赵的观点反而更具代表性!跨平台只是商业的一种包装手段,在实际的运作阶段,跨平台就是虚幻的!有几个敢把Windows开发出来的程序直接运行在Linux上?至少我在实际项目中没有看到!这就是跨平台的风险!跨,本身就是最大的问题!