java生成的jar包之类的其实并不能执行,它需要虚拟机运行环境,换句话来说,它并不是PE文件,Jar包也只是IL语言的中间层,java源码被编译后,再根据JIT一句句地翻译执行!当然他还有其他的机制,并不是保证每次运行都是有翻译的,事实上他首次对某运行代码段进行翻译会存储到临时空间中,下次执行时则不再翻译(这是JIT优化后的功能)。而这个JIT在不同的机器上(硬件环境不同,会将同一句的IL翻译成不同的机器可 *** 作指令,这也就是移植性的真正内涵)。原理是样的!
C#基于的想法与Java是相同的,它也是如此,但生成的dll或exe其实是一种特殊的PE文件,也是需要.net framework 运行环境支持的!也就是JIT(即时翻译)!它与java运行环境实现的功能是一样的,首次运行某一代码段就翻译某段,但它会有一个镜象存储那里,就是我们说的Native,当翻译过的代码段可以直接从Native中直接运行,跳过JIT翻译从而提高性能。当然,C#的这个dll/exe也是中间语言(IL),只不会老大总是厉害点,它实现的并非是标准的IL,而是微软自家的IL,叫MSIL!换句话来说,两者原理相同,但生成后的IL却是不同的!
C++其实是一门语言而已!它也被.net 作为上层语言,也就是说他也存在一个C++.net。这个当然生成的与C#一样的,其实.net上层有多个编程语言的,不管你是VB/C#/F#/J#还是C++,最终生成的都是MSIL,微软的目的就是上层使用不同语言的程序员能在一起工作,这就是.net,生成的都是MSIL的中间语言的dll/exe。
但是,虽然是在VS中,还存在另一种C++的开发形式,这就是我们说的MFC等相关的开发,其实这时VS开发环境并不是执行.net,而此时VS完完全全就是Visual C++一样的功能。当然这种生成的移植性差了,但他生成的却是windows可以直接执行PE文件,如dll或exe!这种dll/exe并不是MSIL中间语言,而是标准的windows可执行的二进制文件!不须在windows中安全.net运行环境可以直接运行!
所以针对这三者的联接,或者说打包成一个文件,其可能性不大了!jar包中是IL,.net中的MSIL,而C++则完全是二进制PE文件!你要连接成什么?!
所以这是一个跨世纪难题——不过好象不需要解决!
多说一点,net core事实上是可以生成ubuntu等linux分发版的程序的,它是怎么实现的?其实其秘密就在于.net中Native文件——如果你指明了是在某个发行版本的linux时,net core把MSIL直接翻译成对应版本的Native(这玩意可以直接可以执行的!),这就是为什么net core可以跨平台的作用(你知道它是怎么跨的吗?源码跨而已——如果你发布时写dotnet publish -r ubuntu-14.04 那么生成的文档也只能用到ubuntu 14.04上,换到ubuntu 16.04上运行就会出错!所以也可以是winrm 或 win x64等参数),换句话来说,.net生成的dll我们只须指定是X86还是X64/或者IA 64等形式即可,当然也可以X86运行到任何windows系统上!只有一个生成的文件,而跨平台的net core其实并不再具有移植性了!这下你知道Native文件的作用了吧?其实我们在netcore没有推出之前就想办法玩过native文件以提高性能(但丢失了移植性)。
但C++呢,其实这个吧,它也是具有这样的特性的,他生成的文件有一定的移植性,或者多数时候我们需要在不同的系统上进行编译!比如在windows上,编译后可以被不同的windows平台使用,但在linux系统上,一般是下载gcc,然后下源码进行当机编译!换句话来说,net core编译是一个参数,而c++则使用的是“硬参数”由不同的 *** 作系统自己去编译!这你让net core与C++情何以堪?更别说那么还有一个Java!那家伙为了保证自己的可移植性,必须需要虚拟机!
所以吧,你这个问题,其实只是想问问到底有谁懂这些底层的原理而已!虽然它们三个语言关系很近(java是以C++为蓝本,简化C++语言增加类库与虚拟机机制,所以程序员称其为C++升级版——功能升级,被亲切地称为C+++,开明人士认为其对C++语言本身是一种简化——语言简化版,被称之为C++-,而C#则是微软看到Java的优势后生成的语言,为了夺回自己C++的用户群,据说内定就叫Java+,也就是java的升级版!)他们三关系确实很近!
其实吧,针对语言发展上还有一个小秘密:微软有C语言,有C+语言(国内流行的一行左右,很多人不知道,我说这个典的时候,居然有一个哥们上学时就学了一年C+,不过他现在是电工,哈哈),还有C#语言(其实就是C++++呗!),你可能会奇怪,为什么没有C+++语言?对,就是没有这个语言,这个称号是C++的疯狂的时候被送给了Java了!那么程序员都叫Java语言是C+++或C++-!当然C#语言被叫做Java+,据某些报道说是一个内定版本,但没有人称其为Java+的!
三者虽然“近亲”,但一点都不“合”的!
不一定需要经过 Docker 的流程,但是使用 Docker 可以让部署变得更加简单和标准化。使用 Docker 可以将应用程序和依赖打包成一个容器,然后将容器部署到 Linux 系统上,这样可以避免在 Linux 系统中安装大量的依赖和配置环境的繁琐 *** 作。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)