java—独立于平台的语言到底意味着什么?

gupuwyp2  于 2021-06-27  发布在  Java
关注(0)|答案(6)|浏览(467)

为什么c/c不像java那样被称为平台无关的呢?因为用c/c编写的相同源代码可以由不同的编译器在不同的操作系统上运行,就像java中使用jvm一样。
不同的编译器和jvm不是在做同样的事情,实现平台独立性吗。

i2loujxw

i2loujxw1#

如果是c或c++(与平台无关的语言),编译器将生成一个依赖于操作系统的.exe文件。当我们尝试在另一个操作系统上运行这个.exe文件时,它不会运行,因为它依赖于操作系统,因此与其他操作系统不兼容。

yquaqz18

yquaqz182#

不同的编译器和jvm不是在做同样的事情,实现平台独立性吗。
不是真的。java程序在jvm中运行,jvm充当java字节码和本机机器码之间的转换层。它对java应用程序代码隐藏了特定于平台的细节。
c的情况并非如此。c代码(通常)以本机方式运行,因此没有翻译层将其与特定于平台的细节隔离开来。您的c代码可能直接受到特定于平台的差异(字长、类型表示、字节顺序等)的影响。
一个严格符合标准的c程序,不使用标准库之外的任何东西,也不假设类型大小或表示形式超出语言标准所保证的最小值,在编译它的任何平台上都应该表现出相同的行为。您所需要做的就是为目标平台重新编译它。
问题是现实世界中最有用的c和c++代码并不是严格一致的;要做几乎任何有趣的事情,您必须依赖于第三方和特定于系统的库和实用程序,一旦这样做,您就失去了平台独立性。我可以编写一个命令行工具来处理本地文件系统中的文件,这些文件将在windows、macos、linux、vms和mpe上运行;我需要做的就是为不同的目标重新编译它。但是,如果我想写一些gui驱动的东西,或者通过网络进行通信的东西,或者必须导航文件系统的东西,或者诸如此类的东西,那么我就依赖于特定于系统的工具,不能在不同的平台上重建代码。

lokaqttq

lokaqttq3#

不同的编译器和jvm不是在做同样的事情,实现平台独立性吗。
jvm本身就是平台。无论是arm/amd64/,它都是抽象的。。。
c/c++正在编译。它只能在为其编译的处理器(系列)上运行。你不能把一个二进制作为mips,然后在arm上执行它。
比较一下:

[C(++)]
  |
  v
[Processor]

[Java (Classfiles)]
     |
     v
   [JVM] #Abstraction layer
     |
     v
[Processor]
yks3o0rb

yks3o0rb4#

语言本身并不依赖于平台。为jvm同时编译c和c是可能的,但这样做并不常见。为jvm编译c
同样,可以为特定的目标而不是jvm编译java。将java源代码编译为本机exe
但是java和jvm都是为协同工作而设计的,所以这种组合使用起来非常自然。
c的设计非常接近硬件。如果您的目标是jvm,那么实际上没有理由使用c。然后改用java。
理论上,您可以为任何目标编译任何语言,只要目标是图灵完备的。
旁注:不要写“c/c++”。他们是完全不同的语言。

6za6bjd0

6za6bjd05#

c++语言本身不承担任何特定的平台,因此在这个意义上它是独立于平台的。

dm7nw8vv

dm7nw8vv6#

jvm在独立平台中的作用是充当虚拟处理器。当我们使用c/c++进行编译时,不同的处理器将源代码转换成不同的二进制模式,这就是为什么没有平台无关的。

相关问题