这可能是一个愚蠢的问题但我在便携式和机器独立之间感到困惑。 什么是Java,c#.net:便携式还是机器独立的?
答案 0 :(得分:3)
机器独立
机器独立性指的是可以执行的软件的概念,而不管它执行的机器。一台机器依赖软件可能是编写使用的东西,比如特定于某种体系结构的汇编指令。例如,如果您编写的C ++应用程序具有依赖于特殊处理器指令(例如SIMD指令)的内联汇编程序,那么该软件版本与机器有关,因为它具有特定的机器要求 - 它只能在支持的机器上运行特定的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 ,x86和x64。
最后,还有语言可移植性的问题。许多人会争辩说,虽然为Windows编译的C ++应用程序不能在Linux上本地执行,但是可以编写C ++代码,这样可以在Linux和Windows上编译同一组源代码而无需更改 - 这意味着您可以将相同的应用程序移植到不同的操作系统,只需将其按原样编译即可。在这方面,我们可以说虽然编译的C ++应用程序不可移植,但C ++应用程序的源代码可以是可移植的。这适用于许多其他语言,包括C.
<强>声明强>
这是一个稍微简化的解释,并且有许多边缘情况违反了这些规则,这使得它成为一个复杂和主观的主题 - 例如,如果您使用Java,则可以编写与机器相关的Java应用程序原生接口。
答案 1 :(得分:1)
答案 2 :(得分:1)
来自Wikipedia:
当将软件移植到新平台的成本时,软件是可移植的 低于从头开始编写的成本。成本越低 移植软件,相对于其实施成本,更多 便携式据说是。
另一方面,与机器无关的软件不需要在另一台机器上运行任何工作(例如从Windows到Mac OS)。通过这个定义也是高度便携的。
答案 3 :(得分:1)
PORTABLE和Machine Independent之间有什么区别?
对此没有真正的答案。这取决于您选择接受的“便携式”和“机器独立”的定义。 (我可以选择一对我同意的定义并对其进行比较。但我不认为这是客观的。)
什么是Java,c#.net:便携式还是机器独立?
您可能认为Java和C#既不是便携式也不是机器独立的。
Java或C#程序仅在具有JVM或CLR实现的平台上运行,并且是相应标准库的“兼容”实现。因此,这些语言与机器无关(在字面意义上)。
有很多Java(我确定是C#)程序在Java / C#的不同实现上表现不同。有时,这是由于运行时库和/或主机操作系统的差异。有时这是由于程序员无效的假设。但重点是Java / C#软件通常需要移植工作。因此,它们不是便携式的(在字面意义上。)