Har*_*non 27 c java portability programming-languages
我想知道Java如何比C,C++和.NET以及任何其他语言更具可移植性.由于解释器和JVM,我已多次阅读过有关Java的可移植性,但JVM只是隐藏了硬件中的体系结构差异,对吧?对于不同的机器架构,我们仍然需要不同的JVM.我在这里错过了什么?因此,如果有人为最常见的体系结构为C编写抽象层,让我们说CVM,那么一旦安装了CVM,任何C程序都将在这些体系结构上运行,不是吗?
这个便携性究竟是什么?.NET可以称为可移植吗?
Lau*_*ves 41
便携性不是黑白,是或否.可移植性是指我可以轻松地在一个人关心的所有平台上运行程序并运行它.
有一些事情会影响这一点.一个是语言本身.Java语言规范通常留下更少的"实现".例如,"i = i ++"在C和C++中未定义,但在Java中具有已定义的含义.更实际地,类似"int"的类型在Java中具有特定大小(例如:int总是32位),而在C和C++中,大小取决于平台和编译器.仅这些差异并不妨碍您在C和C++中编写可移植代码,但您需要更加勤奋.
另一个是图书馆.Java有一堆C和C++没有的标准库.例如,线程,网络和GUI库.这些类型的库存在于C和C++中,但它们不是标准的一部分,并且可用的相应库可能因平台而异.
最后,问题是你是否可以将可执行文件放在另一个平台上并让它在那里工作.这通常适用于Java,假设目标平台有一个JVM.(并且人们关心的许多/大多数平台都有JVM)对于C和C++来说,这通常是不正确的.您通常至少需要重新编译,并且假设您已经处理了前两点.
是的,如果存在多个平台的"CVM",那将使C和C++更具可移植性.您仍然需要以可移植的方式编写C代码(例如:假设除了标准所说的内容之外没有任何关于int的大小)或者您要写入CVM(假设它已做出统一的决定)所有目标平台上的所有这些事情).您还需要放弃使用非标准库(无网络,线程或GUI)或为此目的写入CVM特定的库.因此,我们并没有真正谈论使C和C++更具可移植性,而是一种可移植的特殊CVM-C/C++.
再一次,便携性不是黑白分明的事情.即使使用Java,仍然可能存在不兼容性.GUI库(特别是AWT)因为具有不一致的行为而臭名昭着,而涉及线程的任何事情如果你变得粗鄙都会表现得不同.但是,一般来说,在一个平台上编写非平凡的Java程序并在另一个平台上运行它比在C或C++编写的程序中执行相同操作要容易得多.
Cha*_*via 21
正如其他人已经说过的那样,便携性在某种程度上是一个模糊概念.从某个角度来看,C实际上比Java 更便携.C对底层硬件做了很少的假设.它甚至不假设一个字节中有8位,或者负数应该用二进制补码表示.从理论上讲,只要你有一台基于Von Neumann的机器和编译器,你就可以选择C.
实际上,用C语言编写的"Hello world"程序将在比用Java编写的"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++,加速提供网络和线程这基本上就像在Java的任何便携库.这些库有一些特定于平台的怪癖,但Java也是如此.
从本质上讲,爪哇依赖每个平台具有VM实现,这将在可预见的方式解释字节代码上,和C/C++依赖于掺入其使用预处理器(平台特定代码库#ifdef
或多个).这两种策略都允许跨平台线程,网络和GUI开发.简单来说,Java在可移植性方面取得了比C/C++更快的进步.Java语言规范有螺纹,几乎从一开始联网和GUI开发,而升压联网库只在2005年左右就出来了,而且直到2011年,C++ 11标准的一个便携线程被列入C++.
编写Java程序时,它在所有为其编写JVM的平台上运行 - Windows,Linux,MacOS等.
如果您编写C++程序,则必须专门为每个平台编译它.
现在,据说Java的座右铭"一次编写,随处运行"是一个神话.对于需要与许多本机资源进行交互的桌面应用程序来说,情况并非如此,但每个JavaEE应用程序都可以在任何平台上运行.目前我正在开发Windows,其他同事正在开发Linux - 没有任何问题.
(与可移植性相关的另一个问题是JavaEE(企业版).据说使用JavaEE技术编写的应用程序可以在任何经过JavaEE认证的应用程序服务器中运行.但是,至少在JavaEE6之前是不行的.(见这里))
可移植性是衡量程序在另一个环境上运行的努力程度的度量.
现在你可以讨论一下Linux上的JVM是否与Windows不同(我认为是),但事实仍然是,在许多情况下,如果你要避免一些陷阱,就不会有任何努力.
您正在谈论的CVM非常类似于POSIX库和运行时库试图提供的内容,但是存在很大的实现差异,这使得跨越障碍很高.当然,在微软和苹果公司的情况下,这些可能是故意的,以防止开发人员在竞争平台上推出产品.
在.net方面,如果你能坚持使用mono提供的开源.Net实现,你将享受与Java大致相同的可移植性,但由于mono远远落后于Windows版本,因此这不是一个受欢迎的选择.我不知道这对于基于服务器的开发有多受欢迎,我可以想象它不是一个问题.