理解Java的跨平台性,欢迎拍砖

wargrey 2008-10-12 04:49:09
英语是国际通用语言,但是我说的英语美国人就听不懂

很多人因为用了“跨平台的语言"写没有写的出跨平台的程序而盲目的认为该语言的跨平台性是子虚乌有。
本文以Java为例就来讨论一下”如何理解语言的跨平台性“。

从开发人员或编程语言的角度来理解,”平台“就是指语言的运行时环境,比如Java的平台就是JRE(Java Runtime Environment)。是不是觉得很奇怪,难道平台不是指Windows、Linux这样的操作系统吗?没错,Windows和Linux也确实是平台,但是这个平台对于Java来说太宽泛了,就象从来没有人说Java的平台是i386、arm一样。简单理解就是光有操作系统是无法运行Java程序的。而JVM则包含在JRE里。

如果某个语言对应的可执行体能够不作修改或者只做少量修改就能在其他平台运行,那么这个语言就是跨平台的。是的,允许做少量修改,但是这个过程一般是在程序员不知道的情况下进行的,通常这个任务由平台来完成。但是不管怎么说,这只跟可执行体有关,而不是源码。

对于一段Java程序,要让它可以执行,得至少经过两个步骤,第一步,用Java编译器将源码编译成字节码;第二步,用Java解释器执行字节码。可见可见,Java程序并非像C程序那样直接执行,而是要有个启动器,也就是所谓的JVM(Java Virtual Machine)来加载并执行。由此可见,Java跨平台的两个重要因素是:
1.有个能产生符合Java规范的字节码的编译器;
2.有个能解释上述符合Java规范的字节码的解释器。
换句话说,在任何操作系统上,只要存在JRE,就可以运行Java可执行体,而无所谓它来源于何处,只要”符合Java规范“就行。哈哈,到这里是不是有点乱,上面不是说Java的平台是JRE吗?难道JRE在不同的操作系统平台上还会变?是的,正是因为上述Java工具集是随操作系统的不同而不同的,我们才一再强调”符合Java规范的字节码“。因为Java编译器和Java解释器等一系列的工具集本身是依赖于操作系统的,只不过它们的输入和输出都符合统一的Java规范。如果上述两个条件换了其中任何一个,则很有可能使得Java不再跨平台。

除了以上两点,还有第三个因素,Java针对平台设计的库,也就是所谓的Jar包,这些jar包虽然大部分都是Java编写的,但是还是有不少地方是针对平台独特设计的,比如不同操作系统之间路径的表示,从这个角度讲,平台移植后的Java字节码已经被解释器改变了。

误区一:Java语言是跨平台的,所以Java程序也是跨平台的
”Java 语言“和”Java程序“并非同一个概念,Java语言实际上只是一系列的规范,该规范为程序员规定了Java的语法和语义规则。Java程序则是根据这些规范产生的可执行体。通常情况下,程序的需求或多或少都会关系到一些操作系统之间的差异,比如,Windws的文件系统是多根的,Unix的文件系统则是单根的;再比如,Java连接数据库的程序中,用到了与平台相关的ODBC,此时当程序拿到其他平台上去难免会出错。前面说了,Java工具集是依赖于操作系统的,也就是说它们不能改变操作系统之间的差异,这就是JNI(Java Native Invoke)存在的原因之一。当一个程序使用了某个操作系统的特性并且移植后的操作系统没有此特性时,虽然它们能被该平台执行,但是还是会运行出错。

误区二:Java语言是跨平台的,所以Java程序是跨Java工具集的
从上面的说明可以看出,Java语言跨平台的本质是因为Java工具集遵循同一套规范。规范是个抽象的概念,那自然需要对应着一种实现,目前常见的有三种实现,即Sun的官方实现;IBM的实现;GNU的实现。很有可能一套工具集对应与一套实现,使得不同实现之间并不通用,况且,每套实现在满足规范后还可能增加自己的特性,比如,GNU可以直接将java源码、字节码、jar包等编译成本地可执行体。当然它们对源码规范的实现都是一样的,但是也并不保证这些实现一定不会出现不同。因此对于给定的一套工具集,Java语言才是跨平台的,其他工具集则允许不是。

误区三:Java语言是跨平台的,所以Java程序是跨Java应用服务器的
在一套给定的工具集上,Java应用服务器做为JavaEE的容器,从本质上来说是JavaEE规范的实现,这样结合误区二就很容易理解了。不过还是要说一点,误区三其实根本就不该有,因为原因和结果本就不是一个层次的东西。

误区四:欢迎大家补充。

...全文
440 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
yy2004005 2008-10-29
  • 打赏
  • 举报
回复
拍死你~~~
dlmeijianyu 2008-10-12
  • 打赏
  • 举报
回复
学习了.收获不少.
cuidenghong123 2008-10-12
  • 打赏
  • 举报
回复
学习!
xujiaxiang 2008-10-12
  • 打赏
  • 举报
回复
看得头晕~!~
wargrey 2008-10-12
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 preferme 的回复:]
程序的跨平台性,与,程序的可移植性,是两个不同的概念,不要混淆。
否则,那个号称:“一次编码,处处运行”的口号,就是说给外行人了。

