这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » JAVA能扮演嵌入式开发的主角吗?

共3条 1/1 1 跳转至

JAVA能扮演嵌入式开发的主角吗?

菜鸟
2007-11-29 13:13:05     打赏

Java自从推出以来一直备受关注,不过在嵌入式系统设计师看来,其性能并不能令人满意。运行Java虚拟机(JVM)解释Java字节码,这种方式对大多数嵌入式应用来说占用空间过多,运行速度过慢。不过Sun的Java 2 Micro Edition(J2ME)改变了这种状况。

    对嵌入式系统设计师来说,Java有许多优点。作为一门编程语言,Java允许面向对象编程,又没有C中存在的严重问题。Java运行时环境还提供了有用属性。Java提供的内存管理功能使得编程人员不必分配及释放内存。运行时环境甚至可以通过整合核心类库来简化程序分配。 但大多数嵌入式应用面临Java没有处理好的两大约束:没有足够的空间和时间。

    那么,Java作为一种在C++基础上改进了的面向对象的语言,在嵌入式应用开发方面能挑大梁吗?能否为它自己撑起一片蔚蓝的天空呢?

    一、为什么会是Java?

    对于嵌入式系统来说,Java技术比C语言和汇编语言具有很明显的优越性。最显著的特点是减少了系统的开发和维护,增强了代码的重利用能力,提高了Java代码与系统原有代码的可整合性。

    1. 提高开发效率和可维护性

    在项目的整个生命周期中,Java环境大大的简化了开发和维护。由于目标环境是建立在一个虚拟机上,代码可以很容易的编写、调试、分析、更改、维护。加上将来要连接的外接设备,未来的系统可能比目前的嵌入式系统复杂很多。升级手册也许不会在整个项目的生命周期中都能起到作用。取而代之的是,硬件设备的可连接性使得能够远程管理模块,这样就保证了开发人员能在产品上增加新的性能,同时解决了在产品生产后软件升级和维护的问题。

    2. 重复利用代码

    由于嵌入式系统有特殊的需求,以及不同的专门硬件要协同工作,嵌入式软件开发者通常使用非常原始的方法来开发,有时每一个新的项目都要从头再来一遍。现在,随着嵌入式技术的成熟以及系统本身变得更大更优化,很多人开始对于把一个产品的模块甚至是全部的应用程序用到另一个产品感兴趣。这种可重新利用性使得"一次开发,多次利用"成为了可能。

    Java环境使得一个模块可以只要做很少的工作就可以适应多个项目和平台。甚至包括有时客户需要一个新的目标板,或者采用新的硬件(CPU或外设)和软件,或者使用不同的Linux都可以进行移植。

    3. 集成Java代码和源代码

    使用源代码明显是指应用程序的多可用性以及代码的重利用能力。在Java应用中,一个设计很好的界面,或者虚拟机,或者是底层的硬件都可以很好的兼容到嵌入式系统中。尽管无法移植,对于很多功能和硬件界面来说,在本地环境下开发的代码也许仍然是最好的解决方案。在C、C++或者汇编语言中,加入标准的通信、接口模块、用户界面、安全特性会花费很多时间与金钱。与之相比较,Java的基本库本身就提供了这些东西甚至还更多,这样就可以加速开发。

    二、Java碎片真的会有影响吗?

    在使用JavaME CLDC进行移动电话开发时,人们经常会碰到碎片这个词。Java强调“一次开发,多次利用”,但碎片出现,却打破了这种传奇。于是,这就导致应用开发人员不得不在许多不同的设备进行应用程序的测试,甚至于不得不在应用程序中对某些特殊的设备进行一步客户化的工作。

    对程序开发人员来说,碎片真是个恶梦,因为碎片平白无故的增添了代码量和测试工作量。当然,对移动电话持有者来说也不是什么好事,因为碎片消耗了设备的空间。不管怎么说,碎片对每个人来说都是件很讨厌的事情。

    但对于嵌入开发者而,碎片又意味着什么呢?

    首先来看看碎片产生的根源。移动电话行业标准本来给不同的产品预留了一定的自由空间,这初衷是好的。但事实上,这种预留的空间,却导致了不同产品之间的冲突,不能进行很好的兼容。这就是碎片产生的最根本原因。于是这种不兼容性进而升级到了Java实现的程序里。这正是Java想花大力气创建一个统一Java实现的原因所在,如JSR248,MSA(Mobile Service Architecture)的建立。

    从嵌入式开发人员的角度来看,也许并没有这么糟糕。其实碎片并不会影响到嵌入式开发人员,因为已经可以确定设备之间的硬件是完全兼容的。如果使用的是原始语言像C/C++的话,嵌入式开发人员可以在任何地方来编写代码,并在不同的设备上进行代码的重用。

