首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >编译c++/c#/java有什么不同?

编译c++/c#/java有什么不同?
EN

Stack Overflow用户
提问于 2010-09-08 08:33:32
回答 3查看 2.4K关注 0票数 4

我正在尝试理解这些语言是如何在幕后工作的。不幸的是,我只读过非常肤浅的东西。我将总结我所知道的,如果你能纠正我,我将非常高兴,最重要的是,帮助我提高我的一丁点知识。

C++:

C++编译器对所有源文件进行预处理。这意味着,它实际上将字符串插入到宏最初所在的位置。之后,它为每个包含独立于机器的字节码的源文件创建一个.obj文件。然后,链接器将库中的所有外部.obj文件与自定义的.obj文件链接在一起,并将其编译为.exe。

Java:

Java代码被编译成独立于机器的“字节码”,它位于.class文件中,而这些字节码又可以位于.JAR文件中,这些文件在JRE上运行。然后,虚拟机正在进行垃圾清理。Java代码像C#一样是即时编译的,但带有SUN开发的热点优化。

C#:

实际上和Java是一样的?C#源代码被编译成通用中间语言(Common Intermediate Language,CIL )代码,它仍然是人类可读的。这段代码将由CLR实时运行。这种编译会在方法第一次被调用时将其转换为特定于机器的代码。

实际上,我感兴趣的是几乎每一个language...but Java和C#几乎都是一样的,我总是想知道它们是如何区分的。可以说,C++是“经典”的。两者的父亲都没有任何类型的虚拟机。感谢您的帮助!

编辑:我知道这是一个宽泛的主题,但我真的找不到任何扎实的知识。如果你有解释这类事情的链接或书籍,我很乐意去工作。我试着阅读了java虚拟机的SUN规范/白皮书,但现在对我来说有点太深了。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-08 08:45:36

非托管C++的编译与托管C++、C#和Java的编译非常不同。

非托管C++

非托管C++ (“传统的”C++)被直接编译成机器码。程序员调用以特定平台(处理器和操作系统)为目标的编译器,编译器输出仅在该平台上工作的可执行文件。可执行文件包含特定处理器能够理解的机器代码。当执行时,处理器将直接按原样执行编译后的代码(模数虚拟内存地址转换yadda yadda)。

托管C++、C#和Java

托管代码被编译成中间代码(在.NET语言的情况下是CIL,在C#的情况下是Java)。编译器输出一个包含此中间语言代码的可执行文件。在这一点上,它仍然是平台独立的。在执行时,所谓的即时编译器将启动,它在执行之前将中间代码转换为机器码。然后,处理器将执行由JIT编译器生成的机器码。大多数情况下,这个机器码被保存在内存中,并在程序结束时被丢弃(所以下次它必须再次运行JITting ),但是有一些工具可以永久地执行JITting。

当然,好处是与平台无关的可执行文件可以在任何平台上运行,但缺点是您需要为该平台提供一个执行环境(包括JIT编译器)。

票数 6
EN

Stack Overflow用户

发布于 2010-09-08 08:41:30

相当不错。

C++的.obj文件是机器相关的,但通常不会解析内存地址。链接器只是获取.obj文件并将它们链接在一起,并将许多地址解析为绝对值。

说虚拟机只是在做垃圾清理是不正确的--甚至不确定这是什么意思。VM读取代码的字节并对每个字节进行解码,因此VM就像一个CPU。当它发现一堆重复执行的代码时,它可以用真正的高度优化的机器码--即JIT编译--替换该字节码。

我认为其余的是非常正确的--尽管我不能诚实地说C#的CIL是否是人类可读的。

票数 1
EN

Stack Overflow用户

发布于 2010-09-08 10:56:14

这三种语言基本相同(它们都是命令式面向对象语言),主要区别在于

  • Java和C#支持运行时类型反射(即程序可以检查自身,类型转换是运行时检查操作),而C++不支持,
  • 您不能直接从语言内部破坏Java和C#类型(尽管我怀疑所有三种语言的编译器在异常情况下都只是发出具有未定义语义的代码);
  • C++不必检查空解引用(这留给硬件),而C#和Java在每次解引用时都必须检查空值;
  • C#和Java必须提供关于内存模型(即,在对同一变量进行并发读/写的情况下会发生什么)和异常处理方面的更强大的保证,因此

C++被直接编译成目标机器或汇编语言,而C#和Java通常被编译成中间语言(IL或JVM),以便稍后进行JITting或解释。IL和JVM本质上是“CPU”的抽象。

C++编译器将花费更多的时间来优化它生成的代码,因为它不能将底层优化的责任推给JIT编译器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3663754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档