|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Java语言的优点在于:它最初是由理解和信奉网络计算梦想的一个小巧而专注的开发组设计的,虽然该语言最初的实施方案有点缺陷,但为了这个梦想,他们很少在技术上妥协,结果诞生了一种专为以相互通信为主要目的的设备而设计的语言。有许多技术上的优点都可能会引导嵌入系统开发者选择Java。
* K! v! c, e4 ?: c4 m' d/ O1.与处理器无关5 O% t) H: F- i. G6 W' b9 I. }" d! k
Java的第一个优点就是与处理器无关,这个优点似乎与嵌入式系统没什么相干。传统上,嵌入程序就是针对特定的微处理器设计并在其上运行的,而C语言程序的可移植性则可通过编译或交叉编译来保障。3 o3 b$ p- ~0 }+ j0 U: b: W; ~6 M9 {0 t( j& T
1 B! _; j0 f& v) C! D7 S6 ^) e* O# P2 T0 @6 w# D) s7 Y. \
, K5 L# s' `; M3 h
但是在Sun公司的模型中,一个程序可能是存储在一个系统上,而被下载并运行在另一个完全不同的系统上;设备可能从不同地方下载一些程序来在一个处理器上运行,或者不同的处理器运行一个程序,通过网络在相互间传递数据。使用Java,一个嵌入式系统就可能成为一个通用的通信设备,能下载并运行能完成特定任务的程序。+ A$ v' Y) W9 m- T* X
* h$ o. R. e K) O4 c
+ |3 T' u% f+ `- J( V3 Q$ y- O" `) P7 J* ^
) z) f, k _. m/ \( f3 N) a对嵌入式系统,这是一个新的模型,已经有一些开发者正在向它靠拢。例如,电视机顶盒的供应商已宣布并入JVM,以使用户能通过Java applets在他们观看电视的同时接收到的支持该电视节目的一些内容。这样你在观看足球比赛时,看到的支持内容就可以是对球员的技术统计,若你在看电影,看到的支持内容就可以是演员的背景资料。JVM还被移植到移动电话中,这样用户可接收股票报价信息、比赛分数及其他即时信息。( C5 }, f5 r/ q9 p v
7 I; e+ S8 I$ f' F% v: l
* ]. G% u( i' z5 V1 Y$ R: h" [; C4 w' j- \1 \
这是一个恰当的设计和实施模型,首先它可以使开发平台的选择更加灵活,无需在与目标相同的平台上开发,也不用关心交叉编译的问题,因为Java字节码能在任何有JVM的操作系统中运行。其次,这种模型带来的另一个优点是几乎所有的检测和调试可以独立于目标设备来进行。但是,一些数据输入和硬件交互要求在目标(或是很好的仿真系统)上测试。由于个别JVM有时有兼容性的问题,你应该在所有将用到该程序的平台上测试它。但一般来说,你并不要高级而昂贵的、配备有逻辑探针、ICE以及其它调试工具的、针对目标平台的开发环境。3 a9 z" p+ M, _ d: S4 t4 W9 _- f, F2 \7 n# h) s% \6 U& N5 W
1 M( b7 U' i7 L" v/ C1 L% Y3 n6 D+ p/ n, M: n/ _; H' T& x0 Z# @8 R
2.面向对象提高开发速度和可维护性( H' x3 \2 D+ ?% w. u2 J' {/ W. W% L
Java是一种纯粹面向对象的语言。所有代码和数据都是某个类的一部分,没有全局变量或是独立于类存在的代码,一个对象是一个类的实例,对象是通过调用操作方法,或者说函数来操作的,而这些方法或函数也是类的一部分,对象的方法就对象的数据进行操作。Java类被组织成一个等级层次,在层次结构中,一个子类能够继承其超类的行为,并可用子类所具备的一些特有功能来扩展其超类的功能。对象模型是你能定义对应真实事物的数据结构,使得程序的任务和任务如何实现者二者之间的转换变得基本上透明。- N {/ P7 b1 x, O8 C3 v% L
3 w a4 v# X+ L2 d* j6 f1 v4 u u$ _' n/ o- t) d, W; t( O8 B- V
& p# y/ m7 Z1 c; C" ~# T! [9 d7 n( G1 H3 ^! [( x. Y
Java类层次有六个主要的类(共有二十三个类)成为类包(packages)。要应用任何包中的任何对象,你只需要申明那个包。你也拥有类层次中的全继承性,任何层次深部的对象都可取用层次中较高处定义的所有方法。6 ?, P! E& p8 ]" H) ]; V% C$ R; V! [5 i
+ {% y! S3 r8 U7 n4 c5 b2 e# m, y- ?/ K6 }
面向对象的设计和编程的优点在于其开发速度和代码的可维护性,许多面向对象的开发都能通过利用和更改现存类库来完成,而不是创造一个新的结构。这就使开发加快了,Sun’s Java Workshop(一个完全用Java写的IDE)的开发者能在几个月内建立一个功能齐备的图形IDE就是一个很好的证据。面向对象的方法还尽量使用自然的结构,使其有很高的可读性,且可轻易更改和加强。; M1 J# q9 I- m2 ^) w" E
1 r% P4 ?* X i2 b) j4 P6 a
4 p7 M! O0 [( G" h) k* R* Z2 o. `; g! {- k/ S1 Y3 _9 P6 E h; r/ `7 K
3.安全高
: J' p1 G; s7 m由于有了JVM,一个Java应用程序与操作系统或硬件完全隔绝,因此计算机病毒或其他作祟的代码就很难获得对设备的控制。虚拟机是主机设备和那些可能难以确定其质量和可靠性的软件之间的一个保护层。" Z7 j! a; q# T8 x( @* h/ s! c, Q3 a. E0 ^% `) [
9 g7 j) m k `; T. _. v
, y$ J/ N# r0 X( n5 g
另外,Java设计者从该语言中去掉了指针变量的概念。Java不能任意访问内存,只能读写有Java内存分配管理系统创建的对象。由于Java编译器所强制的严格的分类机制,从理论上来说,访问那些未分配给程序的内存区域是不可能的。这个限制使得要写恶意代码的程序变得非常困难了。当然,这个保护并不完善,有人已经在Java安全模型中找到漏洞,其中一些被Sun公司处理掉了。一些有天分但肆无忌惮的编程人员可能会写些程序,有意但不直接地更改内存的内容,或从主机获取密码或其他信息。但是,JVM确实提供了一定的保护,使得几乎不可能直接在硬件上运行代码。
: ^) {! l* e- q# U* o& R" [8 ?: Z# U/ i$ D* \
: j- o' F; n7 {2 }, r5 e$ H! l% h6 \) i0 U5 O% j8 k9 j1 i2 f, T, U9 ^) m- P( Z
对Java applet施加的限制就更加严格了。由于Java applet被设计成从Internet上下载,因而被视为不可信任的代码,除非它包括你已认定为可信任的主机的数字指纹。JVM在内存的一个称之为sandbox的区域运行诸如applet这种不可信任的代码。它给每个applet分配资源和特权,并将其限定在这些分配区域范围中。除了这些限制,sandbox模型还施加如下限制:禁止读写当地计算机文件系统;网络操作被限止,禁止不被信任的代码建立与任何计算机的网络连接,从其下载的那台计算机除外,它也不能在任何小于1024的端口号(为标准网络协议使用那些著名的端口所保留的端口范围)上监听和接受连接;在运行不被信任代码的线程组以外,禁止访问或创建线程。, k4 K% i/ f; S7 f' b. v5 [$ \7 f" C# j1 H) G. E
7 E' [0 o/ z7 u7 H- u+ ?" {9 Q1 v+ @3 v% D9 [
5 f: Y: M/ X8 z. J4 o: i7 x# c& |4.内存管理简单
! J: e. @; Q: D0 q O+ k# _: rJava的内存管理远比其他语言简单,因为它不使用指针。当对象被实例化时,内存被动态分配。正如我们前面分析的,对个别内存地址的访问被Java的设计者视为一个对安全的潜在危险,因此,访问也被禁止。而且,Sun的网络模型已假定你也许不知道目标处理器,而引用专用内存地址变得没有必要。去掉指针的结果不仅提高了安全性,还简化了编程,错误也减少了。4 @8 A! H' l1 U" g( [& H2 \; x0 j: w& F; {1 f9 p; h
, w+ | m! E+ ^* ]3 N" A$ H/ J$ b: L
* S# A- v5 O5 W, p, ?! [6 I: E
2 Z$ s; @( T# ?. n) {为了理解Java怎样分配内存,我们来与C语言比较一下。在C语言中,可以用值或引用的方式来访问数据。事实上,出于灵活性和控制考虑,非原始数据类型都由引用方式来存取,即通过指针访问。因此,值和引用的不同变得非常清楚,特别是:因为你不得不使用不同的符号(*和&)来存取数据。要用这两种不同的访问方式,你必须清楚理解它们是什么以及你为什么应该使用这一个,而不使用那一个。9 e" ^" \. C5 v/ d6 G8 W
r, Q. R) o+ b- j) |
- t8 ~: d) t2 q0 j6 @1 I$ J7 a
在Java中,由值和引用来存储是无缝的,尤其因为其符号都一样。两者间唯一不同在于数据类型本身:所有原始数据类型始终由值的方式存取;所有对象,包括字串、数组以及文件流,始终由引用方式访问。声明为原始数据变量类型包含该变量的值,声明为对象的变量则包含对该对象(即该对象的地址)的一个引用,而非对象自身的引用。仅仅声明一个对象变量并不给对象分配内存,你必须用“new”关键字来分配内存和创建对象。/ i( ?+ I: N( e# l5 |+ N4 H
9 d# ^7 Z9 G: f7 R0 I5 }' o0 ]! e/ O: y0 Z) I
- p5 \* t3 l* `, g( o这两种方法最根本的不同在于:不可能象在C中那样就Java内存地址做指针算术或其他操作。Java中对象的地址是相对的(或虚拟的),它由虚拟机任意分配,因此你没有理由还想要指针地址。5 ^1 V+ L* H* f* l Q& z
/ K# [7 ? L0 Y) f& V! j2 {) d
6 S) ]4 ^6 ~# d) ?) }7 w" A# X+ h) w: o4 g3 D
; ], D( M) B8 Q/ N+ N1 [5.具有垃圾收集功能7 ^0 l* g( I6 O7 O0 Q7 o; ~
垃圾收集自动收集内存中未引用的内存,并将其归回空闲内存链表中。JVM使用此功能将不在使用的内存还给系统。当Java程序说明并实例化一个对象或数组时,它仅仅做一个JVM请求,访问其下面的系统内存(通常是通过主机操作系统)并分配内存,Java的垃圾收集系统通过内存收集对象,然后检查它们的引用链。Java的垃圾收集系统的工作方式一般是搜索内存中的对象,然后检查它们的引用表。它计算程序中有多少变量当前正在引用每个对象。若对象的引用数目为零,它知道此对象不再在使用了,它的内存可以收回。其结果就是,不必像你在C语言所作的那样,要人工来释放分配的内存。在C中,释放内存是一个必要、耗时且易出错的细节。Java自动而精确的处理此过程,去除了C/C++程序中那种常见的错误致因。
* V& l% d3 ^3 a$ g- ?: ~! ]) x# A) f7 e3 P; I
' W1 L4 W( q2 C2 I6 S8 I2 d C3 k( ]
$ H, D/ z4 C6 ^4 H0 y) \5 p* o6.网络实现方便# s' q5 d# H7 K. |% [
& e, Y+ g* ^" V% C: n1 u' Q0 ~由于今天的嵌入式系统通常都是面向网络的,采用内置网络支持的语言节约了在实现网络协议和通信程序方面耗费的大量时间和努力。在Java中,网络类包括TCP/IP流和使用TCP及UDP的数据报程序,用于HTTP和URL服务的操作方法,以及错误检查代码和恢复功能。虽然实现网络也可能用其他语言,比如C语言,但那些语言要求特别的附件软件包、DLL,或其他必须由操作系统,或者第三方销售提供的程序模块,特别附件通常要求有操作系统或第三方工具的知识,不像Java,有标准的、内置的网络支持。Java包括网络包出于必要,因为设计者不能对一个作为基础的操作系统的网络设施做任何假定,他们必须得包括集成网络程序库,以确保Java程序能在所有平台上工作。
3 g6 w& y5 O' [/ ~
) g$ m( Y) R0 K W5 ?8 e6 s6 p2 j' d6 Y) R4 G! N$ t; K* f. Z u( z
7.可以实现动态配置% P; [; m3 }2 {/ y$ g
动态配置是指系统启动时的用户制定配置或重新配置。需载入特殊的硬件配置、网络参数或在引导期间支持特定用途的一些实用程序的系统,常常使用动态配置。Java以动态捆绑来支持动态配置。当你组成一个程序的各个类文件编译成字节码时,在你的类文件之间,或者对JVM包的类(如图形、网络以及核心语言支持)引用,还没有被解决。当JVM载入你的程序时,它动态的载入并捆绑(即链接)你的程序引用的所有的类。因此,要改变系统配置,你所需要做的一切就是修正相应的类文件。下一次系统时,JVM自动捆绑新文件到你的程序中,而新的配置将生效执行。$ ] S, g f/ J* O/ m9 Y* S1 u
8 F1 G) _/ @! N; _, d& s
1 ?1 G: G% T- W# G. `# w
$ o2 w0 H0 m! d3 m) z8.可以轻松诱捕和处理错误/ K, o A: q7 j; i; h6 F( E
与许多操作系统和程序不同,对嵌入系统而言,重新启动通常是无法接受的,就像我们都不希望打电话或者看电视时突然有技术性的中断一样。这意味着实际上所有嵌入式系统都必须足够坚实以截取错误来防止它们使程序或更糟的是使整个设备崩溃。
1 ?4 \7 j( D* X! E' G; T: c6 B" g" ?: u8 i
; @# w2 H8 w Z程序错误的致因很多。相对来说,很少是因为继承逻辑错误,而大多数程序的崩溃是因为意外输入,或者是因为程序不能调用系统资源来完成某个特定操作造成的。所以,必须能够预料这些问题,并要能够诱捕它们,以免引起更大的问题。虽然,能用几乎任何程序设计语言来诱捕和处理错误,不过如果有内置的设施来做这类工作,比如象Java那样,会有极大的帮助。
+ `# Q+ D0 e- l% D" b* H( D$ u9 A. ~+ d) @
: Q. s( y4 e- s# G: `$ s在Java中,由抛出(产生)一个异常来提示错误。使用专门为异常处理而设计的语句(关键字try、catch、和finally),程序能将其错误处理代码安排到几个集中区域,try程序块是程序执行的正常流程。当一个异常发生在try块(包括该嵌套块中的各层子程序)中,控制就交给了catch块。不管是否有异常发生,finally块中的代码始终要被执行。未被处理的异常会由调用堆栈自下而上传播JVM并终止程序。不再需要动手编程,来将错误状态通过几层函数调用返回。而是,在错误发生由检测错误的代码直接抛出一个异常。这极大地简化了应用程序中的错误处理代码,进而获得更好地错误处理效果和更坚实可靠的代码。0 y6 |" q3 l! Z4 z4 C$ X
4 b3 g* q7 t# v- \5 s7 c; Z/ I1 D3 o9 S! _* N+ E) K* g
( w! i9 ` m' ]& f2 s( }
3 M) T- ?3 c7 b( B5 _2 D$ l9.提供对线程管理的直线支持
* t* E. V G! P" e( N5 a/ m- @( T% ~大多数操作系统都给一个过程产生和管理多个线程的能力,这些线程彼此独立地完成不同的任务。但是,很少由程序语言提供对线程管理的直线支持,通常都需要直接调用操作系统功能。Java却相反,直接在语言提供了产生、管理和协调同步线程地功能。与Java的其他特点一样,该功能是必要的,因为设计者不敢确定底层的操作系统是否支持多线程。! z# m4 ?6 E% K; ^' ?! H$ p2 H+ c q: q, l" |# ]
开发者越来越多的在程序中使用线程,将其作为满足一个程序不能完成的,通常相互无关的一些任务的一种手段。由于Java对线程有内置语言支持,以Java创建多线程较之与其它语言更简单、更自然。) Y1 @$ W" Y g: V
$ n, ]) T% z, c- |1 U
+ Y; q% ^" V* V10.图形功能强大
0 A# }5 R$ p, L1 z FJVM包括一个庞大的图形及窗口支持程序包,称为Abstract Windowing Toolkit(AWT)。用AWT,你能在应用程序中快速而轻易地创建精致而强大的图形用户界面。对于需要精细的用户界面的嵌入系统来说,AWT能节省大量开发时间,从而是产品更快的走向市场。3 R+ g/ {$ `5 h' X- k6 D5 c4 r; [+ J6 ^8 l
|
|