三、 Java平台的测试

    如果采用Java来实现嵌入式设备开发,会不会碰到C/C++经常碰到的测试成本太高的难题呢?

    当然,采用Java来开发的话,可以对软件进行多次的重复测试,尽管这不一定是必需的。而完全需要进行重复测试的只是那些新加的Java实现。如果是Java平台的合法用户的话,还可以使用Sun提供的TCK来进行程序兼容性的检测。如果付费的话,还有很多压力测试可供选择。只要能保证Java平台的正常运行并按Java的测试通过了的话,那么所开发的程序其可移植性是完全可以保证的。

    当然,在此有必须有提醒一下只测试Java实现端口的开发人员。因为有一些端口的实现有可能是采用C/C++来编写的,这些必须测试。可以使用全新设备来对整个程序进行测试以达到这一目的。

    1. 测试工具包

    通过采用Java来进行编程,可以确保平台的APIs是否正确的工作。如果采用C/C++或直接对操作系统编程,则使用全新的设备时,无法保证APIs的正常性。由于这些问题取决于所采用的测试包的全面性和可靠性,因此,在开发阶段有可能发现不了它们,而在部署的阶段发现了它们时,问题已经扩散得超出控制范围了。而对于Java平台的测试,一般比较全面。所以,C/C++或直接对操作系统编程的问题能比较早的被发现并解决。

    因此,采用Java平台时,其测试时间有可能跟使用C/C++来开发整个程序的时间差不多。但结果大大不同,使用Java平台时,其最差的测试效果往往可以与C/C++环境下最好的测试效果媲美。就测试的选择而言,采用Java平台时,可以使用Sun的TCK来确保程序对新设备的适用性,同时,还可以得到Java的其它测试包,不过是收费的。然而使用C/C++时,则只能依靠开发人员自己来保证程序对新设备的适应性了。

    2. 端口兼容性

    那么如何知道设备所依赖的操作系统端口是兼容的呢?没法知道,因为操作系统供应商通过没有测试它。除非所使用的设备是标准的硬件,没有进行任何的客户化工作,或是可以让操作系统提供商对这特殊的端口进行单独的测试。相样,采用Java平台时,这又是怎么的结果呢?可喜的是,由于Java平台的TCK已经做了这样的工作,因此,这可以更好的提高其兼容性。

    总之,采用Java平台所需的测试,最差的情况也就跟采用原始语言(C/C++)一样,但大部分情况下,都优于后者。而且,更具有兼容性的保证。

    四、Java很占内存吗?

    使用Java平台进行嵌入式设备开发时,其对内在的使用量,会不会比使用原始语言如C/C++更大些呢?这取决于软件的复杂性。Java由于虚拟机和内库的原因,有可能会导致内存开销的增大。下面比较一下Java平台内存的占用情况(基于Sun的实现):

    CLDC(Connected Limited Device Configuration,运算功能有限、电力有限的嵌入式装置,如PDA 、手机等):可工作于100K(RAM),JIT(Just In Time,即时编译技术)需要最大些。典型的部署要求500K-16M(RAM)。

    CDC(Connected Device Configuration,运算能力相对较佳、并请在电力供应上相对比较充足的嵌入式装置,如冷气机、电冰箱等):VM约为250K,JIT小于300K,VM+JIT+基础类库约占2-2.5M.典型的部署要求:4M-32M.

    当然,内存的占用量还取决于应用的大小及内在的使用情况。可以看出,其实Java平台不会占用太大的内存。但是,这只是问题的一半。另一半是,Java代码最后部署时是以类文件来部署的,它主要是包括字节码和元数据。通过对CVM数据的分析,可以看出,字节码占据着大概30%的数据量。而采用JIT编译的代码相对于字节码而言,可以发现,内存的占有量增加了,并有一个7-8倍的ARM指令集。由于,可以估计:

    Java类转成字节码的速度≈1/30%≈3.3x;

    原始语言转成字节码的速度≈7x.这意味着,Java代码的内存使用量约为原始语言代码的一半。当然这只是非常粗略的估算,但却是合理的估算。

    使用Java的JIT后,只有那些使用频率高的代码才会被编译。而在系统中只是偶然被执行的代码则采用解释来编译。同时,JIT尽量使被编译的代码其内存占有量保持在一较小的范围内。对CVM(CDC所使用虚拟机),默认值为512K.而在一些较优秀的程序中,可以发现,其值为100K-300K.这也就是说,使用Java编写的程序,只有使用频率比较高的代码才导致内存占用的增加。相反,使用C/C++编写的程序,整个代码都需要进行编译。因此,不能说使用Java语言编写的程序占用的内存就会比使用C/C++编写的程序大。这决定于软件相对于平台代码的复杂度及大小。如果软件规模比较大,Java平台所消耗的内存远小于Java类文件简洁性节约的内存,这种情况下,使用Java平台将有利于节约内存。如果软件的规模比较小,则Java平台消耗的内存就比较明显了,可以考虑使用C/C++来开发,以节约内存。

    五、  结论

    Java语言最初的设计企图是想用于控制消费性电子产品,本为嵌入式设备而设计,但随着因特网的兴起,Java在台式机和服务器端的应用开发中取得了巨大的成功。Java在应用中充分展示其通用性与完全性等优势,而这在嵌入式设备的应用开发中是至关重要的,这使得Java重返嵌入式应用开发领域成为必然。STK Java卡和J2ME的成功应用昭示着Java在嵌入式系统应用开发中的美好前景。




