在上一篇文章中,小编为您详细介绍了关于《你好我家壁挂炉咋老是滴水啊?壁挂炉可以用铁管安装么》相关知识。本篇中小编将再为您讲解标题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咋转大数据》,感兴趣的同学可以点击进去看看。
小鹿湾阅读 惠尔仕健康伙伴 阿淘券 南湖人大 铛铛赚 惠加油卡 oppo通 萤石互联 588qp棋牌官网版 兔牙棋牌3最新版 领跑娱乐棋牌官方版 A6娱乐 唯一棋牌官方版 679棋牌 588qp棋牌旧版本 燕晋麻将 蓝月娱乐棋牌官方版 889棋牌官方版 口袋棋牌2933 虎牙棋牌官网版 太阳棋牌旧版 291娱乐棋牌官网版 济南震东棋牌最新版 盛世棋牌娱乐棋牌 虎牙棋牌手机版 889棋牌4.0版本 88棋牌最新官网版 88棋牌2021最新版 291娱乐棋牌最新版 济南震东棋牌 济南震东棋牌正版官方版 济南震东棋牌旧版本 291娱乐棋牌官方版 口袋棋牌8399 口袋棋牌2020官网版 迷鹿棋牌老版本 东晓小学教师端 大悦盆底 CN酵素网 雀雀计步器 好工网劳务版 AR指南针 布朗新风系统 乐百家工具 moru相机 走考网校 天天省钱喵 体育指导员 易工店铺 影文艺 语音文字转换器