C++ 创建的 EXE 与其他语言(例如 Visual Basic 或 C)创建的 EXE 有什么区别

ins*_*ion 0 c++ vb.net

我这里有两个问题:

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

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

Los*_*les 5

  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>例如),它通常是从共享库加载的(.dll在 Windows 中,.so在 Linux 中)。实际加载库的代码位在操作系统之间差异很大。甚至调用函数的方式也可能有所不同。
    • 系统调用。在您没有意识到的情况下,您的代码几乎总是会进行系统调用。您的代码需要能够作为进程在预定环境中运行,并且需要能够侦听来自操作系统的有关此类内容的信号。几乎所有操作系统都有自己的实现方式。