关键词: 扮演     嵌入式     开发     主角     系统     内存     程序     代码         

菜鸟
2007-11-29 13:14:51     打赏
2楼

个人认为JAVA的前景非常好~
两年前,在中关村如果你懂JAVA就能拿7K了!
不知道有多少正在用JAVA搞嵌入式系统开发的那?


菜鸟
2007-12-03 10:10:44     打赏
3楼
Java用于嵌入式系统的十大优点和五个局限
 
Java语言的优点在于:它最初是由理解和信奉网络计算梦想的一个小巧而专注的开发组设计的,虽然该语言最初的实施方案有点缺陷,但为了这个梦想,他们很少在技术上妥协,结果诞生了一种专为以相互通信为主要目 
的的设备而设计的语言。有许多技术上的优点都可能会引导嵌入系统开发者选择Java。

1.与处理器无关

Java的第一个优点就是与处理器无关,这个优点似乎与嵌入式系统没什么相干。传统上,嵌入程序就是针对特定的微处理器设计并在其上运行的,而C语言程序的可移植性则可通过编译或交叉编译来保障。

但是在Sun公司的模型中,一个程序可能是存储在一个系统上,而被下载并运行在另一个完全不同的系统上;设备可能从不同地方下载一些程序来在一个处理器上运行,或者不同的处理器运行一个程序,通过网络在相互间传递数据。使用Java,一个嵌入式系统就可能成为一个通用的通信设备,能下载并运行能完成特定任务的程序。

对嵌入式系统,这是一个新的模型,已经有一些开发者正在向它靠拢。例如,电视机顶盒的供应商已宣布并入JVM,以使用户能通过Java Applets在他们观看电视的同时接收到的支持该电视节目的一些内容。这样你在观看足球比赛时,看到的支持内容就可以是对球员的技术统计,若你在看电影,看到的支持内容就可以是演员的背景资料。JVM还被移植到移动电话中,这样用户可接收股票报价信息、比赛分数及其他即时信息。

这是一个恰当的设计和实施模型,首先它可以使开发平台的选择更加灵活,无需在与目标相同的平台上开发,也不用关心交叉编译的问题,因为Java字节码能在任何有JVM的操作系统中运行。其次,这种模型带来的另一个优点是几乎所有的检测和调试可以独立于目标设备来进行。但是,一些数据输入和硬件交互要求在目标(或是很好的仿真系统)上测试。由于个别JVM有时有兼容性的问题,你应该在所有将用到该程序的平台上测试它。但一般来说,你并不要高级而昂贵的、配备有逻辑探针、ICE以及其它调试工具的、针对目标平台的开发环境。

2.面向对象提高开发速度和可维护性