想要跨平台,外面都流行WebServices技术,用它不是很easy的事情?
[/Quote]

谢谢你关于“移植”和“跨平台”的提醒

不过我说得是跨平台这种特性,而不是跨平台这个目的
冰思雨 2008-10-12
  • 打赏
  • 举报
回复
程序的跨平台性,与,程序的可移植性,是两个不同的概念,不要混淆。
否则,那个号称:“一次编码,处处运行”的口号,就是说给外行人了。

想要跨平台,外面都流行WebServices技术,用它不是很easy的事情?
loaferwang 2008-10-12
  • 打赏
  • 举报
回复
还可以呀,发表自己的认识也不错呀
wargrey 2008-10-12
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 cydp007 的回复:]

jdk 不只有 sun 有. ibm 也有..bea(现 oracle)也有.  事实证明.  sun  jdk下编译的程序..有些在ibm jdk下是不能正常运行的.


[/Quote]

关于误区二,最早的原因就是这个。
我说得工具集就是针对不通厂商的实现来说的,而不是netbeans或eclipse这样的开发前端。

我发贴不优先考虑出名,不过如果有幸歪打正着不会忘记cydp007和其他朋友的。
cydp007 2008-10-12
  • 打赏
  • 举报
回复
我还缺少 艰涩难懂的 满眼 左右移. 数组一大堆. +-满屏幕的高技术含量帖子.


淡定...淡定.


等5个裤衩了 一定 积淀出点东西来..
ZangXT 2008-10-12
  • 打赏
  • 举报
回复
去发个成名帖出来?呵呵
cydp007 2008-10-12
  • 打赏
  • 举报
回复
我这个 算不算 不能跨平台的原因..楼主可以给我加上..

然后楼主如果因为这篇文章出名了. 把我名字捎带上..哈哈.


出名要趁早啊.
ZangXT 2008-10-12
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 cydp007 的回复:]
jdk 不只有 sun 有. ibm 也有..bea(现 oracle)也有. 事实证明. sun jdk下编译的程序..有些在ibm jdk下是不能正常运行的.
[/Quote]
这个问题基本不用太担心吧,使用一般是配套着来,呵呵.
cydp007 2008-10-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wargrey 的回复:]
引用 2 楼 justinavril 的回复:
关于第一点,我补充下,就是当一个Java程序在一台机器上能够运行的时候,在另外一台机器上能否正确运行的关键是JDK的配置是否正确。


谢谢
[/Quote]

小猴子这个我必须要反驳了.


jdk 不只有 sun 有. ibm 也有..bea(现 oracle)也有. 事实证明. sun jdk下编译的程序..有些在ibm jdk下是不能正常运行的.

wargrey 2008-10-12
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 ZangXT 的回复:]
引用 12 楼 wargrey 的回复:
你也用linux和solaris吗,希望能多交流交流

偶尔用用,开发平台.
主要还是使用Windows,喜欢Windows.
[/Quote]

呵呵,那也无妨
mengweilil 2008-10-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wargrey 的回复:]
引用 1 楼 mengweilil 的回复:
1、有些java程序是跨平台的,比如当初我搞得应用服务器,当然要有.bat和.sh文件来运行,其他的jar、war当然跨平台。如果你用到了平台相关的东西,比如odbc,然后指望跨平台?当然是笑话。但是用jdbc,跨平台不成问题吧?

2、没人会有这个误区,谁都知道Eclipse的project很难在NB当中打开——除非刚出来的没经验的菜鸟。至于其他工具集和java有毛关系?比如java2exe?

3、更是瞎扯,哪个菜鸟…
[/Quote]

嗯,我不仅知道windows,还知道xp和me呢。。。。。。。

ZangXT 2008-10-12
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wargrey 的回复:]
你也用linux和solaris吗,希望能多交流交流
[/Quote]
偶尔用用,开发平台.
主要还是使用Windows,喜欢Windows.
wargrey 2008-10-12
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ZangXT 的回复:]
引用 10 楼 wargrey 的回复:
上面的说法可能会很啰嗦,因为java开源后确实不止只有sun的工具集

还有jRocket呢.
我感觉GCJ基本不用考虑.
[/Quote]

我喜欢linux,从应用层角度讲,java的跨平台确实很不错,不过在unix环境里,java也是一个很重要的系统语言,就象perl、python的地位一样
wargrey 2008-10-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ZangXT 的回复:]
引用 8 楼 wargrey 的回复:
引用 5 楼 ZangXT 的回复:
感觉越看越乱。


比如呢

因为我比较笨,从来不深入考虑一些东西,没啥比如,呵呵。
[/Quote]

其实感觉你蛮厉害的

你也用linux和solaris吗,希望能多交流交流
ZangXT 2008-10-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wargrey 的回复:]
上面的说法可能会很啰嗦,因为java开源后确实不止只有sun的工具集
[/Quote]
还有jRocket呢.
我感觉GCJ基本不用考虑.
wargrey 2008-10-12
  • 打赏
  • 举报
回复
上面的说法可能会很啰嗦,因为java开源后确实不止只有sun的工具集
加载更多回复(9)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