这可能是一个愚蠢的问题,但我对便携式和独立于机器感到困惑。什么是 Java、c#.net:可移植还是独立于机器?
4 回答
机器独立性
机器独立性是指可以执行的软件的概念,而与它在其上执行的机器无关。一个依赖于机器的软件可能是为了使用而编写的,比如特定于某个架构的汇编指令。例如,如果您使用依赖于特殊处理器指令(例如 SIMD 指令)的内联汇编编写 C++ 应用程序,那么该软件部分取决于机器,因为它具有特定的机器要求——它只能在支持特定所需的 SIMD 指令集。
相比之下,C# 和 Java 编译为由虚拟机执行的字节码,该虚拟机采用该字节码并将其作为本机代码直接在处理器上执行。在这种情况下,虚拟机依赖于机器,因为它将针对为其编写的特定硬件执行 - 例如,仅 32 位 Intel 处理器或 ARM 智能手机。然而,在虚拟机上运行的 Java 和 C# 应用程序是独立于机器的,因为它们并不关心底层平台是什么,只要有一个虚拟机可以为它们转换为底层平台。该抽象层,即虚拟机,有助于将应用程序与底层硬件分开,这就是这些应用程序可以独立于机器的原因.
可移植性
可移植性是一个独立但相关的概念,它是一个涵盖多种可能性的广义术语。如果一个软件可以在多个平台上构建和执行或简单地执行,那么它就是可移植的。这意味着与机器无关的软件本质上是可移植的,因为它必须是天生的。
可移植性大致有两个方面——硬件可移植性和软件可移植性。暂时忽略 Mono 等 .NET 实现,只关注 Microsoft 的 .NET 实现,公平地说 .NET 是硬件可移植的,因为它可以在任何支持 .NET 运行时的硬件上执行,但是因为 Microsoft 的实现只是可在 Windows 和 Windows 衍生操作系统上使用 公平地说,它不是特别可移植的软件 - 没有 Mono,它无法在 Mac OS X 或 Linux 上执行。相比之下,Java 可以说是硬件可移植和软件可移植,因为它可以在 Windows、OS X、Linux 等多种操作系统上运行,因此它是软件可移植的,而硬件可移植是因为它可以在 ARM 等不同的硬件架构上运行,
最后,还有语言可移植性的问题。许多人会争辩说,尽管为 Windows 编译的 C++ 应用程序不会在 Linux 上本机执行,但可以编写 C++ 代码,以便在 Linux 和 Windows 上编译相同的源代码而无需更改——这意味着您只需按原样编译即可将相同的应用程序移植到不同的操作系统。在这方面,我们可以说,虽然编译的 C++ 应用程序不可移植,但 C++ 应用程序的源代码是可移植的。这适用于包括 C 在内的许多其他语言。
免责声明
这是一个稍微简化的解释,并且有许多边缘案例打破了这些规则,这使得它成为一个如此复杂和主观的主题 - 例如,如果您使用 Java 本机接口,则可以编写依赖于机器的 Java 应用程序。
来自维基百科:
当将软件移植到新平台的成本低于从头开始编写的成本时,软件是可移植的。相对于实施成本而言,移植软件的成本越低,据说它的可移植性就越高。
另一方面,与机器无关的软件不需要在另一台机器上运行任何工作(例如从 Windows 到 Mac OS)。根据这个定义,它也是高度可移植的。
PORTABLE 和 Machine Independent 有什么区别?
对此没有真正的答案。这取决于您选择接受谁对“便携式”和“独立于机器”的定义。(我可以选择一对我同意的定义并进行比较。但我认为这不是客观的。)
什么是 Java、c#.net:可移植还是独立于机器?
您可能会争辩说 Java 和 C# 既不是可移植的,也不是机器独立的。
Java 或 C# 程序仅在具有 JVM 或 CLR 实现以及相应标准库的“兼容”实现的平台上运行。因此,这些语言不是机器独立的(从字面上看)。
有许多 Java(我确定是 C#)程序的示例,它们在 Java / C# 的不同实现上表现不同。有时这是由于运行时库和/或主机操作系统的差异。有时这是由于程序员的无效假设造成的。但重点是 Java/C# 软件经常需要移植工作。因此,它们不是便携式的(从字面上看。)