Java是一种纯粹面向对象的语言。所有代码和数据都是某个类的一部分,没有全局变量或是独立于类存在的代码,一个对象是一个类的实例,对象是通过调用操作方法,或者说函数来操作的,而这些方法或函数也是类的一部分,对象的方法就对象的数据进行操作。Java类被组织成一个等级层次,在层次结构中,一个子类能够继承其超类的行为,并可用子类所具备的一些特有功能来扩展其超类的功能。对象模型是你能定义对应真实事物的数据结构,使得程序的任务和任务如何实现者二者之间的转换变得基本上透明。

Java类层次有六个主要的类(共有二十三个类)成为类包(packages)。要应用任何包中的任何对象,你只需要申明那个包。你也拥有类层次中的全继承性,任何层次深部的对象都可取用层次中较高处定义的所有方法。

面向对象的设计和编程的优点在于其开发速度和代码的可维护性,许多面向对象的开发都能通过利用和更改现存类库来完成,而不是创造一个新的结构。这就使开发加快了,Sun’s Java Workshop(一个完全用Java写的IDE)的开发者能在几个月内建立一个功能齐备的图形IDE就是一个很好的证据。面向对象的方法还尽量使用自然的结构,使其有很高的可读性,且可轻易更改和加强。

3.安全高

由于有了JVM,一个Java应用程序与操作系统或硬件完全隔绝,因此计算机病毒或其他作祟的代码就很难获得对设备的控制。虚拟机是主机设备和那些可能难以确定其质量和可靠性的软件之间的一个保护层。

另外,Java设计者从该语言中去掉了指针变量的概念。Java不能任意访问内存,只能读写有Java内存分配管理系统创建的对象。由于Java编译器所强制的严格的分类机制,从理论上来说,访问那些未分配给程序的内存区域是不可能的。这个限制使得要写恶意代码的程序变得非常困难了。当然,这个保护并不完善,有人已经在Java安全模型中找到漏洞,其中一些被Sun公司处理掉了。一些有天分但肆无忌惮的编程人员可能会写些程序,有意但不直接地更改内存的内容,或从主机获取密码或其他信息。但是,JVM确实提供了一定的保护,使得几乎不可能直接在硬件上运行代码。

对Java applet施加的限制就更加严格了。由于Java applet被设计成从Internet上下载,因而被视为不可信任的代码,除非它包括你已认定为可信任的主机的数字指纹。JVM在内存的一个称之为sandbox的区域运行诸如applet这种不可信任的代码。它给每个applet分配资源和特权,并将其限定在这些分配区域范围中。除了这些限制,sandbox模型还施加如下限制:禁止读写当地计算机文件系统;网络操作被限止,禁止不被信任的代码建立与任何计算机的网络连接,从其下载的那台计算机除外,它也不能在任何小于1024的端口号(为标准网络协议使用那些著名的端口所保留的端口范围)上监听和接受连接;在运行不被信任代码的线程组以外,禁止访问或创建线程。

4.内存管理简单

Java的内存管理远比其他语言简单,因为它不使用指针。当对象被实例化时,内存被动态分配。正如我们前面分析的,对个别内存地址的访问被Java的设计者视为一个对安全的潜在危险,因此,访问也被禁止。而且,Sun的网络模型已假定你也许不知道目标处理器,而引用专用内存地址变得没有必要。去掉指针的结果不仅提高了安全性,还简化了编程,错误也减少了。

为了理解Java怎样分配内存,我们来与C语言比较一下。在C语言中,可以用值或引用的方式来访问数据。事实上,出于灵活性和控制考虑,非原始数据类型都由引用方式来存取,即通过指针访问。因此,值和引用的不同变得非常清楚,特别是:因为你不得不使用不同的符号(*和&)来存取数据。要用这两种不同的访问方式,你必须清楚理解它们是什么以及你为什么应该使用这一个,而不使用那一个。

在Java中,由值和引用来存储是无缝的,尤其因为其符号都一样。两者间唯一不同在于数据类型本身:所有原始数据类型始终由值的方式存取;所有对象,包括字串、数组以及文件流,始终由引用方式访问。声明为原始数据变量类型包含该变量的值,声明为对象的变量则包含对该对象(即该对象的地址)的一个引用,而非对象自身的引用。仅仅声明一个对象变量并不给对象分配内存,你必须用“new”关键字来分配内存和创建对象。

这两种方法最根本的不同在于:不可能象在C中那样就Java内存地址做指针算术或其他操作。Java中对象的地址是相对的(或虚拟的),它由虚拟机任意分配,因此你没有理由还想要指针地址。

