13

我对 Java 的可移植性感到困惑。如果 Java 语言是可移植的,为什么enum在 J2ME 中是未知的?

在 C++ 中,使用哪个平台或库并不重要。“C++ 语言”不会在所有平台上发生变化。

我的目的是开发一个 Java 库,它只使用原始类型,如intStringArray(类似于 的库Genetic algorithms)。我想在移动和桌面应用程序中使用这个库。但似乎enum和其他一些关键字并非在所有平台上都存在。

所以我想我误解了“Java 可移植性”的含义。这意味着什么?

4

7 回答 7

20

Java 有三种风格:移动版 ME、桌面版 SE 和企业版 EE。

“Java 是可移植的”是指 SE 版本。这意味着您可以在任何具有兼容 JVM 的硬件上运行 Java字节码。

这并不意味着 ME 与 SE 相同,即与 EE 相同。EE 有 EJB,但 SE 和 ME 没有。这并没有降低它们的便携性。

C++ 语言不会在所有平台上发生变化。

这种说法并不完全正确。微软向他们的 C++ 中添加了无法在其他地方运行的扩展。

只要您远离特定于平台的扩展,ANSI C++ 可能意味着可移植源代码。这并不意味着可移植的字节码;您可能需要重新编译和重新链接。

你想在手机上运行遗传算法吗?我知道移动设备已经变得非常强大,但我被教育认为 GA 将成为服务器端功能。移动设备对我来说更像是视图。

于 2012-10-25T12:26:34.823 回答
9

每个硬件架构都有自己独特的指令集(添加 ax、bx...),当您构建 C++ 代码时,编译器会将其转换为特定于您正在处理的系统/架构的机器代码。所以你必须为不同的架构定制和构建你的代码才能在它们上工作。

但是在java中发生的是,当你构建它时,它被编译成字节码(而不是机器码)。Java 虚拟机 (JVM) 将字节码解释为您运行程序的特定架构可以理解的指令。每个主要架构和操作系统都有 JVM,因此您在 Windows 上编写的代码将被解释并在 MAC-OS 或 linux 上运行,而无需您进行任何源代码级别的修改。这就是 Java 具有可移植性的原因,这就是Write Once Run Everywhere座右铭的来源

于 2012-10-25T12:41:05.490 回答
5

Java 被称为“可移植语言”,因为 Java 代码可以在所有主要平台上执行。更重要的是,一旦您将 Java 源代码编译为“字节码”.class,这些文件无需修改即可在任何支持 Java 的平台上使用,这与许多其他需要为每个平台编译“机器代码”的语言不同,例如,用于 32 位和 64 位环境的单独“.exe”。

“可移植”的另一个含义,主要用于 Windows 环境,意味着 Java 运行时环境可以从文件系统中的任意位置运行,并且不需要“安装”,即将重要信息存储在Windows 注册表。对于大多数 Java 应用程序也是如此,并且使它们能够从不同的驱动器号运行,例如通过任何计算机上的 USB 闪存驱动器等外部存储设备,而无需先安装应用程序。

于 2012-10-25T12:27:50.430 回答
4

Java 提供了三种不同类型的可移植性:

源代码可移植性:无论底层 CPU、操作系统或 Java 编译器如何,给定的 Java 程序都应该产生相同的结果。

CPU 架构可移植性:当前的 Java 编译器为尚不存在的 CPU 生成目标代码(称为字节码)。对于打算运行 Java 程序的每个真实 CPU,Java 解释器或虚拟机“执行”J 代码。这个不存在的 CPU 允许相同的目标代码在任何存在 Java 解释器的 CPU 上运行。

OS/GUI 可移植性: Java 通过提供一组库函数(包含在 Java 提供的库中,如 awt、util 和 lang)来解决这个问题,这些库函数与想象的 OS 和想象的 GUI 对话。就像 JVM 提供一个虚拟 CPU 一样,Java 库提供一个虚拟 OS/GUI。每个 Java 实现都提供了实现这个虚拟 OS/GUI 的库。使用这些库提供所需操作系统和 GUI 功能的 Java 程序相当容易移植。

看到这个链接

于 2016-05-31T09:10:59.053 回答
3

虽然 C 和 C++ 语言的语法和语义是标准化的,但要编写一个真正的跨平台应用程序非常困难,除非您将自己限制在非常基本的应用程序中。

这有许多高级和低级原因 - 从字节序到如何与底层操作系统交互(例如打开窗口)。

此外,C/C++ 源代码只能被认为是可移植的,而不是编译的结果——生成的可执行代码和库不可移植,系统架构(例如不同的 CPU)和操作系统之间存在重大差异。

Java 是解决这两个问题的相当成功的尝试:

  1. Java 不会将代码编译为汇编,而是将代码编译为更抽象的“字节码”——一种由虚拟机 (JVM) “解释”或“动态重新编译”为汇编的伪汇编语言。这种转换通常相当有效,因为字节码主要是一种低级语言。某些版本的 ARM 处理器甚至可以本地执行字节码。因此,一旦编译了 java 应用程序,结果就可以在“任何”架构上运行(前提是该机器可以使用 JVM)

  2. Java 捆绑了一个非常大的运行时库,它不仅提供了最常见数据结构的广泛实现(在 JVM 中以针对特定架构最有效的方式实现),还提供了“硬件和软件抽象层”——你可以在编码时以标准方式与系统交互,将其转换为适当的体系结构和操作系统调用是 JVM 的工作。例如,Java 提供了 Swing 框架,它允许您以独立于系统的方式创建 GUI - 即,您打开一个窗口,这在 Windows 中被转换为 Win32/MFC 调用,在 Linux 中被转换为 XWin 调用

也就是说,java有不同的“类型”:

  1. JavaSE 是最常见的
  2. JavaME 是一个精简版,具有有限的库,没有实现 Java5.0 语言更改
  3. 企业级 JavaEE,与 JavaSE 相同,但运行时更大
  4. Android Java,主要与 JavaSE 兼容,但具有特定于 android 手机的附加功能

但是,您应该知道 Java 体系结构的设计允许互操作性,特别是允许混合为不同版本甚至不同“类型”构建的库

于 2012-10-25T12:52:00.227 回答
1

这意味着您在一台机器上编写的 java 程序将在任何其他机器上运行,只要该机器具有 JVM。

参考这个链接

于 2012-10-25T12:26:40.390 回答
0

可移植性是指在不同机器上运行程序的能力。在不同的机器上运行给定的程序可能需要不同的工作量(例如,不做任何工作、重新编译或对源代码进行小的更改)。当人们将 Java 应用程序和小程序称为可移植的时,通常是指应用程序和小程序运行在不同类型的机器上而没有任何更改(例如重新编译或调整源代码)。

于 2012-10-25T12:32:15.523 回答