MONO,原来你是水中月
什么是MONO? MONO项目是由Ximian发起的,由Miguel de lcaza领导的,一个致力于开创.NET在Linux上使用的开源工程。它包含了一个C#语言的编译器,一个CLR的运行时,和一组类库,并实现了ADO.NET和ASP.NET。能够使得开发人员在Linux用C#开发程序。
MONO项目无论对Linux还是C#开发人员都应该是个好消息,尤其是C#开发人员更会相信.NET将因此进入Linux系统,.NET将变成通用于Windows和Linux的标准技术,并因此大大削弱Java的跨平台优势,从而使得.NET在与Java的持久战中取得关键的一役。很多人对MONO项目都期望有加,Microsoft也时常拿MONO项目作为显示自己开放性的一种手段。
... ... ... ...
哎,善良的程序员们,听我一言:
好的技术往往会因为政治阴谋而夭折。我讨厌政治,但事实证明这个世界不是光以技术为导向的。在考虑技术的采用时,我们有时不得不面对残酷的利益冲突。
这里有个逻辑问题,无论是.NET,Java,VB,Delphi,还是C/C++程序员都可以想想: 当今世界对微软构成最大威胁的竞争对手到底是谁,是SUN和他的Java,还是Linux? 这里还有另外一个问题,微软为什么如此憎恨Java (别忘了Microsoft和SUN曾经一度是“朋友“)? 最后还有一个问题,Java程序员那经常挂在嘴边的Java最大优点是什么?
微软创造.NET是为了和Java竞争,抢夺企业开发的市场,很多人都这么以为。当然,这看不出有什么错,而且理由也很正当。Java程序运行在世界各地的服务器上,统治了企业应用开发的大壁江山,微软要有未来就必须和Java争。在开发.NET的过程中,微软几乎什么都做了,他完全参考Java的语法,融合C/C++的特点,再加上花重金从Borland请来专家做出个被Delphi程序员认为是抄袭的Visual Studio .NET,还天才得发明了“跨语言“特性。不管怎么说,微软是下了血本才搞出了个.NET来和Java竞争。我刚才说“微软几乎什么都做了“,也就是说他有些地方没做,什么呢? 你估计也猜出来了---它.NET就只能在Windows上跑,要到Linux上跑就不行。微软是不是傻了啊? Java最知名的优势---跨平台,这一点你微软不去和他争,自暴其短啊。呵呵,微软有句名言---“不是不会做,而是不想做“。让.NET 在Linux上跑对微软来说“不是不会做“。摆明了,微软就没打算让.NET在Linux上跑。可为什么微软不想这么做? .NET一跨平台,Java可就立马失地300里啊,你真要和Java干,就理应出这一招啊。为什么你就是“不想做“呢? 除非,除非,你微软有难言之瘾,在你拿着.NET大剑砍杀Java之时背后有另外一个阴影让你分心。
那个阴影是一个企鹅。
在一封泄密的电子邮件里,一个微软高官给盖茨写到: 我现在很担心,我们的朋友SUN搞的那个语言让世界上的程序员可以开发出在非Windows上运行的应用程序,注意是非Windows。他们的努力将威胁到我们最重要的产品线。我认为是应该制止这一行为的时候了。
盖茨先生在读了这一封电子邮件后,震惊不已,只说了一句话: “我真是吓坏了“。也就是从那时起,微软和 SUN 的合作关系终止了,两家公司进入了彼此竞争的时代,一直延续到今天。
当微软拿着.NET大剑砍杀Java之时,他当然清楚对面的Java当年为何成为了敌人。微软憎恨Java,实乃是因为Java和Linux+Unix有染。而吓坏盖茨的不是Java本身,而是Java背后的那个Linux。
微软推出.NET,当然要和Java竞争,可微软不会因为这样的竞争,而牺牲了另外一个战场,在那里存在着一个对微软最具威胁的敌人---Linux。也就是说.NET可以反Java,但必须在Windows的平台上反Java。跨出Windows平台去削弱Java是本末倒置的愚蠢做法。
截止2004年,给微软带来最大收益的产品仍旧是Windows和Office,微软在其他领域处於不营利,甚至亏本的境地。没有了Windows,Office也将随之丧失了“占山头“的优势,虎落平阳就是如此。Windows是微软的旗舰,.NET是微软的独家武器,这武器一定是要安在微软的战机身上,微软怎能允许自己的重型武器.NET落在自己敌人Linux的手上呢?
再看MONO,一个企图让.NET在Linux上跑的工程。而且另一要命的地方是,他是开源项目,所有的ADO.NET和ASP.NET都是重新实现并开放源代码。微软只把C#送了出来做了个国际标准,可没有把ADO.NET开源出来啊,虽然MONO的ADO.NET是它自己的实现,但最后两家的功能是一样的,API也是相同。功能是相同的,可你是开源的,你这不是要腾空微软的ADO.NET吗? 你开发出来的ADO.NET和微软的ADO.NET是什么关系? 我微软和你MONO是什么关系? 难道我搞.NET 是让你Linux 来爽快的吗? 你Linux才是我的终极敌人。
微软之所以现在没有反制MONO,是因为MONO项目目前还不成熟。最起码,它还无法达到企业的需要。基本上是实验室里的东西,对微软不构成实质上的威胁。而另一方面,MONO又能被微软当做一个免费的".NET兼容Linux"的宣传资料,也可利用MONO这个开源项目有限地改变一下开源社区对微软的敌视态度。算盘一向精的微软怎能不知如何利用MONO呢?
如果微软真是认为用.NET对付Java比与Linux竞争更重要的话,它就该立马全面支持MONO项目,将.NET移植到Linux,让Java无用武之地,从根本上削弱Java。可事实情况是,现在微软对MONO的态度是听其自生自灭,虽然MONO和微软都声称有些许友好的交往,但只限於低层次。相反,微软重申了它对专利的重视态度,并特别指出: 任何对专利技术的“重新实现“ (re-implementation)都必须在专利保护的范围之内。而MONO项目本身就是对.NET在Linux平台上的“重新实现“。微软在这里,留下了一个恐怖的伏笔。如果有一天,MONO项目真的得以应用和普及,微软的法律武器会如何运作呢?
MONO,原来你是水中月的更多相关文章
- tLinux 2.2下安装Mono 4.8
Tlinux2.2发行版基于CentOS 7.2.1511研发而成,内核版本与Tlinux2.0发行版保持完全一致,更加稳定,并保持对Tlinux2.0的完全兼容.Mono 4版本要求CentOS 7 ...
- 使用Visual Studio 2015 开发ASP.NET MVC 5 项目部署到Mono/Jexus
最新的Mono 4.4已经支持运行asp.net mvc5项目,有的同学听了这句话就兴高采烈的拿起Visual Studio 2015创建了一个mvc 5的项目,然后部署到Mono上,浏览下发现一堆错 ...
- Mono为何能跨平台?聊聊CIL(MSIL)
前言: 其实小匹夫在U3D的开发中一直对U3D的跨平台能力很好奇.到底是什么原理使得U3D可以跨平台呢?后来发现了Mono的作用,并进一步了解到了CIL的存在.所以,作为一个对Unity3D跨平台能力 ...
- 在.NET Core之前,实现.Net跨平台之Mono+CentOS+Jexus初体验
准备工作 本篇文章采用Mono+CentOS+Jexus的方式实现部署.Net的Web应用程序(实战,上线项目). 不懂Mono的请移步张善友大神的:国内 Mono 相关文章汇总 不懂Jexus为何物 ...
- 【月入41万】Mono For Android中使用百度地图SDK
借助于Mono For Android技术,.Net开发者也可以使用自己熟悉的C#语言以及.Net来开发Android应用.由于Mono For Android把Android SDK中绝大部分类库都 ...
- 运用Mono.Cecil 反射读取.NET程序集元数据
CLR自带的反射机智和API可以很轻松的读取.NET程序集信息,但是不能对程序集进行修改.CLR提供的是只读的API,但是开源项目Mono.Cecil不仅仅可以读取.NET程序集的元数据,还可以进行修 ...
- Mono on CentOS 6.3 安装笔记
在网上找到篇关于yum的文章,写的很详细特此推荐下,在阅读本文之前建议先看看它: <CentOS yum源的配置与使用> 如果用的是移动光驱,建议不要开启本地的yum 的本地reposit ...
- MemoryMappedFile 在 Mono in Linux 的开发笔记
前言 MemoryMappedFile(简称MMF)类是.NET中对内存映射文件进行操作的类,内存映射文件是非常高效的本地IO方案,由操作系统提供内存与IO文件之间的映射转换,对内存映射文件的更改由操 ...
- 在Linux(Ubuntu/openSUSE/CentOS)下配置ASP.NET(Apache + Mono)
[题外话] 闲的无聊竟然想尝试测试自己做的项目在不同操作系统上的性能表现,所以决定试试在Linux上部署Apache和Mono的环境.由于平时很少接触Linux,所以从网上找了几篇文章(附在相关链接中 ...
随机推荐
- ansible command模块将返回值写入变量
ansible 中command模块支持 register参数将远程命令执行的输出结果存储在变量中,后续可以在when中对该变量进行检索确定下一步任务. --- - name: cat /etc/re ...
- 更换git用户名或密码
Windows10下更换Git用户名或密码:https://jingyan.baidu.com/article/642c9d3435a6e9644a46f732.html git清除用户名密码 git ...
- 用 python 来操作 docx, xlsx 格式文件(二)(使用 docx 库操作 docx 格式文件
docx 库 文章结构: 一.docx 基本用,创建 docx 文件并添加数据 二.深入理解文本格式(format),并设置所格式属性(attribute) 三.深入理解样式(styles),以及如何 ...
- django orm如何作一个优雅一点的filter?
如果有N多fitler条件, 单独放在一个长语句里显然不好看. 还好, django支持字典方式的过滤条件, 写法大约与单独的长语里差不多. 如下: def get_queryset(self): f ...
- iOS控制器与视图加载方法
转载记录, 请看原文: 1. iOS中的各种加载方法(initWithNibName,loadNibNamed,initWithCoder,awakeFromNib等等)简单使用 http://w ...
- 【PAT】1014. 福尔摩斯的约会 (20)
1014. 福尔摩斯的约会 (20) 大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hy ...
- C# 6.0 新特性 (一)
概述 尽管 C# 6.0 尚未完成,但现在这些功能正处于接近完成的关键时刻.自 2014 年 5 月发布文章“C# 6.0 语言预览版”(msdn.microsoft.com/magazine/dn6 ...
- 利用nodeJs anywhere搭建本地服务器环境【转载】
首先去nodeJs官网下载最新版nodeJs https://nodejs.org/en/ 安装成功后win+r打开cmd 输入node -help 或者node -v查看是否安装成功 装好后 ...
- spring_150907_sqlmapclientdaosupport_getSqlMapClient
1.新建java工程:spring_150907_sqlmapclientdaosupport_getSqlMapClient,如下图所示: 2.工程里添加spring.hibernate.ibati ...
- 【Spark亚太研究院系列丛书】Spark实战高手之路-第3章Spark架构设计与编程模型第3节:Spark架构设计(2)
三,深入RDD RDD本身是一个抽象类,具有很多具体的实现子类: RDD都会基于Partition进行计算: 默认的Partitioner如下所示: 其中HashPartitioner的文档说明如下: ...