程序员写的代码通常需要编译,只有编译后,才可生成目标机器上可执行的二进制代码,因此,编译器是否支持64-bit也制约着程序的运行。
比如,在“64-bit”的Linux系统上,执行如下命令,如果可以看到类似“Reading specs from /usr/lib64/gcc/x86_64-unknown-linux-gnu/3.4.3/specs”的字样,这表明该机器上的gcc编译器支持把程序编译为“64-bit”的应用程序。
work@root: > gcc -v
Reading specs from /usr/lib64/gcc/x86_64-unknown-linux-gnu/3.4.3/specs
Configured with: ../gcc-3.4.3/configure --prefix=/usr --libdir=/usr/lib64 --libexecdir=/usr/lib64/ --sysconfdir=/etc --mandir=/usr/share/man --infodir=/usr/share/info --enable-nls --enable-languages=c,c++,objc,f77,ada,treelang --enable-threads=posix --enable-__cxa_atexit --enable-c99 --enable-long-long --enable-clocale=gnu --enable-shared
Thread model: posix
gcc version 3.4.3 (LINX)
再比如,在Windows系统下,Visual Studio 2005开始支持编译程序为“32-bit”还是“64-bit”。Visual Studio 提供了选择组件的 64 位版本以及特定于 64 位开发的工具,包括:64 位 .NET Framework,64 位 Visual C++ 工具,以及 64 位运行库 .dll,例如 msvcr80.dll、msvcm80.dll 和 msvcp80.dll等等。
有了这些支持,应用程序才可以编译为“64-bit”的本地应用代码。
任何一个操作系统,都为用户提供了大量的系统库供调用,这些库作用不一,但作用巨大。典型的如各种动态库(dll、so等)。
但是,不是所有的动态库都可以在类型相同的操作系统下运行,这也需要区分环境。以Windows为例,“32-bit”的dll就不可以在“64-bit”环境下运行[1],“64-bit”的dll也不可以在“32-bit”环境下运行。
听说过Java的朋友都知道,Java有个特性名叫“跨平台”,笔者久闻“平台”一词,却颇为不解,什么叫“平台”?谁可以是“平台”?
Java有个虚拟机的概念,虚拟机又是什么?虚拟机与平台有关系吗?
思付良久,才豁然明白,平台就是一个平整的台面,关键是台面上可以放各种各样的东西。
抽象之后,平台就不再必须是平整的台面了,只要是一个可为他人提供方便服务的场所、媒介、容器等,就可以称之为“平台”。
所以,计算机硬件是不同操作系统运行的平台,操作系统是各应用软件的平台;各应用软件是不同业务实现的平台;Java虚拟机是Java字节码的平台;数据库是数据存放、使用的平台。
说了半天“平台”,这和“64-bit”又有什么关系呢?
Java虚拟机既然是Java字节码的平台,那么“几乎可以认为”[2]Java代码的运行,就是基于虚拟机的,和操作系统以及硬件无关。
而每一种语言都提供了若干数据类型,这是表示数据的基本形式。象Java这样的语言,提供了“short、int、long”等数据类型,这些基本类型,其长度是固定的,不因操作系统、不因“64-bit”的JDK或“32-bit”的JDK而变化,这就为使用Java开发应用程序提供了一种稳定的保障,不会因字节码之下的“平台”不同而致使涉及数字的应用发生变化。故此,Java虚拟机就是一种平台。这个平台屏蔽了“64-bit”和“32-bit”的差异。
但是,Java虚拟机作为一个平台,又是运行在操作系统之上的,而操作系统没有屏蔽“64-bit”和“32-bit”的差异,在操作系统之上运行的软件需要识别“64-bit”和“32-bit”的差异,所以,Java虚拟机自身就分解出了“64-bit”和“32-bit”等不同版本的JDK。
例如:在64-bit的机器上执行64-bit的JDK命令
java –version
可以得出如下输出:
java version "1.6.0_07"
Java(TM) SE Runtime Environment (build 1.6.0_07-b06)
Java HotSpot(TM) 64-Bit Server VM (build 10.0-b23, mixed mode)
[1] 但可以在WOW64下运行,因为WOW64本身是一个支持“32-bit”应用的服务环境。
[2] 不能“完全认为”是因为Java中存在JNI等本地技术,允许用户可直接调用操作系统的API。