0

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

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

4

3 回答 3

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

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

  1. 无效程序,其行为未定义或深入到“实现定义”领域,其方式在实现之间实际上有所不同,但恰好适用于它们所编写的任何操作系统/编译器/月相组合。

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

顺便说一句:就第二点而言,我们正处于超越这一点的边缘,除了 Windows 采用 POSIX 之外的每个相关的现实世界系统(该标准基本上扩展了 C 并为您提供了大部分缺少的东西在上面的第 2 点)。但随后出现了 Android 和 iOS,再次将事物碎片化......

于 2013-01-28T21:55:18.143 回答
0

如果您阅读任何有关 C 的历史以及其设计方式和原因的书籍,您会发现 C 旨在允许同一程序在不同的操作系统和硬件上运行

于 2013-01-28T21:26:29.270 回答