Java、C#、NET Framework、Mono 是如何跨平台的?C++跟java比运行效率高在哪里

发表时间:2018-03-11 23:20:02 作者: 来源: 浏览:

在上一篇文章中,小编为您详细介绍了关于《你好我家壁挂炉咋老是滴水啊?壁挂炉可以用铁管安装么》相关知识。本篇中小编将再为您讲解标题Java、C#、NET Framework、Mono 是如何跨平台的?C++跟java比运行效率高在哪里。

java/C#都说是可以跨平台的,为什么大部分商业公司都选了java,而不是.net/c#那?谢谢

还有就是我的理解是java 需要虚机 jdk也就是运行时,来跨平台,c# 需要 .net framework 运行时来跨平台,要是.net framework 能安装到linux,那么mono还有必要吗?要是不能,c#怎么说自个是跨平台的那?

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

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

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

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

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

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

想起来都是吐槽,我只能说我偏题了,我平常用C更多,觉得几个麻烦的地方,其实C++类似:

①. 字符串, 我平常更多用C, 你要写很多代码防止溢出, 写函数要多传长度参数, 要写代码处理缓冲区长度不够的问题, 要检查返回值 ... 不能不说用C++好很多了, 但是std::string还是有很多缺点

②. 好库太少, 其实不要太苛求,不要太洁癖的话, 好用的库还是有①些的。 比如要用①个hash, 找了几个库看代码觉得不好, 于是问同事推荐, 他推荐了①个知名的开源通信库, 进去代码①看, 里面的hash是常见的②维链表方式的, 但是:

①. 为啥数组 hash table 要保存链表头指针还要加上 key-value 对? 这样不是很浪费内存吗?

②. 为啥求余居然用 %①⓪②④ %②⓪④⑧ 这样的数值, 这不是很容易hash冲突的? 不应该用质数吗?

③. 每次新增①个key-value, key-value pair对要malloc出来, 然后key也要单独malloc, value也要单独malloc, 这样我添加①个元素还得 malloc ③ 次, 多线程环境下好慢的! 说不定还不如直接遍历搜索呢!

其实我也知道这都不是太大的问题,因为内存啊速度啥的都不是瓶颈,但是就是想起来就不舒服斯基, 最后觉得反正也不是很复杂的东西,要不还是自己写吧。

写java就没有这个问题, 反正大部分东西系统都做好了给你,既不用去费心选库,啥性能什么的你能操心的地方也不多,你爱用不用。

编后语:关于《Java、C#、NET Framework、Mono 是如何跨平台的?C++跟java比运行效率高在哪里》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《想知道在南阳谁牌子的壁挂炉质量可靠?android咋转大数据》,感兴趣的同学可以点击进去看看。

资源转载网络,如有侵权联系删除。

相关资讯推荐

相关应用推荐

玩家点评

条评论

热门下载

  • 手机网游
  • 手机软件

热点资讯

  • 最新话题