5.具有垃圾收集功能

垃圾收集自动收集内存中未引用的内存,并将其归回空闲内存链表中。JVM使用此功能将不在使用的内存还给系统。当Java程序说明并实例化一个对象或数组时,它仅仅做一个JVM请求,访问其下面的系统内存(通常是通过主机操作系统)并分配内存,Java的垃圾收集系统通过内存收集对象,然后检查它们的引用链。Java的垃圾收集系统的工作方式一般是搜索内存中的对象,然后检查它们的引用表。它计算程序中有多少变量当前正在引用每个对象。若对象的引用数目为零,它知道此对象不再在使用了,它的内存可以收回。其结果就是,不必像你在C语言所作的那样,要人工来释放分配的内存。在C中,释放内存是一个必要、耗时且易出错的细节。Java自动而精确的处理此过程,去除了C/C++程序中那种常见的错误致因。

6.网络实现方便

由于今天的嵌入式系统通常都是面向网络的,采用内置网络支持的语言节约了在实现网络协议和通信程序方面耗费的大量时间和努力。在Java中,网络类包括TCP/IP流和使用TCP及UDP的数据报程序,用于HTTP和URL服务的操作方法,以及错误检查代码和恢复功能。虽然实现网络也可能用其他语言,比如C语言,但那些语言要求特别的附件软件包、DLL,或其他必须由操作系统,或者第三方销售提供的程序模块,特别附件通常要求有操作系统或第三方工具的知识,不像Java,有标准的、内置的网络支持。Java包括网络包出于必要,因为设计者不能对一个作为基础的操作系统的网络设施做任何假定,他们必须得包括集成网络程序库,以确保Java程序能在所有平台上工作。

7.可以实现动态配置

动态配置是指系统启动时的用户制定配置或重新配置。需载入特殊的硬件配置、网络参数或在引导期间支持特定用途的一些实用程序的系统,常常使用动态配置。Java以动态捆绑来支持动态配置。当你组成一个程序的各个类文件编译成字节码时,在你的类文件之间,或者对JVM包的类(如图形、网络以及核心语言支持)引用,还没有被解决。当JVM载入你的程序时,它动态的载入并捆绑(即链接)你的程序引用的所有的类。因此,要改变系统配置,你所需要做的一切就是修正相应的类文件。下一次系统时,JVM自动捆绑新文件到你的程序中,而新的配置将生效执行。

8.可以轻松诱捕和处理错误

与许多操作系统和程序不同,对嵌入系统而言,重新启动通常是无法接受的,就像我们都不希望打电话或者看电视时突然有技术性的中断一样。这意味着实际上所有嵌入式系统都必须足够坚实以截取错误来防止它们使程序或更糟的是使整个设备崩溃。

程序错误的致因很多。相对来说,很少是因为继承逻辑错误,而大多数程序的崩溃是因为意外输入,或者是因为程序不能调用系统资源来完成某个特定操作造成的。所以,必须能够预料这些问题,并要能够诱捕它们,以免引起更大的问题。虽然,能用几乎任何程序设计语言来诱捕和处理错误,不过如果有内置的设施来做这类工作,比如象Java那样,会有极大的帮助。

在Java中,由抛出(产生)一个异常来提示错误。使用专门为异常处理而设计的语句(关键字try、catch、和finally),程序能将其错误处理代码安排到几个集中区域,try程序块是程序执行的正常流程。当一个异常发生在try块(包括该嵌套块中的各层子程序)中,控制就交给了catch块。不管是否有异常发生,finally块中的代码始终要被执行。未被处理的异常会由调用堆栈自下而上传播JVM并终止程序。不再需要动手编程,来将错误状态通过几层函数调用返回。而是,在错误发生由检测错误的代码直接抛出一个异常。这极大地简化了应用程序中的错误处理代码,进而获得更好地错误处理效果和更坚实可靠的代码。

9.提供对线程管理的直线支持

大多数操作系统都给一个过程产生和管理多个线程的能力,这些线程彼此独立地完成不同的任务。但是,很少由程序语言提供对线程管理的直线支持,通常都需要直接调用操作系统功能。Java却相反,直接在语言提供了产生、管理和协调同步线程地功能。与Java的其他特点一样,该功能是必要的,因为设计者不敢确定底层的操作系统是否支持多线程。

