百科问答小站 logo
百科问答小站 font logo



Java、C#、.NET Framework、Mono 是如何跨平台的? 第1页

  

user avatar   Ivony 网友的相关建议: 
      

商业公司选什么,和他跨不跨平台没有半毛钱关系,而且选择.NET的商业公司也不少。更重要的是Java在Linux上有诸多案例、技术和人才的积累,所以Linux服务器选择Java的居多,至于android,那是另一个非技术层面的问题不谈。。

事实上,与直觉相悖的是,跨平台的程序设计语言远比不跨平台的程序设计语言多,例如Python、PHP、JavaScript。所以这里说的跨平台主要是指Java的那个广告语:一次编译,到处运行。

所以首先我们要明确定义,跨平台的含义是指一次编译,各个平台都可以运行。否则无需编译的脚本语言如JavaScript,本来就是跨平台的,各个平台分别编译的Hello World!的C语言程序,也是跨平台的。


那么Java/C#的一次编译,到处运行的方式到底是如何实现的呢?首先我们要搞明白为什么C/C++语言不能一次编译到处执行,因为C/C++的编译的结果是针对特定平台操作系统、处理器指令集而生成的本地代码(native code),那么不同操作系统和处理器(事实上x86处理器的指令集都是兼容的)的本地代码是不一样的,自然也就不可能一次编译到处执行。

而直接解释执行的脚本语言,因为不存在编译到本地代码这一过程,所以也不存在跨平台的问题。


那么C#/Java是如何实现的呢?通过上面的知识我们就不难想到了,结合解释执行和编译执行的优点,C#/Java发明了一种叫做中间语言(IL,.NET是CIL,Java是ByteCode)的东西,中间语言与特定的操作系统和处理器指令集都没有关系,C#/Java在编译时,是编译成为一种低阶的语言,即IL。然后通过在特定平台的运行时程序(CLR和JRE),解释和编译IL来执行,,,,


补充阅读:

所以跨平台从来都不是一个新鲜事儿,不仅仅大多数程序设计语言都是跨平台的,而且跨了都好多年了,Java的革命性在于,其提供了一个新的跨平台的方案,由于在编译成低阶的IL之前和之后都有编译器优化,所以其性能可以接近于C/C++直接编译出来的native code,同时还大大的提高了开发效率,而实现这一点的关键就是IL+JIT编译。事实上在今天,几乎所有的脚本语言、动态类型语言也都走上了这条路,例如JavaScript和PHP,也开始尝试即时编译执行大大的提升了性能。

但是,跨平台也从来不是简单的语言跨平台,否则在C语言的远古时代,我们就可以利用一份源代码面向不同的平台编译来实现跨平台了。跨平台最大的障碍不在于同一段程序代码不能在多个平台上运行,而是在于在不同的操作系统,我们可以使用的库是不同的,这才是跨平台最大的阻碍。

所以Java的口号,一次编译,到处运行从来都只是一句广告语而已,真正要实现这一点,需要在不同平台统一UI和其他乱七八糟的API和库函数,也就是说虚拟一个操作系统出来,问题是这和跑在虚拟机里面的操作系统还有什么区别呢?

也正是因为如此,Java在桌面系统上几乎从未实现过真正的跨平台,而Web服务这种完全没有UI,无需与操作系统直接交互的应用才是Java大显身手的地方(事实上.NET也是如此)。

由上可知,在不同的操作系统拥有不同的类库是非常正常且不可避免的事情,例如在Linux这种连个GUI都不自带的操作系统,WPF或是WinForm如何能迁移到Linux上面去呢。Mono作为一个成熟的Linux上的CLI运行时,已经提供了绝大多数平台无关的类库,完全满足生产使用的条件,什么没有完整的.NET Framework支持这种观点只不过是道听途说小白的笑话。




  

相关话题

  为什么做 Java 开发的公司需要那么多程序员? 
  程序员开发无代码平台成功后会不会被开除? 
  为什么很多人都说 Python 简单? 
  如何看待一些大学生说 3 天学会了 Java? 
  在程序里如何一本正经的胡说八道? 
  C# 为什么这么难? 
  如何正确理解.NET 4.5和C# 5.0中的async/await异步编程模式? 
  如何把 Java 写出武侠的感觉? 
  python中的lambda 和java中的lambda有什么不同? 
  Java 为什么不采用 360 垃圾清理来进行垃圾回收呢? 

前一个讨论
这段论证有什么不合逻辑的地方?
下一个讨论
在荒岛上如何利用简单工具制造一个近乎完美的球体?





© 2024-12-23 - tinynew.org. All Rights Reserved.
© 2024-12-23 - tinynew.org. 保留所有权利