用非可移植语言(即 C/C++)编写的程序的可移植性



为什么许多流行的程序(如Microsoft Office)都是用C,C++和汇编等语言编写的,而相同的安装程序却可以在具有适当操作系统的任何计算机上工作?是因为安装程序实际上在计算机上编译源代码吗?是因为AMD和英特尔共享基本相同的指令集吗?

我听说C是可移植的,但是Java在什么意义上比C更可移植?那么虚拟机的意义何在呢?

  1. 关于 C 或 C++,没有什么本质上是不可移植的。 可移植性问题仅在调用操作系统或特定于编译器的函数时出现。 在汇编语言编程的情况下,缺乏可移植性通常是由于指令集问题。 如果适当地限制目标计算机集,则这些可移植性问题可能无关紧要,也可能无关紧要。
  2. "适当的操作系统"暗示可移植性(在最严格的意义上)不是一个问题,因为存在一个定义良好的执行环境。 也就是说,提供的二进制文件只能在运行 Windows 的英特尔 ISA 计算机上运行。
  3. 安装程序几乎肯定不会编译计算机的源代码。
  4. 的,由于共享指令集(在这种情况下是操作系统),程序应该在两者上运行得同样好。 如果您尝试在具有不同架构的计算机(例如ARM)或不同的操作系统(也许是Linux)上运行该二进制文件,那么您将不走运。
  5. Java提供了一堆API和一个虚拟机,可以(有时)允许代码编译一次,然后部署在多个体系结构和操作系统上。 因为它们通过 Java API 将接口抽象到系统,所以当您想要部署到不同的系统上时,您不必担心移植所有这些代码。 C 仅提供一些标准库,但不指定特定的计算机体系结构。
  6. 虚拟机的要点正是这种抽象 - 不是编写编译为在主机处理器的指令集中本机运行的代码的程序,而是编写一个编译为在虚拟机中运行的代码的程序。 VM 的实现者负责从 VM 指令到本机主机指令的必要转换,以及结果的转换。

如果你读过任何关于C的历史以及它是如何以及为什么设计的书,你会发现C被设计为允许同一个程序在不同的操作系统和硬件上运行

原则上,C 是一种非常可移植的语言。实际上只有两个可移植性问题的来源:

  1. 无效程序,其行为未定义或深入到"实现定义"领域,其方式实际上因实现而异,但恰好适用于它们所针对的任何操作系统/编译器/月相组合。

  2. 事实上,C有一个非常轻量级的标准库,几乎任何有用的程序都依赖于与用户,操作系统和外部世界进行通信的进一步接口(未在语言标准中定义)。

顺便说一句:就第二点而言,除了Windows采用POSIX(该标准基本上在C上扩展并为您提供了上面#2点中缺少的大部分内容)之外,每个相关的现实世界系统都即将超越这一点。但随之而来的是Android和iOS再次碎片化的东西......

最新更新