什么是C ++创建的EXE与其他语言(如Visual Basic或C)

时间:2015-08-14 04:09:05

标签: c++ vb.net

我在这里有两个问题:

  1. 我知道C ++创建的EXE文件运行速度比VB快得多,但为什么呢?它们在编译后都变成了机器码吗?

  2. 如果将C ++编译成机器代码,为什么它依赖于操作系统。例如,为什么你不能在Linux上运行编译输出?如果它与库(如stdio.h)有关,它们是否也转换成机器语言?

1 个答案:

答案 0 :(得分:2)

  1. 虽然C ++确实被编译为机器代码,但VB(和C#)却没有。 VB(以及C#和其他.NET语言)被编译为所谓的MSIL(微软中间语言),它是虚拟理想机器的机器代码。虚拟机的机器代码通常称为“字节码”。这些指令由CLR(公共语言运行库)即时编译成实际的机器代码(JIT(及时)编译)。这样做的结果实际上是VB程序可以在几乎任何机器上运行而无需多次编译。它运行速度较慢(稍微),因为它需要JIT,但是大多数性能问题在过去十年左右都得到了解决,而且C#或VB总是比C ++慢得多(不要敲它直到你试试性能......对于90%的应用程序,它可能会是相同的)。在某些情况下,C#可以更快,因为JIT编译器在代码运行时进行了一些有趣的优化,而编译的C ++程序并不总是这样。总结一下:

    • C ++,C和其他类似语言直接编译为机器代码。必须针对将要使用的每个机器体系结构进行编译。
    • C#,VB,Java和其他类似的语言编译成“字节码”,它对应于某些理想虚拟机的机器代码。当程序实际运行时,此代码由某种运行时转换为特定机器的机器代码。一般来说,代码只需要编译一次,以便在任何机器上运行(在.NET中并不总是如此,但只要你不熟悉设置就足够了)。
  2. 由于多种原因,它取决于操作系统。我将列出一些我认为重要的内容:

    • 可执行文件的格式在操作系统之间存在很大差异。可执行文件只是一个文件,并且具有与任何其他文件一样的特定格式。此外,可执行文件不仅包含您的代码。有一些初始化用于设置程序在内存中的外观和类似的东西。例如,linux使用ELF格式。 Windows使用不同的东西(对不起......重的linux用户在这里)。它可能与Windows和Linux上的机器代码相同,但它的初始化和文件格式很重要。
    • 这应该有自己的要点,因此除了文件格式不同之外,启动程序所需的顺序以及标准库的实现的脏细节因操作系统而异。线程和进程之类的东西在概念上可能在操作系统之间是相同的,但它们的实现可能非常不同。用户权限以及这些工作的方式极为多样。文件和文件系统也完全不同。你得到了照片......
    • 共享库。如果您使用标准库的任何部分(例如<string>),则通常从共享库(Windows中的.dll,Linux中的.so)加载。实际加载库的代码位在操作系统之间差异很大。甚至调用函数的方式也各不相同。
    • 系统调用。没有你意识到,你的代码几乎总是会进行系统调用。您的代码需要能够作为一个进程在计划的环境中运行,并且它需要能够从操作系统中侦听有关这类内容的信号。几乎所有操作系统都有自己的实现方式。