Kaffe, 任何人?都能实现一个Java虚拟机 -1
by Michael Barr and Jason Steinhorn
中文翻译:[email protected]
由于时间和水平等因素,其中的翻译难免有误
欢迎各位指正和与我交流。
原地址:http://www.embedded.com/98/9802fe.htm
如果说,在目前最近的一些嵌入式系统大会上,和Java相关的讲座和流行,算是一个暗示的话,相当多的嵌入式程序员正在考虑,采用这个流行的新语言,作为其编程语言。但是,你可能回想,在嵌入式环境中运行Java程序,不是一件简单的事情。这篇文章,给你些如何开始的一些启示。
如果你想要在嵌入式系统中执行Java程序,你必须将Java run-time Environment集成到你的软件中。虽然一些商业run-time environment已经开始发售或者已经有beta版发行了,但是一个不是很贵的,更加很容易获得的选择就是开源免费的Kaffe 虚拟机。这篇文章中,我们将讨论Kaffe对硬件和操作系统的要求和如何将Kaffe移植到一个嵌入式平台中所要做的一些工作。与此同时,我们也还会讨论在商业Java运行环境中,你需要什么,注意什么,而你应当遵守那些注意事项。
就像你已经知道的那样,Java是一个很容易使用,针对平台无关和避免程序的常见错误而设计的,面向对象的编程语言。这些和其他一些特性,会使你觉得在用Java编程的时候,完全只是一种快乐和享受。但是实现所要支持Java运行时的这些特性,而在背后做的努力和工作,可是比实现传统的高级语言,如C,甚至C++,所做的工作,都要多得多。
Java是一个解释型的语言,这也就等同于运行时编译循环,必须执行在目标处理器上。
其他一些特性,要求大量的运行时刻的支持,如垃圾回收器,动态链接和异常处理。
Java Usage Models
当前来说,对于用Java实现整个嵌入式软件项目,是一件不现实的事情。首先,Java不支持一种机制,可以直接访问存储器或硬件寄存器。所以,他们总是需要一个设备驱和其他一些用C/C++或汇编所实现的代码。这些其他的程序,我们可以从Java中调用他们(此种情况,我们称其为本地方法)或者其与Java run-time environment 并行,作为单独的线程运行,
在为你的系统准备Java之前,想想你写的Java程序,在你的整体架构中处于什么地位,是很有必要的。嵌入式系统中,已经有很多Java使用模型被提出来了,但是总的来说,
可以根据这两点:
1. Java中的bytecode存放在什么地方
2. Bytecode是在何种处理器上执行的
来划分目前的在嵌入式中的Java,可以如下分类:
1. 没有Java
2. 嵌入式Web服务器Java
3. 嵌入式Applet Java
4. 应用程序Java
https://www.crifan.com/files/pic/serial_story/other_site/i_cmpnet_9802fe1.gif
Four Java Usage Models for Embedded Systems.
例如,没有Java,的那个分类,包括了所有的方案,其中,所有的bytecodes都是存储并执行于宿主机(host computer)上,尽管使用了Java,但是实际上,并没有在嵌入式系统中使用。
在嵌入式Web服务器使用模型中,Java字节码是存储在目标系统中的,通常是Flash存储器或ROM,但是执行却是在宿主机上的。这个模型,对于那些需要图形接口,带有网络的嵌入式系统比较有用。在宿主机上运行的,Java驱动的web浏览器执行那些,从嵌入式系统中上传过来的一组Java字节码。除了Java字节码,在此方案中的嵌入式系统,必须存储遗少一个HTML文件,并执行一些软件,叫做嵌入式Web服务器。然而,因为Java没有实际运行在嵌入式系统中,所以,实际上,该嵌入式系统中,就不需要Java Run-time Environment
了.
第三种和第四种使用模式,是此文章最感兴趣的。这些模型中,Java字节码实际是运行在嵌入式中的,因此需要Java运行环境。在嵌入式Applet方案中,Java字节码存储在宿主机中,通过网络,被发送到嵌入式系统中。嵌入式系统执行该字节码,并且把结果送回宿主机。嵌入式applets,用于实现网络管理功能,(如,作为SNMP的替代),,或者是用于多个处理器之间的负载平衡。
在应用程序模型,Java包括了一些或所有的实际的嵌入式软件。Java字节码存储在非易失存储器设备,通过java 运行环境执行,就像本地机器,自己去获取和执行代码一样。这种Java用法,非常像目前C和C++在嵌入式系统中使用的一样,他们用于实现很大一批的整个软件系统。然而,因为Java缺少能力去直接访问硬件,他可能仍然需要依赖本地yongC或C++写的方法。这和C程序员使用湖边语言去执行处理器相关的任务不太一样。
Java Run-time Environments
在嵌入式中,一个典型的Java Run-time Environment一般包含如下部分:
1. 一个Java虚拟机,将Java平台相关的bytecode,翻译为目标处理器所能运行的本地机器代码,并且执行动态类载入。这些功能的集合,以interpreter (解释器)或者just-in-time编译器(JIT编译器)的形式出现。这两者的唯一实际区别就在于,bytecode被执行的速度:JIT编译器比较快,因为其避免了多于的重复解释那些之前已经解释过的代码段。
2. 第二个部分就是一个,以bytecode形式存在的,标准的Java类库。如果你的程序没有引用任何其中的类,那么这个类库也不是必须要的。不过,因为实际多数情况都会用到这些类,所以,绝大多数的Java Run-time Environment设计的时候,也都遵从于一个Sun的标准API,如PersonalJava或EmbeddedJava。
3. 同样,还有一些类库或者虚拟机所需要的本地方法。这些方法,是事先用其他语言写好的,预编译,链接到虚拟机里的。他们主要用来执行一些和处理器相关的或者是在Java中不能直接实现一些功能。
4. 多任务操作系统为Java的线程和线程同步机制,提供了底层实现。
5. 垃圾回收线程也是需要的。垃圾回收周期性地运行。当动态内存池不能满足内存申请时,或是回收那些已被分配但是不再被程序使用的内存。
这些部分和目前嵌入式系统中其他的软件和硬件的之间的关系,如下图所示(其中虚线范围内的是Java运行环境):
Components of a typical Java Run-time Environment
转载请注明:在路上 » Kaffe, 任何人?都能实现一个Java虚拟机 -1