我想知道为什么Java比C、C++、.NET和任何其他语言更容易移植。我读过很多次关于java是可移植的,因为解释器和JVM,但JVM只是隐藏了硬件中的架构差异,对吧?对于不同的机器架构,我们仍然需要不同的JVM。这里我漏掉了什么?因此,如果有人为最常见的体系结构编写了一个抽象层,比如说云服务器,那么一旦安装了云服务器,任何C程序都可以在这些体系结构上运行,不是吗?
这种可移植性到底是什么?.NET可以被称为可移植的吗?
发布于 2010-10-14 01:24:41
可移植性不是一个非黑即白的东西,是或不是。可移植性是指我可以轻松地将一个程序运行在他所关心的所有平台上。
有几件事会影响这一点。一个是语言本身。Java语言规范通常留给“实现”的任务要少得多。例如,"i = i++“在C和C++中没有定义,但在Java中有定义的含义。更实际地说,像" int“这样的类型在Java语言中有一个特定的大小(例如:int总是32位),而在C和C++中,大小随平台和编译器的不同而不同。这些差异本身并不能阻止您用C和C++编写可移植的代码,但是您需要更加勤奋。
另一个是库。Java有一堆C和C++没有的标准库。例如,线程、网络和GUI库。C和C++都有这类库,但它们不是标准的一部分,相应的库在不同的平台上可能会有很大的不同。
最后,还有一个完整的问题,那就是你是否可以把一个可执行文件放到另一个平台上,让它在另一个平台上工作。假设有用于目标平台的JVM,这通常适用于Java。(人们关心的许多/大多数平台都有JVM)对于C和C++来说通常不是这样的。通常情况下,您至少需要重新编译,这是假设您已经注意到了前两点。
是的,如果一个"CVM“存在于多个平台上,那将使C和C++更加可移植--某种程度上。你仍然需要以一种可移植的方式编写你的C代码(例如:除了标准所说的之外,不假设int的大小),或者你写到CVM (假设它已经为所有目标平台上的所有这类事情做出了统一的决定)。您还需要放弃使用非标准库(没有网络、线程或GUI),或者为这些目的写入特定于CVM的库。因此,我们实际上并不是在讨论如何使C和C++更易于移植,而是一种特殊的可移植的CVM-C/C++。
再说一次,可移植性不是非黑即白的事情。即使使用Java,仍然可能存在不兼容的问题。GUI库(尤其是AWT)因为具有不一致的行为而臭名昭著,如果您变得草率,涉及线程的任何东西都会有不同的行为。然而,一般来说,将一个在一个平台上编写的非平凡的Java程序在另一个平台上运行要比使用C或C++编写的程序容易得多。
发布于 2010-10-16 08:50:26
正如其他人已经说过的那样,可移植性是一个模糊的概念。从某种角度来看,C实际上是比更可移植的语言。C语言对底层硬件的假设很少。它甚至没有假设一个字节中有8位,或者负数应该用2的补码来表示。从理论上讲,只要你有一个基于Von Neumann的机器和一个编译器,你就可以使用C语言。
事实上,与Java编写的"Hello world“程序相比,用C语言编写的"Hello world”程序可以在更多的平台上运行。您可能会在PDP-11和iPhone上运行相同的"hello world“程序。
然而,现实情况是,大多数现实世界的程序所做的远不止输出"Hello world“。Java以比C更可移植而闻名,因为在实践中,将现实世界的C程序移植到不同的平台比将现实世界的Java程序移植到不同的平台需要付出更多的努力。
这是因为C语言实际上是ANSI-C,这是一种非常通用的基本语言。它不支持网络编程、线程或GUI开发。因此,一旦您编写了一个包含上述任何内容的程序,您就必须依赖于C语言的一个可移植性较差的扩展,如Win32或POSIX或其他任何扩展。
但在Java中,网络编程、线程和GUI工具是由语言定义的,并内置于每个VM实现中。
也就是说,我认为很多程序员也低估了现代C/C++在可移植性方面所取得的进步。POSIX在提供跨平台线程方面走了很长一段路,当涉及到C++时,Boost提供了网络和线程库,它们基本上和Java语言中的任何东西一样可移植。这些库有一些特定于平台的怪癖,但Java也是如此。
本质上,Java依赖于每个平台都有一个VM实现,它将以可预测的方式解释字节码,而C/C++依赖于使用预处理器(#ifdef)合并了特定于平台的代码的库。这两种策略都允许跨平台线程、联网和GUI开发。简单地说,Java在可移植性方面比C/C++取得了更快的进步。Java语言规范几乎从一开始就有了线程、网络和图形用户界面的开发,而Boost网络库直到2005年左右才问世,直到2011年有了C++11,C++中才包含了标准的可移植线程。
发布于 2010-10-14 00:43:41
当你编写一个Java程序时,它可以运行在所有为它们编写的平台上-- Windows、Linux、MacOS等等。
如果要编写C++程序,则必须专门针对每种平台进行编译。
现在,有人说Java的座右铭“一次编写,到处运行”是一个神话。对于需要与许多本机资源交互的桌面应用程序来说,情况并非如此,但每个JavaEE应用程序都可以在任何平台上运行。目前我正在开发windows,其他同事也在开发Linux --没有任何问题。
(与可移植性相关的另一件事是JavaEE (企业版)。据说,使用JavaEE技术编写的应用程序可以在任何经过JavaEE认证的应用服务器上运行。然而,这至少在JavaEE6之前是不正确的。(see here)
https://stackoverflow.com/questions/3925947
复制相似问题