开发者越来越多的在程序中使用线程,将其作为满足一个程序不能完成的,通常相互无关的一些任务的一种手段。由于Java对线程有内置语言支持,以Java创建多线程较之与其它语言更简单、更自然。

10.图形功能强大

JVM包括一个庞大的图形及窗口支持程序包,称为Abstract Windowing Toolkit(AWT)。用AWT,你能在应用程序中快速而轻易地创建精致而强大的图形用户界面。对于需要精细的用户界面的嵌入系统来说,AWT能节省大量开发时间,从而是产品更快的走向市场。
 
Java语言的诸多优点在某些情况下恰恰可能成为其不利于在嵌入式系统中得以广泛应用的绊脚石。因此,还需要不断完善。在这里,笔者结合自己的研究,对某些局限提出一点改进的建议。

 

局限1:性能较低

    由于解释Java字节码比相当的C或C++写的程序运行起来要慢5到10倍,对一些并非受制于CPU的嵌入系统来说,这一性能缺点不是问题,但是更经常的较慢的速度会导致无法接受的应答时间。

解决方案

   有几种可能的解决方案可缓解速度慢的问题。

● 使用更快、更强大的处理器,使系统响应时间缩小到可以接受的范围。不过这个方法将增加每个系统的成本。

● 使用母语Java编译器来获得比较好的性能。但这样做,就放弃了与Java平台无关的优点,好在大多数嵌入系统都只在一种平台上运行。

● 在系统上并入一个JIT编译器,这样Java类装入时就被编译。不过,如果为接纳JIT编译器而不得不增加额外的内存,这个方法也会增加系统成本。另外,若系统各部分是按需求逐渐添加,则应该控制程序装入的时机,以使在装入类进行编译时产生的暂停不会影响系统的响应时间。

局限2:垃圾收集的系统开销过大

   Java中的自动内存分配和垃圾收集性能是很实惠的,但是,从实时系统的角度来看,它的问题恰好就在于它是自动的。当垃圾收集进行时,开发者对系统的控制就受限了。因为,垃圾收集运行时,它冻结了系统其余部分的处理。这是因为它必须要在内存中移动对象,并必须在程序再次运行前,更新所有引用(指向)那些对象的程序变量。垃圾收集需要冻结处理的时间,具体取决于内存量和处理器的速度。很显然,这对硬实时系统是无法接受的,甚至极端时对软实时系统也是成问题的。

解决方案

   垃圾收集以三种方式开启。首先JVM有一个后台垃圾收集线程,此线程倾向于在它一看见系统有空闲就开始垃圾收集,若有事件想要唤醒另一个线程,后台垃圾收集就会被该线程占先,但它不会立刻被占先,它得更新那些已被移动的对象的所有引用后,才能让一个线程运行。其次,若JVM没找到足够内存来满足某个内存分配请求,它将启动一个不会被占先的垃圾收集,在该操作完成之前,系统的其余部分被禁止。最后,一个应用程序能通过调用Systev.gc()方法来启动垃圾收集。所以,如果知道系统暂时不会执行任何时序上关键的任务,就可以启动垃圾收集,避免稍后在更关键时段进行收集。

局限3:JVM的内存开销过大

   前面我们也论述了许多JVM的内置特点,比如图形和网络,它们使得Java程序更快上市。所有这些特点的负面是JVM的内存开销。因为JVM是一个整块(要达到Java的可移植的目的,必须完整的采纳),JVM的内存占用量不能减少。现在的JVM最少需要2MB以上的内存。

解决方案

   如果Java程序也在使用一些消耗内存的功能,由于一个JVM中有那么多的功能,各个Java应用程序就能写得小一点。如果建立的是一个从网络上动态下载并运行多个程序的系统,那么这将是个很大的优点。但Java仍然不具备可配置性和可伸缩性。

局限4:缺乏直接硬件接口能力

   Java缺乏直接同硬件接口的能力。JVM仅仅是一个虚拟的机器,一个对硬件的软件抽象,虚拟机控制与实际硬件的接口,而我们只能和虚拟机打交道。

