【转帖】NET 的一点历史往事:和 Java 的恩怨
NET 的一点历史往事:和 Java 的恩怨
https://mp.weixin.qq.com/s?__biz=MzAwNTMxMzg1MA==&mid=2654068672&idx=1&sn=a87b80174cd8703182a0bcddc537f656&chksm=80dbfb95b7ac72835efe9c2fdd8634a36bb9fc1298f5f11ec242fde0ff67e635af32a6aa8644&scene=21#wechat_redirect
在编程语言的发展历史上,1995年应该是个特殊的年头,毕竟这个年头诞生了两个后来二十多年影响深远的语言。1995年5月23日的 SunWorld 大会上面 Sun 公司高调发布了自己研发了近五年的 Java 语言和 JVM 平台。当年的十二月,网景公司将自己刚刚预览的 LiveScript 语言改名为 JavaScript。由于微软正在和网景进行轰轰烈烈的浏览器大战,这两个和万维网有着紧密联系的语言同时得到了微软的关注和支持。
JavaScript 相对简单,所以微软直接反向工程,做出了自己的 JScript 引擎。但是在 Java 这个方面,它采用了完全不同的方式,1996年3月12日直接从 Sun 购买了 Java 授权,并且在当年10月15号开始提供 Windows 平台的 Java SDK。1997年1月到3月间,微软就隆重发布了自己的 Java 开发工具,Visual J++ 1.0/1.1,这个过程快得令人惊诧。
微软在 Visual J++ 方面的投入带来了立竿见影的效果:
Java 是一个比较完善的面向对象语言,这是微软当时的 Visual Basic 和 Visual C++ 两个开发工具都不能相提并论的。
微软为 Visual J++ 做的扩展 WFC 和 J/Direct 使得这个语言和 Windows 平台 API 之间有了更加紧密的联系。
Visual J++ 在 Windows 原生程序和 Office 开发方面都很便利,能够和快速开发工具 Visual Basic 平起平坐。
所以假如 Sun 公司这个时候睁只眼闭只眼,放任自流,那么 Visual J++ 很可能就是今天绝大部分 Windows 开发者的首选。这样服务器端的 J2EE,桌面端的 Visual J++,和移动端的 Android 三驾马车,是不是就让 Java 语言一统天下呢?
然而 Sun 这个公司在推广 Java 方面有点顽固不化的想法,一定要坚持“一次编写到处运行”,一定要坚持 Java 和 JVM 的纯粹,所以对于微软忽视 JNI 等标准部件、另起 WFC 等非标准部件的小动作,直接予以打击,开启了绵延数年的法律官司。这场官司也使得微软在1996年10月6日发布了Visual J++ 6.0之后,这个开发工具便被打入冷宫。
微软为什么会全面退出 Java 领域呢?
语言和平台的规范由 Sun 主导,Sun 在制定标准和接纳新事物方面过于强势。这个问题在数年之后再次发生,就是谷歌抛开 Sun 主导的 J2ME 规范,做了自己的 Android 平台。
Java 语言本身依然有它尚不成熟的地方,例如没有泛型,没有简单的事件机制。这时候微软已经从 Borland 挖来了 Anders Hejlsberg 这样的编辑器大师,完全可以抛开 Java 语言的枝梧来做新的尝试,也就是C#。
JVM 平台完全为 Java 一个语言设计,bytecode 很难成为其他语言的目标。微软可以设计一个更加通用的虚拟机平台,和更好的中间语言。这也就是微软后来的 CLR 和 MSIL。
这些因素使得微软最终招兵买马,开始研发自己全新的 .NET Framework 平台和新版开发工具 Visual Studio,希望在后续的开发工具战役中后来居上。
值得注意的是,毕竟微软从 Sun 购买了 Java 授权,这个授权使得微软得以看到 Java 的源代码,知晓了 Sun 的相关专利,所以在发布新平台之前,法律方面的问题仍是必须加以解决的。2001年1月,微软和 Sun 终于初步和解,一个新的时代即将开始。
原文地址:http://weibo.com/ttarticle/p/show?id=2309404102044121223524
【转帖】NET 的一点历史往事:和 Java 的恩怨的更多相关文章
- 【转帖】.NET的一点历史故事:作者的一些感想
.NET的一点历史故事:作者的一些感想 https://mp.weixin.qq.com/s?__biz=MzAwNTMxMzg1MA==&mid=2654068684&idx=2&a ...
- 【转帖】.NET的一点历史故事:Novell的崩溃和Xamarin的重生
.NET的一点历史故事:Novell的崩溃和Xamarin的重生 https://blog.csdn.net/sD7O95O/article/details/78096502 学习安装 mono 时了 ...
- 从官网下载历史版本的java
下载历史版本的java 因为一些bug需要降低java版本来尝试解决,但是好多都要收费,我就搞不明白了,官网都有免费的我要你的收费软件干嘛 首先直接搜索java,进入Oracle,或者 Java SE ...
- 【转帖】Linux的历史----Linux内核剖析(一)
Linux的历史----Linux内核剖析(一) 2015年04月09日 10:51:09 JeanCheng 阅读数:11351更多 所属专栏: Linux内核剖析 版权声明:本文为博主原创文 ...
- [转帖] JVM虚拟机的历史
Java虚拟机发展史 https://blog.csdn.net/tinyDolphin/article/details/72809018 如何查看自己的虚拟机版本?Sun Classic / Exa ...
- Mac OS 的一点历史: Mac OS, Mac OSX 与Darwin
作为收购 NeXT 公司的结果,苹果公司获得了 NeXTSTEP 架构中的 Mach 和 Objective-C 等设计.尽管 NeXTSTEP 本身已经不再发展了,但是其中的组件在 OS X 中获得 ...
- 个人的一点小愚见,java有什么优点和缺点
java是一种面向对象的编程语言,优点是可移植性比较高,最初设计时就是本着一次编写到处执行设计的.可以开发各种应用程序和游戏,不过速度没有c++快,所以一般是不用java来编写应用程序和电脑游戏. j ...
- 【转帖】oracle数据类型和对应的java类型
原文地址:http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/java.102/B19275-03/datacc.ht ...
- Java版本及历史简述
Java版本及历史简述 初学Java,对于Java那么多版本很困惑,这里做一点笔记,如有错误希望指出. Java由Sun公司创造,后Sun公司被Oracle公司收购,Java也随之变为Oracle的产 ...
随机推荐
- asp.net实现浏览器大文件分片上传
IE的自带下载功能中没有断点续传功能,要实现断点续传功能,需要用到HTTP协议中鲜为人知的几个响应头和请求头. 一. 两个必要响应头Accept-Ranges.ETag 客户端每次提交下载请求时,服务 ...
- (十八)链接数据库,QSqlTableModel
QMYSQL——mysql QSQLITE——sqlite QOICQ——orcale 所需头文件 .pro增加 sql #include <QSqlDatabase> #include ...
- node中的crypto内置模块
crypto模块的目的是为了提供通用的加密和哈希算法.用纯JavaScript代码实现这些功能不是不可能,但速度会非常慢.Nodejs用C/C++实现这些算法后,通过cypto这个模块暴露为JavaS ...
- mounted里面this.$refs.xxx的内容是undefined
在mounted(){}钩子里面使用this.$refs.xxx,打印出来的却是undefined? DOM结构已经渲染出来了,但是如果在DOM结构中的某个DOM节点使用了v-if.v-show或者v ...
- Codeforces 1009 F. Dominant Indices(长链剖分/树上启发式合并)
F. Dominant Indices 题意: 给一颗无向树,根为1.对于每个节点,求其子树中,哪个距离下的节点数量最多.数量相同时,取较小的那个距离. 题目: 这类题一般的做法是树上的启发式合并,复 ...
- JAVA之自动内存管理机制
一.内存分配 1.JVM体系结构 2.运行时数据区域 3.内存分配二.内存回收 1.垃圾收集算法 2.垃圾收集器三.相关参考一.内存分配JVM体系结构 在了解自动内存管理的内存分配之前,我们先看下JV ...
- appium中从activity切换到html
问题:混合开发的app中,会有内嵌的H5页面元素,该如何进行定位操作? 解决思路:appium中的元素定位都是基于android原生控件进行元素定位,而web网页是B/S架构,两者运行环境不同需要进行 ...
- iSCSI存储技术
iSCSI(Internet Small Computer System Interface),Internet小型计算机系统接口,又称为IP-SAN,是一种基于因特网及SCSI-3协议下的存储技术, ...
- babel 实践
一.@babel/core var babel = require("@babel/core");babel.transform(code, options, function(e ...
- CollectionUtils
public class CollectionUtils { /** * 数组是否包含元素 * @param arr * @param str * @return */ public static b ...