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

时间:2013-01-28 21:24:11

标签: java c installer portability

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

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

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

  1. 行为未定义或深入到“实现定义”领域的无效程序,实际上在实现之间有所不同,但碰巧与任何操作系统/编译器/阶段一起工作他们为他们写的月亮组合。

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

  3. 顺便说一句:就第二点而言,除了Windows采用POSIX(一种基本上扩展的标准)之外,我们即将通过每个相关的真实系统来解决这个问题。 C并为您提供上面第2点中遗漏的大部分内容。但随后Android和iOS再次将事情分段......