解决方案

   但这并非是无法逾越的限制,很多C程序使用内嵌汇编来规避性能上的瓶颈,所以Java程序也能使用C来获得对硬件的直接访问。

   让Java和C一起工作有两种方式。首先,可以使用本地方式,它们是用C/C++或另一种语言写的,但当调用时,则装入与JVM同样的内存空间,运行于同样的环境。因为它们被编译成机器码,本地方式运行更快并能直接访问硬件。本地过程与Java代码之间通过套接来彼此交流,就像网络中通信端点使用的套接一样。不过在选择了混合语言方法后,Java的与平台无关和安全特点就没有了。

   另外,可以考虑将前面提到的Java处理器作为软件JVM的解释器部分作为一种硬件实现方案。Java程序能在这些处理器上直接运行并操纵硬件,要注意的是必需加一些特殊目的的指令给这种语言才能直接与处理器一起工作。

局限5:语言尚不够成熟

   从标准的程序设计语言角度来看,Java还很年轻,也很粗糙。如果Java不是由一个小组开发的,也许某些错误和疏忽已经被发现和解决了。在Java亮相以后,它立即被用于比原来预期更多的地方。这一切都意味着Java最初的构思和实现,虽然坚实和有用,但在安全、大小和性能几方面仍感欠缺。

   在其进一步发展中,Sun公司分了三个步骤来促进Java成为一种通用语言和计算机平台。首先,用Java编程实现现存的商业和企业的一些功能活动,诸如电子邮件、日历和字处理程序。其次,把Java提供给企业,使它成为一种编写内部应用程序的方法。最后一步,是为传统嵌入式设备应用,比如为移动电话、机顶盒以及打印机定义Java API以及语言功能。

   由此可见,Java的嵌入式应用是排在Sun公司日程的最后的,Sun公司在继续为这些用途发展此语言,但对这方面的发展次于桌面及企业用途。按Sun公司的优先顺序,很可能还要过一段时间才能解决嵌入式应用中涉及到的一些问题。在此之前,嵌入式系统的编程人员可能不得不迂回、妥协以及使用第三方解决方案。

   Java开发的编程工具也仍在发展之中。有几个厂家提供编译器和开发工具,如Symantec、Microsoft以及Sun公司。Sun不再是JVM和JIT的惟一供应商,其他几个供应商的产品也很有竞争力。Parasoft公司的Jtest软件自动为Java模块生成检测案例,而Numega公司的Jcheck为JVM中的程序行为提供一定的可见性。不过两者都只能处理调试程序中的一小部分,而且都是针对桌面系统开发设计的,虽然它们也能用于嵌入开发过程。

   目前Java仍然没有交叉调试解决方案,即那种传统上被嵌入系统开发者用来处理目标平台上程序的方案,所以很可能必须用C/C++来写程序中针对硬件的部分。不管怎样,开发者最好用一个C/C++交互调试器来调试那些代码,并在目标系统上用弹出对话框,保持记录文件,或其他类技巧来调试Java。(本文作者系上海大学机电工程及自动化学院博士,E-mail:alanltnew@163.com

链接:Java背景

   Java语言最初的设计企图是想用于控制消费性电子产品,比如传呼机,这些都是典型的嵌入设备。Java的设计者企图建立一个简单的、面向对象的、智慧的、已经解译的、强大的、安全的、架构合理的、可移植的、高性能的、多线程的、动态的语言。为使Java对开发者有吸引力,Sun公司融合了类似于C语言的语法和结构。然而不管目标订得如何,Java还是被证明不适合于小型的电子设备,这很大程度上是因为它太大而且速度太慢。应用Java程序所需要的处理能力和内存量,对这类设备来说太昂贵了。

   话又说回来,Sun公司设计Java时最重要的是平台无关及网络集成。一个无须更改就能够在几种不同硬件和软件平台运行的程序,对网络环境(在这种环境中用户希望能够在办公室的任何机器上传、下载和运行程序)来说是一个理想的程序。对想建立通过网络来通信并利用网上资源的分布式程序的开发者来说,一种在任何平台上都有内置的和标准的网络支持的语言是一个大实惠。

   并且幸运的是,在Java发展的最后阶段,对新兴的商业化Internet的兴趣达到了狂热的程度。因此Sun公司便借机鼓吹Java是为Internet设计的。很多人已经把Java视为将使Internet功能更上一层楼的工具。虽然Java在网上也从未达到最初理想的那么普遍,但Java及其“表亲”JavaScript(一种由Netscape公司创建的,用于在网页中写脚本的类似于Java的语言)早已经是今天大多数商业网站普遍的必备语言了。


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]