百科问答小站 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支持这种观点只不过是道听途说小白的笑话。




  

相关话题

  面向对象中,平行继承体系是否尽量完全抛弃? 
  程序员必须掌握哪些算法? 
  为什么时效上具有明显优势的基数排序(radix sort)没有快速排序流行? 
  为什么当年 Android 选择用 Java 作为开发语言? 
  公司如何保护源代码不被员工泄漏? 
  为什么程序代码被编译成机器码就不能跨平台运行? 
  为什么C#中型变不能直接修饰在类定义上? 
  为什么 Java 总被黑? 
  win7笔记本,外接扩展显示器,如何在不缩小外接显示器像素的同时去除外接显示器的桌面背景黑边? 
  .NET中如何通过Razor引擎生成这样的代码? 

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





© 2024-11-24 - tinynew.org. All Rights Reserved.
© 2024-11-24 - tinynew.org. 保留所有权利