导航:首页 > 源码编译 > 编译的处理方案有几种分别是什么

编译的处理方案有几种分别是什么

发布时间:2023-03-09 12:04:27

编译原理全部的名词解释

书上有别那么懒!.
编译过程的六个阶段:词法分析,语法分析,语义分析,中间代码生成,代码优化,目标代码生成
解释程序:把某种语言的源程序转换成等价的另一种语言程序——目标语言程序,然后再执行目标程序.解释方式是接受某高级语言的一个语句输入,进行解释并控制计算机执行,马上得到这句的执行结果,然后再接受下一句.
编译程序:就是指这样一种程序,通过它能够将用高级语言编写的源程序转换成与之在逻辑上等价的低级语言形式的目标程序(机器语言程序或汇编语言程序).
解释程序和编译程序的根本区别:是否生成目标代码
句子的二义性(这里的二义性是指语法结构上的.):文法G[S]的一个句子如果能找到两种不同的最左推导(或最右推导),或者存在两棵不同的语法树,则称这个句子是二义性的.
文法的二义性:一个文法如果包含二义性的句子,则这个文法是二义文法,否则是无二义文法.
LL(1)的含义:(LL(1)文法是无二义的; LL(1)文法不含左递归)
第1个L:从左到右扫描输入串 第2个L:生成的是最左推导
1 :向右看1个输入符号便可决定选择哪个产生式
某些非LL(1)文法到LL(1)文法的等价变换: 1. 提取公因子 2. 消除左递归
文法符号的属性:单词的含义,即与文法符号相关的一些信息.如,类型、值、存储地址等.
一个属性文法(attribute grammar)是一个三元组A=(G, V, F)
G:上下文无关文法.
V:属性的有穷集.每个属性与文法的一个终结符或非终结符相连.属性与变量一样,可以进行计算和传递.
F:关于属性的断言或谓词(一组属性的计算规则)的有穷集.断言或语义规则与一个产生式相联,只引用该产生式左端或右端的终结符或非终结符相联的属性.
综合属性:若产生式左部的单非终结符A的属性值由右部各非终结符的属性值决定,则A的属性称为综合属
继承属性:若产生式右部符号B的属性值是根据左部非终结符的属性值或者右部其它符号的属性值决定的,则B的属性为继承属性.
(1)非终结符既可有综合属性也可有继承属性,但文法开始符号没有继承属性.
(2) 终结符只有综合属性,没有继承属性,它们由词法程序提供.
在计算时: 综合属性沿属性语法树向上传递;继承属性沿属性语法树向下传递.
语法制导翻译:是指在语法分析过程中,完成附加在所使用的产生式上的语义规则描述的动作.
语法制导翻译实现:对单词符号串进行语法分析,构造语法分析树,然后根据需要构造属性依赖图,遍历语法树并在语法树的各结点处按语义规则进行计算.
中间代码(中间语言)
1、是复杂性介于源程序语言和机器语言的一种表示形式.
2、一般,快速编译程序直接生成目标代码.
3、为了使编译程序结构在逻辑上更为简单明确,常采用中间代码,这样可以将与机器相关的某些实现细节置于代码生成阶段仔细处理,并且可以在中间代码一级进行优化工作,使得代码优化比较容易实现.
何谓中间代码:源程序的一种内部表示,不依赖目标机的结构,易于代码的机械生成.
为何要转换成中间代码:(1)逻辑结构清楚;利于不同目标机上实现同一种语言.
(2)便于移植,便于修改,便于进行与机器无关的优化.
中间代码的几种形式:逆波兰记号 ,三元式和树形表示 ,四元式
符号表的一般形式:一张符号表的的组成包括两项,即名字栏和信息栏.
信息栏包含许多子栏和标志位,用来记录相应名字和种种不同属性,名字栏也称主栏.主栏的内容称为关键字(key word).
符号表的功能:(1)收集符号属性 (2) 上下文语义的合法性检查的依据: 检查标识符属性在上下文中的一致性和合法性.(3)作为目标代码生成阶段地址分配的依据
符号的主要属性及作用:
1. 符号名 2. 符号的类型 (整型、实型、字符串型等))3. 符号的存储类别(公共、私有)
4. 符号的作用域及可视性 (全局、局部) 5. 符号变量的存储分配信息 (静态存储区、动态存储区)
存储分配方案策略:静态存储分配;动态存储分配:栈式、 堆式.
静态存储分配
1、基本策略
在编译时就安排好目标程序运行时的全部数据空间,并能确定每个数据项的单元地址.
2、适用的分配对象:子程序的目标代码段;全局数据目标(全局变量)
3、静态存储分配的要求:不允许递归调用,不含有可变数组.
FORTRAN程序是段结构,不允许递归,数据名大小、性质固定. 是典型的静态分配
动态存储分配
1、如果一个程序设计语言允许递归过程、可变数组或允许用户自由申请和释放空间,那么,就需要采用动态存储管理技术.
2、两种动态存储分配方式:栈式,堆式
栈式动态存储分配
分配策略:将整个程序的数据空间设计为一个栈.
【例】在具有递归结构的语言程序中,每当调用一个过程时,它所需的数据空间就分配在栈顶,每当过程工作结束时就释放这部分空间.
过程所需的数据空间包括两部分
一部分是生存期在本过程这次活动中的数据对象.如局部变量、参数单元、临时变量等;
另一部分则是用以管理过程活动的记录信息(连接数据).
活动记录(AR)
一个过程的一次执行所需要的信息使用一个连续的存储区来管理,这个区 (块)叫做一个活动记录.
构成
1、临时工作单元;2、局部变量;3、机器状态信息;4、存取链;
5、控制链;6、实参;7、返回地址
什么是代码优化
所谓优化,就是对代码进行等价变换,使得变换后的代码运行结果与变换前代码运行结果相同,而运行速度加快或占用存储空间减少.
优化原则:等价原则:经过优化后不应改变程序运行的结果.
有效原则:使优化后所产生的目标代码运行时间较短,占用的存储空间较小.
合算原则:以尽可能低的代价取得较好的优化效果.
常见的优化技术
(1) 删除多余运算(删除公共子表达式) (2) 代码外提 +删除归纳变量+ (3)强度削弱; (4)变换循环控制条件 (5)合并已知量与复写传播 (6)删除无用赋值
基本块定义
程序中只有一个入口和一个出口的一段顺序执行的语句序列,称为程序的一个基本块.
给我分数啊.

Ⅱ 在java中,异常处理的机制有哪几种,分别是什么

1 引子
try…catch…finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解。不过,我亲自体验的“教训”告诉我,这个东西可不是想象中的那么简单、听话。不信?那你看看下面的代码,“猜猜”它执行后的结果会是什么?不要往后看答案、也不许执行代码看真正答案哦。如果你的答案是正确,那么这篇文章你就不用浪费时间看啦。

package myExample.testException;

public class TestException {

public TestException() {

}

boolean testEx() throws Exception{

boolean ret = true;

try{

ret = testEx1();

}catch (Exception e){

System.out.println("testEx, catch exception");

ret = false;

throw e;

}finally{

System.out.println("testEx, finally; return value="+ret);

return ret;

}

}

boolean testEx1() throws Exception{

boolean ret = true;

try{

ret = testEx2();

if (!ret){

return false;

}

System.out.println("testEx1, at the end of try");

return ret;

}catch (Exception e){

System.out.println("testEx1, catch exception");

ret = false;

throw e;

}

finally{

System.out.println("testEx1, finally; return value="+ret);

return ret;

}

}

boolean testEx2() throws Exception{

boolean ret = true;

try{

int b=12;

int c;

for (int i=2;i>=-2;i--){

c=b/i;

System.out.println("i="+i);

}

return true;

}catch (Exception e){

System.out.println("testEx2, catch exception");

ret = false;

throw e;

}

finally{

System.out.println("testEx2, finally; return value="+ret);

return ret;

}

}

public static void main(String[] args) {

TestException testException1 = new TestException();

try{

testException1.testEx();

}catch(Exception e){

e.printStackTrace();

}

}

}

你的答案是什么?是下面的答案吗?

i=2

i=1

testEx2, catch exception

testEx2, finally; return value=false

testEx1, catch exception

testEx1, finally; return value=false

testEx, catch exception

testEx, finally; return value=false

如果你的答案真的如上面所说,那么你错啦。^_^,那就建议你仔细看一看这篇文章或者拿上面的代码按各种不同的情况修改、执行、测试,你会发现有很多事情不是原来想象中的那么简单的。

现在公布正确答案:

i=2

i=1

testEx2, catch exception

testEx2, finally; return value=false

testEx1, finally; return value=false

testEx, finally; return value=false

2 基础知识
2.1 相关概念
例外是在程序运行过程中发生的异常事件,比如除0溢出、数组越界、文件找不到等,这些事件的发生将阻止程序的正常运行。为了加强程序的鲁棒性,程序设计时,必须考虑到可能发生的异常事件并做出相应的处理。C语言中,通过使用if语句来判断是否出现了例外,同时,调用函数通过被调用函数的返回值感知在被调用函数中产生的例外事件并进行处理。全程变量ErroNo常常用来反映一个异常事件的类型。但是,这种错误处理机制会导致不少问题。

Java通过面向对象的方法来处理例外。在一个方法的运行过程中,如果发生了例外,则这个方法生成代表该例外的一个对象,并把它交给运行时系统,运行时系统寻找相应的代码来处理这一例外。我们把生成例外对象并把它提交给运行时系统的过程称为抛弃(throw)一个例外。运行时系统在方法的调用栈中查找,从生成例外的方法开始进行回朔,直到找到包含相应例外处理的方法为止,这一个过程称为捕获(catch)一个例外。

2.2 Throwable类及其子类
用面向对象的方法处理例外,就必须建立类的层次。类 Throwable位于这一类层次的最顶层,只有它的后代才可以做为一个例外被抛弃。图1表示了例外处理的类层次。

从图中可以看出,类Throwable有两个直接子类:Error和Exception。Error类对象(如动态连接错误等),由Java虚拟机生成并抛弃(通常,Java程序不对这类例外进行处理);Exception类对象是Java程序处理或抛弃的对象。它有各种不同的子类分别对应于不同类型的例外。其中类RuntimeException代表运行时由Java虚拟机生成的例外,如算术运算例外ArithmeticException(由除0错等导致)、数组越界例外等;其它则为非运行时例外,如输入输出例外IOException等。Java编译器要求Java程序必须捕获或声明所有的非运行时例外,但对运行时例外可以不做处理。

图1 例外处理的类层次

2.3 异常处理关键字
Java的异常处理是通过5个关键字来实现的:try,catch,throw,throws,finally。JB的在线帮助中对这几个关键字是这样解释的:

Throws: Lists the exceptions a method could throw.

Throw: Transfers control of the method to the exception handler.

Try: Opening exception-handling statement.

Catch: Captures the exception.

Finally: Runs its code before terminating the program.

2.3.1 try语句
try语句用大括号{}指定了一段代码,该段代码可能会抛弃一个或多个例外。

2.3.2 catch语句
catch语句的参数类似于方法的声明,包括一个例外类型和一个例外对象。例外类型必须为Throwable类的子类,它指明了catch语句所处理的例外类型,例外对象则由运行时系统在try所指定的代码块中生成并被捕获,大括号中包含对象的处理,其中可以调用对象的方法。

catch语句可以有多个,分别处理不同类的例外。Java运行时系统从上到下分别对每个catch语句处理的例外类型进行检测,直到找到类型相匹配的catch语句为止。这里,类型匹配指catch所处理的例外类型与生成的例外对象的类型完全一致或者是它的父类,因此,catch语句的排列顺序应该是从特殊到一般。

也可以用一个catch语句处理多个例外类型,这时它的例外类型参数应该是这多个例外类型的父类,程序设计中要根据具体的情况来选择catch语句的例外处理类型。

2.3.3 finally语句
try所限定的代码中,当抛弃一个例外时,其后的代码不会被执行。通过finally语句可以指定一块代码。无论try所指定的程序块中抛弃或不抛弃例外,也无论catch语句的例外类型是否与所抛弃的例外的类型一致,finally所指定的代码都要被执行,它提供了统一的出口。通常在finally语句中可以进行资源的清除工作。如关闭打开的文件等。

2.3.4 throws语句
throws总是出现在一个函数头中,用来标明该成员函数可能抛出的各种异常。对大多数Exception子类来说,Java 编译器会强迫你声明在一个成员函数中抛出的异常的类型。如果异常的类型是Error或 RuntimeException, 或它们的子类,这个规则不起作用, 因为这在程序的正常部分中是不期待出现的。 如果你想明确地抛出一个RuntimeException,你必须用throws语句来声明它的类型。

2.3.5 throw语句
throw总是出现在函数体中,用来抛出一个异常。程序会在throw语句后立即终止,它后面的语句执行不到,然后在包含它的所有try块中(可能在上层调用函数中)从里向外寻找含有与其匹配的catch子句的try块。

3 关键字及其中语句流程详解
3.1 try的嵌套
你可以在一个成员函数调用的外面写一个try语句,在这个成员函数内部,写另一个try语句保护其他代码。每当遇到一个try语句,异常的框架就放到堆栈上面,直到所有的try语句都完成。如果下一级的try语句没有对某种异常进行处理,堆栈就会展开,直到遇到有处理这种异常的try语句。下面是一个try语句嵌套的例子。

class MultiNest {

static void procere() {

try {

int a = 0;

int b = 42/a;

} catch(java.lang.ArithmeticException e) {

System.out.println("in procere, catch ArithmeticException: " + e);

}

}

public static void main(String args[]) {

try {

procere();

} catch(java.lang. Exception e) {

System.out.println("in main, catch Exception: " + e);

}

}

}

这个例子执行的结果为:

in procere, catch ArithmeticException: java.lang.ArithmeticException: / by zero

成员函数procere里有自己的try/catch控制,所以main不用去处理 ;当然如果如同最开始我们做测试的例子一样,在procere中catch到异常时使用throw e;语句将异常抛出,那么main当然还是能够捕捉并处理这个procere抛出来的异常。例如在procere函数的catch中的System.out语句后面增加throw e;语句之后,执行结果就变为:

in procere, catch ArithmeticException: java.lang.ArithmeticException: / by zero

in main, catch Exception: java.lang.ArithmeticException: / by zero

3.2 try-catch程序块的执行流程以及执行结果
相对于try-catch-finally程序块而言,try-catch的执行流程以及执行结果还是比较简单的。

首先执行的是try语句块中的语句,这时可能会有以下三种情况:

1. 如果try块中所有语句正常执行完毕,那么就不会有其他的“动做”被执行,整个try-catch程序块正常完成。

2. 如果try语句块在执行过程中碰到异常V,这时又分为两种情况进行处理:

² 如果异常V能够被与try相应的catch块catch到,那么第一个catch到这个异常的catch块(也是离try最近的一个与异常V匹配的catch块)将被执行;如果catch块执行正常,那么try-catch程序块的结果就是“正常完成”;如果该catch块由于原因R突然中止,那么try-catch程序块的结果就是“由于原因R突然中止(completes abruptly)”。

² 如果异常V没有catch块与之匹配,那么这个try-catch程序块的结果就是“由于抛出异常V而突然中止(completes abruptly)”。

3. 如果try由于其他原因R突然中止(completes abruptly),那么这个try-catch程序块的结果就是“由于原因R突然中止(completes abruptly)”。

3.3 try-catch-finally程序块的执行流程以及执行结果
try-catch-finally程序块的执行流程以及执行结果比较复杂。

首先执行的是try语句块中的语句,这时可能会有以下三种情况:

1. 如果try块中所有语句正常执行完毕,那么finally块的居于就会被执行,这时分为以下两种情况:

² 如果finally块执行顺利,那么整个try-catch-finally程序块正常完成。

² 如果finally块由于原因R突然中止,那么try-catch-finally程序块的结局是“由于原因R突然中止(completes abruptly)”

2. 如果try语句块在执行过程中碰到异常V,这时又分为两种情况进行处理:

² 如果异常V能够被与try相应的catch块catch到,那么第一个catch到这个异常的catch块(也是离try最近的一个与异常V匹配的catch块)将被执行;这时就会有两种执行结果:

² 如果catch块执行正常,那么finally块将会被执行,这时分为两种情况:

² 如果finally块执行顺利,那么整个try-catch-finally程序块正常完成。

² 如果finally块由于原因R突然中止,那么try-catch-finally程序块的结局是“由于原因R突然中止(completes abruptly)”

² 如果catch块由于原因R突然中止,那么finally模块将被执行,分为两种情况:

² 如果如果finally块执行顺利,那么整个try-catch-finally程序块的结局是“由于原因R突然中止(completes abruptly)”。

² 如果finally块由于原因S突然中止,那么整个try-catch-finally程序块的结局是“由于原因S突然中止(completes abruptly)”,原因R将被抛弃。

(注意,这里就正好和我们的例子相符合,虽然我们在testEx2中使用throw e抛出了异常,但是由于testEx2中有finally块,而finally块的执行结果是complete abruptly的(别小看这个用得最多的return,它也是一种导致complete abruptly的原因之一啊——后文中有关于导致complete abruptly的原因分析),所以整个try-catch-finally程序块的结果是“complete abruptly”,所以在testEx1中调用testEx2时是捕捉不到testEx1中抛出的那个异常的,而只能将finally中的return结果获取到。

如果在你的代码中期望通过捕捉被调用的下级函数的异常来给定返回值,那么一定要注意你所调用的下级函数中的finally语句,它有可能会使你throw出来的异常并不能真正被上级调用函数可见的。当然这种情况是可以避免的,以testEx2为例:如果你一定要使用finally而且又要将catch中throw的e在testEx1中被捕获到,那么你去掉testEx2中的finally中的return就可以了。

这个事情已经在OMC2.0的MIB中出现过啦:服务器的异常不能完全被反馈到客户端。)

² 如果异常V没有catch块与之匹配,那么finally模块将被执行,分为两种情况:

² 如果finally块执行顺利,那么整个try-catch-finally程序块的结局就是“由于抛出异常V而突然中止(completes abruptly)”。

² 如果finally块由于原因S突然中止,那么整个try-catch-finally程序块的结局是“由于原因S突然中止(completes abruptly)”,异常V将被抛弃。

3. 如果try由于其他原因R突然中止(completes abruptly),那么finally块被执行,分为两种情况:

² 如果finally块执行顺利,那么整个try-catch-finally程序块的结局是“由于原因R突然中止(completes abruptly)”。

² 如果finally块由于原因S突然中止,那么整个try-catch-finally程序块的结局是“由于原因S突然中止(completes abruptly)”,原因R将被抛弃。

3.4 try-catch-finally程序块中的return
从上面的try-catch-finally程序块的执行流程以及执行结果一节中可以看出无论try或catch中发生了什么情况,finally都是会被执行的,那么写在try或者catch中的return语句也就不会真正的从该函数中跳出了,它的作用在这种情况下就变成了将控制权(语句流程)转到finally块中;这种情况下一定要注意返回值的处理。

例如,在try或者catch中return false了,而在finally中又return true,那么这种情况下不要期待你的try或者catch中的return false的返回值false被上级调用函数获取到,上级调用函数能够获取到的只是finally中的返回值,因为try或者catch中的return语句只是转移控制权的作用。

3.5 如何抛出异常
如果你知道你写的某个函数有可能抛出异常,而你又不想在这个函数中对异常进行处理,只是想把它抛出去让调用这个函数的上级调用函数进行处理,那么有两种方式可供选择:

第一种方式:直接在函数头中throws SomeException,函数体中不需要try/catch。比如将最开始的例子中的testEx2改为下面的方式,那么testEx1就能捕捉到testEx2抛出的异常了。

boolean testEx2() throws Exception{

boolean ret = true;

int b=12;

int c;

for (int i=2;i>=-2;i--){

c=b/i;

System.out.println("i="+i);

}

return true;

}

第二种方式:使用try/catch,在catch中进行一定的处理之后(如果有必要的话)抛出某种异常。例如上面的testEx2改为下面的方式,testEx1也能捕获到它抛出的异常:

boolean testEx2() throws Exception{

boolean ret = true;

try{

int b=12;

int c;

for (int i=2;i>=-2;i--){

c=b/i;

System.out.println("i="+i);

}

return true;

}catch (Exception e){

System.out.println("testEx2, catch exception");

Throw e;

}

}

第三种方法:使用try/catch/finally,在catch中进行一定的处理之后(如果有必要的话)抛出某种异常。例如上面的testEx2改为下面的方式,testEx1也能捕获到它抛出的异常:

boolean testEx2() throws Exception{

boolean ret = true;

try{

int b=12;

int c;

for (int i=2;i>=-2;i--){

c=b/i;

System.out.println("i="+i);

throw new Exception("aaa");

}

return true;

}catch (java.lang.ArithmeticException e){

System.out.println("testEx2, catch exception");

ret = false;

throw new Exception("aaa");

}finally{

System.out.println("testEx2, finally; return value="+ret);

}

}

4 关于abrupt completion
前面提到了complete abruptly(暂且理解为“突然中止”或者“异常结束”吧),它主要包含了两种大的情形:abrupt completion of expressions and statements,下面就分两种情况进行解释。

4.1 Normal and Abrupt Completion of Evaluation
每一个表达式(expression)都有一种使得其包含的计算得以一步步进行的正常模式,如果每一步计算都被执行且没有异常抛出,那么就称这个表达式“正常结束(complete normally)”;如果这个表达式的计算抛出了异常,就称为“异常结束(complete abruptly)”。异常结束通常有一个相关联的原因(associated reason),通常也就是抛出一个异常V。

与表达式、操作符相关的运行期异常有:

² A class instance creation expression, array creation expression , or string concatenation operatior expression throws an OutOfMemoryError if there is insufficient memory available.

² An array creation expression throws a NegativeArraySizeException if the value of any dimension expression is less than zero.

² A field access throws a NullPointerException if the value of the object reference expression is null.

² A method invocation expression that invokes an instance method throws a NullPointerException if the target reference is null.

² An array access throws a NullPointerException if the value of the array reference expression is null.

² An array access throws an if the value of the array index expression is negative or greater than or equal to the length of the array.

² A cast throws a ClassCastException if a cast is found to be impermissible at run time.

² An integer division or integer remainder operator throws an ArithmeticException if the value of the right-hand operand expression is zero.

² An assignment to an array component of reference type throws an ArrayStoreException when the value to be assigned is not compatible with the component type of the array.

4.2 Normal and Abrupt Completion of Statements
正常情况我们就不多说了,在这里主要是列出了abrupt completion的几种情况:

² break, continue, and return 语句将导致控制权的转换,从而使得statements不能正常地、完整地执行。

² 某些表达式的计算也可能从java虚拟机抛出异常,这些表达式在上一小节中已经总结过了;一个显式的的throw语句也将导致异常的抛出。抛出异常也是导致控制权的转换的原因(或者说是阻止statement正常结束的原因)。

如果上述事件发生了,那么这些statement就有可能使得其正常情况下应该都执行的语句不能完全被执行到,那么这些statement也就是被称为是complete abruptly.

导致abrupt completion的几种原因:

² A break with no label

² A break with a given label

² A continue with no label

² A continue with a given label

² A return with no value

² A return with a given value A

² throw with a given value, including exceptions thrown by the Java virtual machine

5 关于我们的编程的一点建议
弄清楚try-catch-finally的执行情况后我们才能正确使用它。

如果我们使用的是try-catch-finally语句块,而我们又需要保证有异常时能够抛出异常,那么在finally语句中就不要使用return语句了(finally语句块的最重要的作用应该是释放申请的资源),因为finally中的return语句会导致我们的throw e被抛弃,在这个try-catch-finally的外面将只能看到finally中的返回值(除非在finally中抛出异常)。(我们需要记住:不仅throw语句是abrupt completion 的原因,return、break、continue等这些看起来很正常的语句也是导致abrupt completion的原因。)

Ⅲ 了解什么叫做jit compiling,与传统的编译技术有何不同

Java 应用程序的性能经常成为开发社区中的讨论热点。因为该语言的设计初衷是使用解释的方式支持应用程序的可移植性目标,早期
Java 运行时所提供的性能级别远低于 C 和
C++
之类的编译语言。尽管这些语言可以提供更高的性能,但是生成的代码只能在有限的几种系统上执行。在过去的十年中,Java
运行时供应商开发了一些复杂的动态编译器,通常称作即时(Just-in-time,JIT)编译器。程序运行时,JIT
编译器选择将最频繁执行的方法编译成本地代码。运行时才进行本地代码编译而不是在程序运行前进行编译(用 C 或
C++ 编写的程序正好属于后一情形),保证了可移植性的需求。有些 JIT 编译器甚至不使用解释程序就能编译所有的代码,但是这些编译器仍然通过在程序执行时进行一些操作来保持 Java 应用程序的可移植性。
由于动态编译技术的多项改进,在很多应用程序中,现代的 JIT 编译器可以产生与 C 或 C++
静态编译相当的应用程序性能。但是,仍然有很多软件开发人员认为 —— 基于经验或者传闻 ——
动态编译可能严重干扰程序操作,因为编译器必须与应用程序共享 CPU。一些开发人员强烈呼吁对 Java
代码进行静态编译,并且坚信那样可以解决性能问题。对于某些应用程序和执行环境而言,这种观点是正确的,静态编译可以极大地提高 Java
性能,或者说它是惟一的实用选择。但是,静态地编译 Java 应用程序在获得高性能的同时也带来了很多复杂性。一般的
Java 开发人员可能并没有充分地感受到 JIT 动态编译器的优点。

本文考察了 Java 语言静态编译和动态编译所涉及的一些问题,重点介绍了实时 (RT) 系统。简要描述了 Java
语言解释程序的操作原理并说明了现代 JIT 编译器执行本地代码编译的优缺点。介绍了 IBM 在 WebSphere Real Time 中发布的
AOT 编译技术和它的一些优缺点。然后比较了这两种编译策略并指出了几种比较适合使用 AOT
编译的应用程序领域和执行环境。要点在于这两种编译技术并不互斥:即使在使用这两种技术最为有效的各种应用程序中,它们也分别存在一些影响应用程序的优缺
点。

执行 Java 程序

Java 程序最初是通过 Java SDK 的 javac程序编译成本地的与平台无关的格式(类文件)。可将此格式看作 Java
平台,因为它定义了执行 Java 程序所需的所有信息。Java 程序执行引擎,也称作 Java 运行时环境(JRE),包含了为特定的本地平台实现
Java 平台的虚拟机。例如,基于 Linux 的 Intel x86 平台、Sun Solaris 平台和 AIX 操作系统上运行的 IBM
System p 平台,每个平台都拥有一个 JRE。这些 JRE 实现实现了所有的本地支持,从而可以正确执行为
Java 平台编写的程序。

事实上,操作数堆栈的大小有实际限制,但是编程人员极少编写超出该限制的方法。JVM 提供了安全性检查,对那些创建出此类方法的编程人员进行通知。

Java 平台程序表示的一个重要部分是字节码序列,它描述了 Java
类中每个方法所执行的操作。字节码使用一个理论上无限大的操作数堆栈来描述计算。这个基于堆栈的程序表示提供了平台无关性,因为它不依赖任何特定本地平台
的 CPU 中可用寄存器的数目。可在操作数堆栈上执行的操作的定义都独立于所有本地处理器的指令集。Java
虚拟机(JVM)规范定义了这些字节码的执行(参见 参考资料)。执行 Java 程序时,用于任何特定本地平台的任何 JRE 都必须遵守 JVM
规范中列出的规则。

因为基于堆栈的本地平台很少(Intel X87 浮点数协处理器是一个明显的例外),所以大多数本地平台不能直接执行 Java 字节码。为了解决这个问题,早期的 JRE 通过解释字节码来执行 Java 程序。即 JVM 在一个循环中重复操作:

◆获取待执行的下一个字节码;

◆解码;

◆从操作数堆栈获取所需的操作数;

◆按照 JVM 规范执行操作;

◆将结果写回堆栈。

这种方法的优点是其简单性:JRE 开发人员只需编写代码来处理每种字节码即可。并且因为用于描述操作的字节码少于 255 个,所以实现的成本比较低。当然,缺点是性能:这是一个早期造成很多人对 Java 平台不满的问题,尽管拥有很多其他优点。

解决与 C 或 C++ 之类的语言之间的性能差距意味着,使用不会牺牲可移植性的方式开发用于 Java 平台的本地代码编译。

编译 Java 代码

尽管传闻中 Java 编程的 “一次编写,随处运行”
的口号可能并非在所有情况下都严格成立,但是对于大量的应用程序来说情况确实如此。另一方面,本地编译本质上是特定于平台的。那么 Java
平台如何在不牺牲平台无关性的情况下实现本地编译的性能?答案就是使用 JIT 编译器进行动态编译,这种方法已经使用了十年(参见图 1):

图 1. JIT 编译器

使用 JIT 编译器时,Java
程序按每次编译一个方法的形式进行编译,因为它们在本地处理器指令中执行以获得更高的性能。此过程将生成方法的一个内部表示,该表示与字节码不同但是其级
别要高于目标处理器的本地指令。(IBM JIT
编译器使用一个表达式树序列表示方法的操作。)编译器执行一系列优化以提高质量和效率,最后执行一个代码生成步骤将优化后的内部表示转换成目标处理器的本
地指令。生成的代码依赖运行时环境来执行一些活动,比如确保类型转换的合法性或者对不能在代码中直接执行的某些类型的对象进行分配。JIT
编译器操作的编译线程与应用程序线程是分开的,因此应用程序不需要等待编译的执行。

图 1 中还描述了用于观察执行程序行为的分析框架,通过周期性地对线程取样找出频繁执行的方法。该框架还为专门进行分析的方法提供了工具,用来存储程序的此次执行中可能不会改变的动态值。

因为这个 JIT 编译过程在程序执行时发生,所以能够保持平台无关性:发布的仍然是中立的 Java 平台代码。C 和 C++ 之类的语言缺乏这种优点,因为它们在程序执行前进行本地编译;发布给(本地平台)执行环境的是本地代码。

挑战

尽管通过 JIT 编译保持了平台无关性,但是付出了一定代价。因为在程序执行时进行编译,所以编译代码的时间将计入程序的执行时间。任何编写过大型 C 或 C++ 程序的人都知道,编译过程往往较慢。

为了克服这个缺点,现代的 JIT
编译器使用了下面两种方法的任意一种(某些情况下同时使用了这两种方法)。第一种方法是:编译所有的代码,但是不执行任何耗时多的分析和转换,因此可以快
速生成代码。由于生成代码的速度很快,因此尽管可以明显观察到编译带来的开销,但是这很容易就被反复执行本地代码所带来的性能改善所掩盖。第二种方法是:
将编译资源只分配给少量的频繁执行的方法(通常称作热方法)。低编译开销更容易被反复执行热代码带来的性能优势掩盖。很多应用程序只执行少量的热方法,因
此这种方法有效地实现了编译性能成本的最小化。

动态编译器的一个主要的复杂性在于权衡了解编译代码的预期获益使方法的执行对整个程序的性能起多大作用。一个极端的例子是,程序执行后,您非常清楚哪些方
法对于这个特定的执行的性能贡献最大,但是编译这些方法毫无用处,因为程序已经完成。而在另一个极端,程序执行前无法得知哪些方法重要,但是每种方法的潜
在受益都最大化了。大多数动态编译器的操作介于这两个极端之间,方法是权衡了解方法预期获益的重要程度。

Java 语言需要动态加载类这一事实对 Java
编译器的设计有着重要的影响。如果待编译代码引用的其他类还没有加载怎么办?比如一个方法需要读取某个尚未加载的类的静态字段值。Java
语言要求第一次执行类引用时加载这个类并将其解析到当前的 JVM
中。直到第一次执行时才解析引用,这意味着没有地址可供从中加载该静态字段。编译器如何处理这种可能性?编译器生成一些代码,用于在没有加载类时加载并解
析类。类一旦被解析,就会以一种线程安全的方式修改原始代码位置以便直接访问静态字段的地址,因为此时已获知该地址。

IBM JIT
编译器中进行了大量的努力以便使用安全而有效率的代码补丁技术,因此在解析类之后,执行的本地代码只加载字段的值,就像编译时已经解析了字段一样。另外一
种方法是生成一些代码,用于在查明字段的位置以前一直检查是否已经解析字段,然后加载该值。对于那些由未解析变成已解析并被频繁访问的字段来说,这种简单
的过程可能带来严重的性能问题。

动态编译的优点

动态地编译 Java 程序有一些重要的优点,甚至能够比静态编译语言更好地生成代码,现代的 JIT 编译器常常向生成的代码中插入挂钩以收集有关程序行为的信息,以便如果要选择方法进行重编译,就可以更好地优化动态行为。

关于此方法的一个很好的例子是收集一个特定 array操作的长度。如果发现每次执行操作时该长度基本不变,则可以为最频繁使用的

array长度生成专门的代码,或者可以调用调整为该长度的代码序列。由于内存系统和指令集设计的特性,用于复制内存的最佳通用例程的执行速度通
常比用于复制特定长度的代码慢。例如,复制 8
个字节的对齐的数据可能需要一到两条指令直接复制,相比之下,使用可以处理任意字节数和任意对齐方式的一般复制循环可能需要 10 条指令来复制同样的 8

个字节。但是,即使此类专门的代码是为某个特定的长度生成的,生成的代码也必须正确地执行其他长度的复制。生成代码只是为了使常见长度的操作执行得更快,
因此平均下来,性能得到了改进。此类优化对大多数静态编译语言通常不实用,因为所有可能的执行中长度恒定的操作比一个特定程序执行中长度恒定的操作要少得
多。

此类优化的另一个重要的例子是基于类层次结构的优化。例如,一个虚方法调用需要查看接收方对象的类调用,以便找出哪个实际目标实现了接收方对象的虚方法。
研究表明:大多数虚调用只有一个目标对应于所有的接收方对象,而 JIT
编译器可以为直接调用生成比虚调用更有效率的代码。通过分析代码编译后类层次结构的状态,JIT
编译器可以为虚调用找到一个目标方法,并且生成直接调用目标方法的代码而不是执行较慢的虚调用。当然,如果类层次结构发生变化,并且出现另外的目标方法,
则 JIT
编译器可以更正最初生成的代码以便执行虚调用。在实践中,很少需要作出这些更正。另外,由于可能需要作出此类更正,因此静态地执行这种优化非常麻烦。

因为动态编译器通常只是集中编译少量的热方法,所以可以执行更主动的分析来生成更好的代码,使编译的回报更高。事实上,大部分现代的
JIT
编译器也支持重编译被认为是热方法的方法。可以使用静态编译器(不太强调编译时间)中常见的非常主动的优化来分析和转换这些频繁执行的方法,以便生成更好
的代码并获得更高的性能。

这些改进及其他一些类似的改进所产生的综合效果是:对于大量的 Java 应用程序来说,动态编译已经弥补了与 C 和 C++ 之类语言的静态本地编译性能之间的差距,在某些情况下,甚至超过了后者的性能。

缺点

但是,动态编译确实具有一些缺点,这些缺点使它在某些情况下算不上一个理想的解决方案。例如,因为识别频繁执行的方法以及编译这些方法需要时间,所以应用
程序通常要经历一个准备过程,在这个过程中性能无法达到其最高值。在这个准备过程中出现性能问题有几个原因。首先,大量的初始编译可能直接影响应用程序的
启动时间。不仅这些编译延迟了应用程序达到稳定状态的时间(想象 Web
服务器经
历一个初始阶段后才能够执行实际有用的工作),而且在准备阶段中频繁执行的方法可能对应用程序的稳定状态的性能所起的作用也不大。如果 JIT
编译会延迟启动又不能显着改善应用程序的长期性能,则执行这种编译就非常浪费。虽然所有的现代 JVM
都执行调优来减轻启动延迟,但是并非在所有情况下都能够完全解决这个问题。

其次,有些应用程序完全不能忍受动态编译带来的延迟。如 GUI 接口之类交互式应用程序就是这样的例子。在这种情况下,编译活动可能对用户使用造成不利影响,同时又不能显着地改善应用程序的性能。

最后,用于实时环境并具有严格的任务时限的应用程序可能无法忍受编译的不确定性性能影响或动态编译器本身的内存开销。

因此,虽然 JIT 编译技术已经能够提供与静态语言性能相当(甚至更好)的性能水平,但是动态编译并不适合于某些应用程序。在这些情况下,Java 代码的提前(Ahead-of-time,AOT)编译可能是合适的解决方案。

AOT Java 编译

大致说来,Java 语言本地编译应该是为传统语言(如 C++ 或
Fortran)而开发的编译技术的一个简单应用。不幸的是,Java 语言本身的动态特性带来了额外的复杂性,影响了 Java
程序静态编译代码的质量。但是基本思想仍然是相同的:在程序执行前生成 Java 方法的本地代码,以便在程序运行时直接使用本地代码。目的在于避免
JIT 编译器的运行时性能消耗或内存消耗,或者避免解释程序的早期性能开销。

挑战

动态类加载是动态 JIT 编译器面临的一个挑战,也是 AOT
编译的一个更重要的问题。只有在执行代码引用类的时候才加载该类。因为是在程序执行前进行 AOT
编译的,所以编译器无法预测加载了哪些类。就是说编译器无法获知任何静态字段的地址、任何对象的任何实例字段的偏移量或任何调用的实际目标,甚至对直接调
用(非虚调用)也是如此。在执行代码时,如果证明对任何这类信息的预测是错误的,这意味着代码是错误的并且还牺牲了 Java 的一致性。

因为代码可以在任何环境中执行,所以类文件可能与代码编译时不同。例如,一个 JVM
实例可能从磁盘的某个特定位置加载类,而后面一个实例可能从不同的位置甚至网络加载该类。设想一个正在进行 bug
修复的开发环境:类文件的内容可能随不同的应用程序的执行而变化。此外,Java 代码可能在程序执行前根本不存在:比如 Java
反射服务通常在运行时生成新类来支持程序的行为。

缺少关于静态、字段、类和方法的信息意味着严重限制了 Java 编译器中优化框架的大部分功能。内联可能是静态或动态编译器应用的最重要的优化,但是由于编译器无法获知调用的目标方法,因此无法再使用这种优化。

内联

内联是一种用于在运行时生成代码避免程序开始和结束时开销的技术,方法是将函数的调用代码插入到调用方的函数中。但是内联最大的益处可能是优化方可见的代码的范围扩大了,从而能够生成更高质量的代码。下面是一个内联前的代码示例:

int foo() { int x=2, y=3; return bar(x,y); }final int bar(int a, int b) { return a+b; }

如果编译器可以证明这个 bar就是 foo()中调用的那个方法,则 bar中的代码可以取代 foo()中对
bar()的调用。这时,bar()方法是 final类型,因此肯定是 foo()中调用的那个方法。甚至在一些虚调用例子中,动态 JIT
编译器通常能够推测性地内联目标方法的代码,并且在绝大多数情况下能够正确使用。编译器将生成以下代码:

int foo() { int x=2, y=3; return x+y; }

在这个例子中,简化前名为值传播的优化可以生成直接返回
5的代码。如果不使用内联,则不能执行这种优化,产生的性能就会低很多。如果没有解析
bar()方法(例如静态编译),则不能执行这种优化,而代码必须执行虚调用。运行时,实际调用的可能是另外一个执行两个数字相乘而不是相加的
bar方法。所以不能在 Java 程序的静态编译期间直接使用内联。

AOT
代码因此必须在没有解析每个静态、字段、类和方法引用的情况下生成。执行时,每个这些引用必须利用当前运行时环境的正确值进行更新。这个过程可能直接影响
第一次执行的性能,因为在第一次执行时将解析所有引用。当然,后续执行将从修补代码中获益,从而可以更直接地引用实例、静态字段或方法目标。

另外,为 Java 方法生成的本地代码通常需要使用仅在单个 JVM 实例中使用的值。例如,代码必须调用 JVM
运行时中的某些运行时例程来执行特定操作,如查找未解析的方法或分配内存。这些运行时例程的地址可能在每次将 JVM 加载到内存时变化。因此 AOT
编译代码需要绑定到 JVM 的当前执行环境中,然后才能执行。其他的例子有字符串的地址和常量池入口的内部位置。

在 WebSphere Real Time 中,AOT 本地代码编译通过 jxeinajar工具(参见图 2)来执行。该工具对 JAR 文件中所有类的所有方法应用本地代码编译,也可以选择性地对需要的方法应用本地代码编译。结果被存储到名为 Java eXEcutable (JXE) 的内部格式中,但是也可轻松地存储到任意的持久性容器中。

您可能认为对所有的代码进行静态编译是最好的方法,因为可以在运行时执行最大数量的本地代码。但是此处可以作出一些权衡。编译的方法越多,代码占用的内存
就越多。编译后的本地代码大概比字节码大 10 倍:本地代码本身的密度比字节码小,而且必须包含代码的附加元数据,以便将代码绑定到 JVM
中,并且在出现异常或请求堆栈跟踪时正确执行代码。构成普通 Java 应用程序的 JAR
文件通常包含许多很少执行的方法。编译这些方法会消耗内存却没有什么预期收益。相关的内存消耗包括以下过程:将代码存储到磁盘上、从磁盘取出代码并装入
JVM,以及将代码绑定到 JVM。除非多次执行代码,否则这些代价不能由本地代码相对解释的性能优势来弥补。

图 2. jxeinajar

跟大小问题相违背的一个事实是:在编译过的方法和解释过的方法之间进行的调用(即编译过的方法调用解释过的方法,或者相反)可能比这两类方法各自内部之间
进行的调用所需的开销大。动态编译器通过最终编译所有由 JIT
编译代码频繁调用的那些解释过的方法来减少这项开销,但是如果不使用动态编译器,则这项开销就不可避免。因此如果是选择性地编译方法,则必须谨慎操作以使
从已编译方法到未编译方法的转换最小化。为了在所有可能的执行中都避免这个问题而选择正确的方法会非常困难。
优点
虽然 AOT 编译代码具有上述的缺点和挑战,但是提前编译 Java 程序可以提高性能,尤其是在不能将动态编译器作为有效解决方案的环境中。

可以通过谨慎地使用 AOT 编译代码加快应用程序启动,因为虽然这种代码通常比 JIT
编译代码慢,但是却比解释代码快很多倍。此外,因为加载和绑定 AOT
编译代码的时间通常比检测和动态编译一个重要方法的时间少,所以能够在程序执行的早期达到那样的性能。类似地,交互式应用程序可以很快地从本地代码中获
益,无需使用引起较差响应能力的动态编译。

RT 应用程序也能从 AOT 编译代码中获得重要的收益:更具确定性的性能超过了解释的性能。WebSphere Real Time
使用的动态 JIT 编译器针对在 RT 系统中的使用进行了专门的调整。使编译线程以低于 RT
任务的优先级操作,并且作出了调整以避免生成带有严重的不确定性性能影响的代码。但是,在一些 RT 环境中,出现 JIT
编译器是不可接受的。此类环境通常需要最严格的时限管理控制。在这些例子中,AOT
编译代码可以提供比解释过的代码更好的原始性能,又不会影响现有的确定性。消除 JIT
编译线程甚至消除了启动更高优先级 RT 任务时发生的线程抢占所带来的性能影响。

优缺点统计

动态(JIT)编译器支持平台中立性,并通过利用应用程序执行的动态行为和关于加载的类及其层次结构的信息来生成高质量的代码。但是
JIT
编译器具有一个有限的编译时预算,而且会影响程序的运行时性能。另一方面,静态(AOT)编译器则牺牲了平台无关性和代码质量,因为它们不能利用程序的动
态行为,也不具有关于加载的类或类层次结构的信息。AOT 编译拥有有效无限制的编译时预算,因为 AOT
编译时间不会影响运行时性能,但是在实践中开发人员不会长期等待静态编译步骤的完成。

表 1 总结了本文讨论的 Java 语言动态和静态编译器的一些特性:

表 1. 比较编译技术

两种技术都需要谨慎选择编译的方法以实现最高的性能。对动态编译器而言,编译器自身作出决策,而对于静态编译器,由开发人员作出选择。让
JIT 编译器选择编译的方法是不是优点很难说,取决于编译器在给定情形中推断能力的好坏。在大多数情况下,我们认为这是一种优点。

因为它们可以最好地优化运行中的程序,所以 JIT 编译器在提供稳定状态性能方面更胜一筹,而这一点在大量的生产 Java
系统中最为重要。静态编译可以产生最佳的交互式性能,因为没有运行时编译行为来影响用户预期的响应时间。通过调整动态编译器可以在某种程度上解决启动和确
定性性能问题,但是静态编译在需要时可提供最快的启动速度和最高级别的确定性。表 2 在四种不同的执行环境中对这两种编译技术进行了比较:

表 2. 使用这些技术的最佳环境

图 3 展示了启动性能和稳定状态性能的总体趋势:

图 3. AOT 和 JIT 的性能对比

使用 JIT 编译器的初始阶段性能很低,因为要首先解释方法。随着编译方法的增多及 JIT
执行编译所需时间的缩短,性能曲线逐渐升高最后达到性能峰值。另一方面,AOT 编译代码启动时的性能比解释的性能高很多,但是无法达到 JIT
编译器所能达到的最高性能。将静态代码绑定到 JVM 实例中会产生一些开销,因此开始时的性能比稳定状态的性能值低,但是能够比使用 JIT
编译器更快地达到稳定状态的性能水平。

没有一种本地代码编译技术能够适合所有的 Java
执行环境。某种技术所擅长的通常正是其他技术的弱项。出于这个原因,需要同时使用这两种编译技术以满足 Java
应用程序开发人员的要求。事实上,可以结合使用静态和动态编译以便提供最大可能的性能提升 —— 但是必须具备平台无关性,它是 Java
语言的主要卖点,因此不成问题。

结束语

本文探讨了 Java 语言本地代码编译的问题,主要介绍了 JIT 编译器形式的动态编译和静态 AOT 编译,比较了二者的优缺点。

虽然动态编译器在过去的十年里实现了极大的成熟,使大量的各种 Java 应用程序可以赶上或超过静态编译语言(如 C++ 或
Fortran)所能够达到的性能。但是动态编译在某些类型的应用程序和执行环境中仍然不太合适。虽然 AOT
编译号称动态编译缺点的万能解决方案,但是由于 Java 语言本身的动态特性,它也面临着提供本地编译全部潜能的挑战。

这两种技术都不能解决 Java 执行环境中本地代码编译的所有需求,但是反过来又可以在最有效的地方作为工具使用。这两种技术可以相互补充。能够恰当地使用这两种编译模型的运行时系统可以使很大范围内的应用程序开发环境中的开发人员和用户受益。

Ⅳ 编译语言那几种详讲!

C/C++:C/C++ 自从C发明了以后,它就取代了汇编语言在操作系统编程的领导地位。从性能上说,除了汇编语言,C语言是最接近机器的语言。各种操作系统的编程接口的默认语言都是C语言。因此,用C语言编程,可以最大限度发挥操作系统的能力。同时,由于绝大部分的商品软件都是C或与C兼容的C++实现的,都有C编程接口,可以说,没有C不能实现的功能。 C++是C语言的加强版,C++增加了面向对象和其他有用的功能,但它的效能并没有大减,编程更方便轻松;而C++亦支援大部分C的程序,令C++和C变得近乎不可分割,大部分的C编译器也支援C++。假如要在学C或学C++选择,学C++是明智的选择
Delphi(Object Pasacal):
Delphi是Borland公司研制的新一代可视化开发工具,可在Windows3.x、Windows95、WindowsNT等环境下使用。它拥有一个可视化的集成开发环境(IDE),采用面向对象的编程语言ObjectPascal和基于部件的开发结构框架。Delphi它提供了100多个可供使用的构件,利用这些部件,开发人员可以快速地构造出应用系统。开发人员也可以根据自己的需要修改部件或用Delphi本身编写自己的部件。主要特点如下: (1)直接编译生成可执行代码,编译速度快。由于Delphi编译器采用了条件编译和选择链接技术,使用它生成的执行文件更加精炼,运行速度更快。在处理速度和存取服务器方面,Delphi的性能远远高于其他同类产品。 (2)支持将存取规则分别交给客户机或服务器处理的两种方案,而且允许开发人员建立一个简单的部件或部件集合,封装起所有的规则,并独立于服务器和客户机,所有的数据转移通过这些部件来完成。这样,大大减少了对服务器的请求和网络上的数据传输量,提高了应用处理的速度。 (3)提供了许多快速方便的开发方法,使开发人员能用尽可能少的重复性工作完成各种不同的应用。利用项目模板和专家生成器可以很快建立项目的构架,然后根据用户的实际需要逐步完善。 (4)具有可重用性和可扩展性。开发人员不必再对诸如标签、按钮及对话框等Windows的常见部件进行编程。Delphi包含许多可以重复使用的部件,允许用户控制Windows的开发效果。 (5)具有强大的数据存取功能。它的数据处理工具BDE(BorlandDatabaseEngine)是一个标准的中介软件层,可以用来处理当前流行的数据格式,如xBase、Paradox等,也可以通过BDE的SQLLink直接与Sybase、SQLServer、Informix、Oracle等大型数据库连接。 Delphi既可用于开发系统软件,也适合于应用软件的开发。

Ⅳ 编程语言有几种,分别都是编什么程序的

计算机语言的种类非常的多,总的来说可以分成机器语言,汇编语言,高级语言三大类。

电脑每做的一次动作,一个步骤,都是按照以经用计算机语言编好的程序来执行的,程序是计算机要执行的指令的集合,而程序全部都是用我们所掌握的语言来编写的。所以人们要控制计算机一定要通过计算机语言向计算机发出命令

计算机所能识别的语言只有机器语言,即由0和1构成的代码。但通常人们编程时,不采用机器语言,因为它非常难于记忆和识别。

目前通用的编程语言有两种形式:汇编语言和高级语言。

汇编语言的实质和机器语言是相同的,都是直接对硬件操作,只不过指令采用了英文缩写的标识符,更容易识别和记忆。它同样需要编程者将每一步具体的操作用命令的形式写出来。汇编程序通常由三部分组成:指令、伪指令和宏指令。汇编程序的每一句指令只能对应实际操作过程中的一个很细微的动作,例如移动、自增,因此汇编源程序一般比较冗长、复杂、容易出错,而且使用汇编语言编程需要有更多的计算机专业知识,但汇编语言的优点也是显而易见的,用汇编语言所能完成的操作不是一般高级语言所能实现的,而且源程序经汇编生成的可执行文件不仅比较小,而且执行速度很快。

高级语言是目前绝大多数编程者的选择。和汇编语言相比,它不但将许多相关的机器指令合成为单条指令,并且去掉了与具体操作有关但与完成工作无关的细节,例如使用堆栈、寄存器等,这样就大大简化了程序中的指令。同时,由于省略了很多细节,编程者也就不需要有太多的专业知识。

高级语言主要是相对于汇编语言而言,它并不是特指某一种具体的语言,而是包括了很多编程语言,如目前流行的VB、VC、FoxPro、Delphi等,这些语言的语法、命令格式都各不相同。

高级语言所编制的程序不能直接被计算机识别,必须经过转换才能被执行,按转换方式可将它们分为两类:

解释类:执行方式类似于我们日常生活中的“同声翻译”,应用程序源代码一边由相应语言的解释器“翻译”成目标代码(机器语言),一边执行,因此效率比较低,而且不能生成可独立执行的可执行文件,应用程序不能脱离其解释器,但这种方式比较灵活,可以动态地调整、修改应用程序。

编译类:编译是指在应用源程序执行之前,就将程序源代码“翻译”成目标代码(机器语言),因此其目标程序可以脱离其语言环境独立执行,使用比较方便、效率较高。但应用程序一旦需要修改,必须先修改源代码,再重新编译生成新的目标文件(* .OBJ)才能执行,只有目标文件而没有源代码,修改很不方便。现在大多数的编程语言都是编译型的,例如Visual C++、Visual Foxpro、Delphi等。

[NextPage]

学习编程,从何入手

如果您想学习编程,却又不知从何入手,那么您不妨看看下面的几种学习方案,可能会给您一些启示吧!
==============================================
方案一 Basic语言 & Visual Basic

优点
(1)Basic 简单易学,很容易上手。
(2)Visual Basic 提供了强大的可视化编程能力,可以让你轻松地做出漂亮的程序。
(3)众多的控件让编程变得象垒积木一样简单。
(4)Visual Basic 的全部汉化让我们这些见了English就头大的人喜不自禁。

缺点
(1)Visual Basic 不是真正的面向对象的开发文具。
(2)Visual Basic 的数据类型太少,而且不支持指针,这使得它的表达能力很有限。
(3)Visual Basic 不是真正的编译型语言,它产生的最终代码不是可执行的,是一种伪代码。它需要一个动态链接库去解释执行,这使得Visual Basic 的编译速度大大变慢。

综述:方案一适合初涉编程的朋友,它对学习者的要求不高,几乎每个人都可以在一个比较短的时间里学会vB编程,并用VB 做出自己的作品。对于那些把编程当做游戏的朋友来说,VB 是您最佳的选择。

Basic/Visual Basic简介
==============================================
方案二 Pascal语言 & Delphi

优点
(1)Pascal语言结构严谨,可以很好地培养一个人的编程思想。
(2)Delphi是一门真正的面向对象的开发工具,并且是完全的可视化。
(3)Delphi使用了真编译,可以让你的代码编译成为可执行的文件,而且编译速度非常快。
(4)Delphi具有强大的数据库开发能力,可以让你轻松地开发数据库。

缺点
Delphi几乎可以说是完美的,只是Pascal语言的过于严谨让人感觉有点烦。

综述: 方案二比较适合那些具有一定编程基础并且学过Pascal语言的朋友。

Pascal语言简介
Delphi简介
==============================================
方案三 C语言 & Visual C++

优点
(1)C语言灵活性好,效率高,可以接触到软件开发比较底层的东西。
(2)微软的MFC库博大精深,学会它可以让随心所欲地进行编程。
(3)VC是微软制作的产品,与操作系统的结合更加紧密。

缺点
对使用者的要求比较高,既要具备丰富的C语言编程经验,又要具有一定的WINDOWS编程基础,它的过于专业使得一般的编程爱好者学习起来会有不小的困难。

综述: VC是程序员用的东西。如果你是一个永不满足的人,而且可以在编程上投入很大的精力和时间,那么学习VC你一定不会后悔的。

C语言简介
==============================================
方案四 C++语言 & C++ Builder

优点
(1)C++语言的优点全部得以继承。
(2)完全的可是化。
(3)极强的兼容性,支持OWL、VCL和MFC三大类库。
(4)编译速度非常快。

缺点
由于推出的时间太短,关于它的各种资料还不太多。

综述:我认为C++ Builder 是最好的编程工具。它既保持了C++语言编程的优点,又做到了完全的可视化。

C语言简介
==============================================
方案五 SQL语言 & Power Builder

对于一些传统的数据开发人员来说,Foxpro系列也许让他们感到更加熟悉。但是对于初学者来说,PowerBuilder也许是最好的数据库开发工具。各种各样的控件,功能强大的PowerBuilder语言都会帮助你开发出自己的数据库应用程序。

[NextPage]
JSP简介

在Sun正式发布JSP(Java Server Pages)之后,这种新的Web应用开发技术很快引起了人们的关注。JSP为创建高度动态的Web应用提供了一个独特的开发环境。按照 Sun 的说法,JSP能够适应市场上包括Apache WebServer 、IIS4.0在内的85%的服务器产品。

JSP与ASP的简单比较

JSP与Microsoft的ASP技术非常相似。两者都提供在HTML代码中混合某种程序代码、由语言引擎解释执行程序代码的能力。在ASP或JSP环境下,HTML代码主要负责描述信息的显示样式,而程序代码则用来描述处理逻辑。普通的HTML页面只依赖于Web服务器,而ASP和JSP页面需要附加的语言引擎分析和执行程序代码。程序代码的执行结果被重新嵌入到HTML代码中,然后一起发送给浏览器。ASP和JSP都是面向Web服务器的技术,客户端浏览器不需要任何附加的软件支持。

ASP的编程语言是VBScript之类的脚本语言,JSP使用的是Java,这是两者最明显的区别。

此外,ASP与JSP还有一个更为本质的区别:两种语言引擎用完全不同的方式处理页面中嵌入的程序代码。在ASP下,VBScript代码被ASP引擎解释执行;在JSP下,代码被编译成Servlet并由Java虚拟机执行,这种编译操作仅在对JSP页面的第一次请求时发生。

运行环境

执行 JSP 代码需要在服务器上安装 JSP 引擎。此处我们使用的是 Sun 的 JavaServer Web Development Kit ( JSWDK )。为便于学习,这个软件包提供了大量可供修改的示例。安装 JSWDK 之后,只需执行 startserver 命令即可启动服务器。在默认配置下服务器在端口 8080 监听,使用 http://localhost:8080 即可打开缺省页面。

在运行 JSP 示例页面之前,请注意一下安装 JSWDK 的目录,特别是" work "子目录下的内容。执行示例页面时,可以在这里看到 JSP 页面如何被转换成 Java 源文件,然后又被编译成 class 文件(即 Servlet )。 JSWDK 软件包中的示例页面分为两类,它们或者是 JSP 文件,或者是包含一个表单的 HTML 文件,这些表单均由 JSP 代码处理。与 ASP 一样, JSP 中的 Java 代码均在服务器端执行。因此,在浏览器中使用"查看源文件"菜单是无法看到 JSP 源代码的,只能看到结果 HTML 代码。所有示例的源代码均通过一个单独的" examples "页面提供。

Java Servlet是一种开发Web应用的理想构架。 JSP以Servlet技术为基础,又在许多方面作了改进。JSP页面看起来象普通HTML页面,但它允许嵌入执行代码,在这一点上,它和ASP技术非常相似。利用跨平台运行的JavaBean 组件,JSP为分离处理逻辑与显示样式提供了卓越的解决方案。JSP必将成为ASP技术的有力竞争者。

[NextPage]
SQL语言简介

SQL全称是“结构化查询语言(Structured Query Language)”,最早的是IBM的圣约瑟研究实验室为其关系数据库管理系统SYSTEM R开发的一种查询语言,它的前身是SQUARE语言。SQL语言结构简洁,功能强大,简单易学,所以自从IBM公司1981年推出以来,SQL语言,得到了广泛的应用。如今无论是像Oracle ,Sybase,Informix,SQL server这些大型的数据库管理系统,还是像Visual Foxporo,PowerBuilder这些微机上常用的数据库开发系统,都支持SQL语言作为查询语言。

Structured Query Language包含4个部分:

数据查询语言DQL-Data Query Language SELECT
数据操纵语言DQL-Data Manipulation Language INSERT, UPDATE, DELETE
数据定义语言DQL-Data Definition Language CREATE, ALTER, DROP
数据控制语言DQL-Data Control Language COMMIT WORK, ROLLBACK WORK

SQL的历史

在70年代初,E.E.Codd首先提出了关系模型。70年代中期,IBM公司在研制 SYSTEM R关系数据库管理系统中研制了SQL语言,最早的SQL语言(叫SEQUEL2)是在1976 年 11 月的IBM Journal of R&D上公布的。

1979年ORACLE公司首先提供商用的SQL,IBM公司在DB2 和SQL/DS数据库系统中也实现了SQL。

1986年10月,美国ANSI采用SQL作为关系数据库管理系统的标准语言(ANSI X3. 135-1986),后为国际标准化组织(ISO)采纳为国际标准。

1989年,美国ANSI采纳在ANSI X3.135-1989报告中定义的关系数据库管理系统的SQL标准语言,称为ANSI SQL 89, 该标准替代ANSI X3.135-1986版本。该标准为下列组织所采纳:

● 国际标准化组织(ISO),为ISO 9075-1989报告“Database Language SQL With Integrity Enhancement”
● 美国联邦政府,发布在The Federal Information Processing Standard Publication(FIPS PUB)127

目前,所有主要的关系数据库管理系统支持某些形式的SQL语言, 大部分数据库打算遵守ANSI SQL89标准。

SQL的优点

SQL广泛地被采用正说明了它的优点。它使全部用户,包括应用程序员、DBA管理员和终端用户受益非浅。

(1) 非过程化语言

SQL是一个非过程化的语言,因为它一次处理一个记录,对数据提供自动导航。SQL允许用户在高层的数据结构上工作,而不对单个记录进行操作,可操作记录集。所有SQL 语句接受集合作为输入,返回集合作为输出。SQL的集合特性允许一条SQL语句的结果作为另一条SQL语句的输入。 SQL不要求用户指定对数据的存放方法。 这种特性使用户更易集中精力于要得到的结果。所有SQL语句使用查询优化器,它是RDBMS的一部分,由它决定对指定数据存取的最快速度的手段。查询优化器知道存在什么索引,哪儿使用合适,而用户从不需要知道表是否有索引,表有什么类型的索引。

(2) 统一的语言

SQL可用于所有用户的DB活动模型,包括系统管理员、数据库管理员、 应用程序员、决策支持系统人员及许多其它类型的终端用户。基本的SQL 命令只需很少时间就能学会,最高级的命令在几天内便可掌握。 SQL为许多任务提供了命令,包括:

● 查询数据
● 在表中插入、修改和删除记录
● 建立、修改和删除数据对象
● 控制对数据和数据对象的存取
● 保证数据库一致性和完整性

以前的数据库管理系统为上述各类操作提供单独的语言,而SQL 将全部任务统一在一种语言中。

(3) 是所有关系数据库的公共语言

由于所有主要的关系数据库管理系统都支持SQL语言,用户可将使用SQL的技能从一个RDBMS转到另一个。所有用SQL编写的程序都是可以移植的。

[NextPage]
Java语言简介

一. Java的由来

当1995年SUN推出Java语言之后,全世界的目光都被这个神奇的语言所吸引。那么Java到底有何神奇之处呢?

Java语言其实最是诞生于1991年,起初被称为OAK语言,是SUN公司为一些消费性电子产品而设计的一个通用环境。他们最初的目的只是为了开发一种独立于平台的软件技术,而且在网络出现之前,OAK可以说是默默无闻,甚至差点夭折。但是,网络的出现改变了OAK的命运。

在Java出现以前。Internet上的信息内容都是一些乏味死板的HTML文档。这对于那些迷恋于WEB浏览的人们来说简直不可容忍。他们迫切希望能在WEN中看到一些交互式的内容,开发人员也极希望能够在WEB上创建一类无需考虑软硬件平台就可以执行的应用程序,当然这些程序还要有极大的安全保障。对于用户的这种要求,传统的编程语言显得无能为力,面SUN的工程师敏锐地察觉到了这一点,从1994年起,他们开始将OAK技术应用于WEB上,并且开发出了HotJava的第一个版本。当SUN公司1995年正式以Java这个名字推出的时候,几乎所有的WEB开发人员都想到:噢,这正是我想要的。于是Java成了一颗耀眼的明星,丑小鸭一下了变成了白天鹅。

二. Java的定义

Java是一种简单的,面象对象的,分布式的,解释的,键壮的安全的,结构的中立的,可移植的,性能很优异的多线程的,动态的语言。

Java的开发环境有不同的版本,如sun公司的Java Developers Kit, 简称 JDK。后来微软公司推出了支持Java规范的Microsoft Visual J++ Java开发环境,简称 VJ++。

三. Java的特点

1. 平台无关性

平台无关性是指Java能运行于不同的平台。Java引进虚拟机 原理,并运行于虚拟机,实现不同平台的Java接口之间。使 用Java编写的程序能在世界范围内共享。Java的数据类型与 机器无关,Java虚拟机(Java Virtual Machine)是建立在 硬件和操作系统之上,实现Java二进制代码的解释执行功能, 提供于不同平台的接口的。

2. 安全性

Java的编程类似C++,学习过C++的读者将很快掌握Java的精 髓。Java舍弃了C++的指针对存储器地址的直接操作,程序 运行时,内存由操作系统分配,这样可以避免病毒通过指 针侵入系统。Java对程序提供了安全管理器,防止程序的 非法访问。

3. 面向对象

Java 吸取了C++面向对象的概念,将数据封装于类中,利用类 的优点,实现了程序的简洁性和便于维护性。类的封装性、 继承性等有关对象的特性,使程序代码只需一次编译,然后 通过上述特性反复利用。程序员只需把主要精力用在类和接 口的设计和应用上。Java 提供了众多的一般对象的类,通 过继承即可使用父类的方法。在 Java 中,类的继承关系是单一的非多重的,一个子类 只有一个父类,子类的父类又有一个父类。Java 提供的 Object 类及其子类的继承关系如同一棵倒立的树形,根类 为 Object 类, Object 类功能强大,经常会使用到它及其 它派生的子类。

4. 分布式

Java建立在扩展TCP/IP网络平台上。库函数提供了用HTTP和FTP协议传送和接受信息的方法。这使得程序员使用网络上的文件和使用本机文件一样容易。

5. 键壮性

Java致力于检查程序在编译和运行时的错误。类型检查帮助检查出许多开发早期出现的错误。Java自已操纵内存减少了内存出错的可能性。Java还实现了真数组,避免了覆盖数据的可能。这些功能特征大大提高了开发Java应用程序的周期。Java提供: Null指针检测、 数组边界检测、 异常出口、 Byte code校验。

四. Java与C/C++语言

Java提供了一个功能强大语言的所有功能,但几乎没有一点含混特征。C++安全性不好,但C和C++被大家接受,所以Java设计成C++形式,让大家很容易学习。

Java去掉了C++语言的许多功能,让Java的语言功能很精炼,并增加了一些很有用的功能,如自动收集碎片。

Java去掉了以下几个C和C++功能:
指针运算
结构
typedefs
#define
需要释放内存

这将减少了平常出错的50%。而且,Java很小,整个解释器只需215K的RAM。

面象对象:Java实现了C++的基本面象对象技术并有一些增强,(为了语言简单,删除了一些功能)。Java处理数据方式和用对象接口处理对象数据方式一样。

五. Java与Internet

我们知道,早先的 www 仅可以传送文本和图片,Java的出现实现了互动的页面,是一次伟大的革命。

Java并不是为 Internet,WWW而设计的,它也可以用来编写独立的应用程序。Java 是一种面向对象语言。Java 语言类似于 C++ 语言,所以已熟练掌握 C++语言的编程人员,再学习 Java 语言就容易得多!Java 程序需要编译。实际上有两种 Java 程序:一种 Java 应用程序是一个完整的程序,如 Web 浏览器。一种 Java 小应用程序是运行于 Web 浏览器中的一个程序.

Java程序和它的浏览器HotJava,提供了可让你的浏览器运行程序的方法。你能从你的浏览器里直接播放声音。你还能播放页面里的动画。Java还能告诉你的浏览器怎样处理新的类型文件。当我们能在2400 baud线上传输视频图象时,HotJava将能显示这些视频。

当今Internet的一大发展趋势是电子商务,而Internet的安全问题是必须解决的问题,通常大的部门应设置防火墙,阻止非法侵入。

电子商务是当今的热门话题,然而传统的编程语言难以胜任电子商务系统,电子商务要求程序代码具有基本的要求:安全、可靠、同时要求能 与运行于不同平台的机器的全世界客户开展业务。Java以其强安全性、平台无关性、硬件结构无关性、语言简洁同时面向对象,在网络编程语言中占据无可比拟的优势,成为实现电子商务系统的首选语言。

Java程序被放置在Internet服务器上,当用户访问服务器时,Java程序被下载到本地的用户机上,由浏览器解释运行。

[NextPage]
PowerBuilder简介

PowerBuilder的产生

PowerBuilder是美国着名的数据库应用开发工具生产厂商PowerSoft推出的成功产品,其第一版于1991年6月正式投入市场。它是完全按照客户/服务器体系结构研制设计的,采用面向对象技术,图形化的应用开发环境,是数据库的前端开发工具。

PowerBuilder的特点

它支持应用系统同时访问多种数据库,其中既包括Oracel,Sybase之类的大型数据库,又包括FOXPRO之类支持ODBC接口的小型数据库,PowerBuilder是完全可视化的数据库开发工具,它提供了大量的控件,大大加快了项目的开发速度,也使开发者更容易掌握数据库的开发。

它使用的编程语言叫做工PowerScripr,它也是一种高级的,结构化的编程语言。PowerScript提供了一套完整的嵌入式SQL语句,开发人员可以像使用其它语句一样自由地使用SQL语言,这样就大大增强了程序操纵和访问数据库的能力。可以说PowerBuilder既适合初学者快速学习数据库的开发,又可以让有经验的开发人员开发出功能强大的数据库,是一种适用面非常广的开发工具。

PowerBuilder是一个用来进行客户/服务器开发的完全的可视化开发环境。使用PowerBuilder,你可以用一种可视的直观的方式来创建应用程序的用户界面和数据库接口。这是一个总的概念,实际上是开发人员使用PowerBuilder去开发应用程序,由于所开发的各种应用程序充分利用了图形用户接口(GUI)的优点,所以PowerBuilder被认为是一个图形工具。

在客户/服务器结构的应用中,PowerBuilder具有描述多个数据库连接与检索的能力。特别是PowerBuilder能从大多数流行的RDBMS中存取数据,且不管数据存放在什麽地方;另外,各种应用程序又可以独立于RDBMS,因为PowerBuilder可以使用数据库的标准操作语言SQL(结构化查询语言)进行。

使用PowerBuilder,可以很容易地开发出功能强大的图形界面的访问服务器数据库的应用程序,PowerBuilder提供了建立符合工业标准的应用程序(例如订单登记、会计及制造系统)所需的所有工具。

PowerBuilder应用程序由窗口组成,这些窗口包含用户与之交互的控件。开发人员可以使用所有标准空间(如按钮、复选框、下拉式列表框或编辑框)以及PowerBuilder提供的特殊的使应用程序更易于开发和使用的控件。

通常人们把PowerBuilder看成是一种开发工具,实际上它比其他工具强得多,是一种强有力的开发环境。开发人员不仅能用它来开发用户容易使用的各种应用程序还可以通过PowerBuilder修改数据库,利用400多个内部定义函数,可以开发能和其他应用程序进行的各种应用程序。

PowerBuilder正在成为客户/服务器应用开发的标准。相对于其他任何客户/服务器开发环境,PowerBuilder使开发人员的工作更快、成本更低、质量更高、功能更强。

PowerBuilder为应用开发提供了全面综合性的支持,可以分别概括为如下几点:

事件驱动的应用程序
功能强大的编程语言与函数
面向对象的编程
跨平台开发
开放的数据库连结系统

PowerBuilder开发环境

PowerBuilder开发环境由一系列集成的图形画板(Painter)组成,应用开发人员通过简单的鼠标操作即可设计、建立、交互检验和测试客户/服务器应用程序。
[NextPage]
Delphi简介

Delphi这个名字源于古希腊的城市名。它集中了第三代语言

Ⅵ java常用编译组件的种类及其特点

1、JDK (Java Development Kit)Java开发工具集

从初学者角度来看,采用JDK开发Java程序能够很快理解程序中各部分代码之间的关系,有利于理解Java面向对象的设计思想。JDK的另一个显着特点是随着Java (J2EE、J2SE以及J2ME)版本的升级而升级。但它的缺点也是非常明显的就是从事大规模企业级Java应用开发非常困难,不能进行复杂的Java软件开发,也不利于团体协同开发。

2、Java Workshop

3、NetBeans 与Sun Java Studio 5

NetBeans是开放源码的Java集成开发环境(IDE),适用于各种客户机和Web应用。Sun Java Studio是Sun公司最新发布的商用全功能Java IDE,支持Solaris、Linux和Windows平台,适于创建和部署2层Java Web应用和n层J2EE应用的企业开发人员使用。

NetBeans是业界第一款支持创新型Java开发的开放源码IDE。开发人员可以利用业界强大的开发工具来构建桌面、Web或移动应用。同时,通过NetBeans和开放的API的模块化结构,第三方能够非常轻松地扩展或集成NetBeans平台。

NetBeans3.5.1主要针对一般Java软件的开发者,而Java One Studio5则主要针对企业做网络服务等应用的开发者。Sun不久还将推出Project Rave,其目标是帮助企业的开发者进行软件开发。

NetBeans 3.5.1版本与其他开发工具相比,最大区别在于不仅能够开发各种台式机上的应用,而且可以用来开发网络服务方面的应用,可以开发基于J2ME的移动设备上的应用等。在NetBeans 3.5.1基础上,Sun开发出了Java One Studio5,为用户提供了一个更加先进的企业编程环境。在新的Java One Studio5里有一个应用框架,开发者可以利用这些模块快速开发自己在网络服务方面的各种应用程序。

4、Borland 的JBuilder

Jbuilder进入了Java集成开发环境的王国,它满足很多方面的应用,尤其是对于服务器方以及EJB开发者们来说。下面简单介绍一下Jbuilder的特点:

1)Jbuilder支持最新的Java技术,包括Applets、JSP/Servlets、JavaBean以及EJB(Enterprise JavaBeans)的应用。

2)用户可以自动地生成基于后端数据库表的EJB Java类,Jbuilder同时还简化了EJB的自动部署功能.此外它还支持CORBA,相应的向导程序有助于用户全面地管理IDL(分布应用程序所必需的接口定义语言Interface Definition Language)和控制远程对象。

3)Jbuilder支持各种应用服务器。Jbuilder与Inprise Application Server紧密集成,同时支持WebLogic Server,支持EJB 1.1和EJB 2.0,可以快速开发J2EE的电子商务应用。

4)Jbuilder能用Servlet和JSP开发和调试动态Web 应用。

5)利用Jbuilder可创建(没有专有代码和标记)纯Java2应用。由于Jbuilder是用纯Java语言编写的,其代码不含任何专属代码和标记,它支持最新的Java标准。

6)Jbuilder拥有专业化的图形调试接口,支持远程调试和多线程调试,调试器支持各种JDK版本,包括J2ME/J2SE/J2EE。

JBuilder环境开发程序方便,它是纯的Java 开发环境,适合企业的J2EE开发;缺点是往往一开始人们难于把握整个程序各部分之间的关系,对机器的硬件要求较高,比较吃内存,这时运行速度显得较慢。

5、Oracle 的JDeveloper

Oracle9i JDeveloper(定为9.0版,最新为10g)为构建具有J2EE功能,XML和Web services的复杂的,多层的 Java应用程序提供了一个完全集成的开发环境。它为运用Oracle9i数据库和应用服务器的开发人员提供特殊的功能和增强性能,除此以外,它也有资格成为用于多种用途Java开发的一个强大的工具。

Oracle9i JDeveloper的主要特点如下:

① 具有UML(Unified Modeling Language,一体化建模语言)建模功能。可以将业务对象及e-business应用模型化。

② 配备有高速Java调试器(Debuger)、内置Profiling工具、提高代码质量的工具“CodeCoach”等。

③ 支持SOAP(Simple Object Access Protocol)“简单对象访问协议”、UDDI (Universal Description, Discovery and Integration)“统一描述、发现和集成协议”、WSDL (Web Services Description Language)“WEB服务描述语言”等Web服务标准。

JDeveloper 不仅仅是很好的 Java 编程工具,而且是 Oracle Web 服务的延伸,支 Apache SOAP,以及 9iAS ,可扩充的环境和 XML 和 WSDL 语言紧密相关。Oracle9i Jdeveloper完全利用Java编写,能够与以前的 Oracle服务器软件以及其他厂商支持J2EE的应用服务器产品相兼容,而且在设计时着重针对Oracle9i,能够无缝化跨平台之间的应用开发,提供了业界第一个完整的、集成了J2EE和XML的开发环境,允许开发者快速开发可以通过Web、无线设备及语音界面访问的Web服务和交易应用,以往只能通过将传统Java编程技巧与最新模块化方式结合到一个单一集成的开发环境中之后才能完成J2EE应用开发生命周期管理的事实,从根本上得到改变。缺点就是对于初学者来说,较复杂,也比较难。

6、IBM的Visual Age for Java

Visual Age for Java是一个非常成熟的开发工具,它的特性以于IT开发者和业余的Java编程人员来说都是非常用有用的。它提供对可视化编程的广泛支持,支持利用CICS连接遗传大型机应用,支持EJB的开发应用,支持与Websphere的集成开发,方便的bean创建和良好的快速应用开发(RAD)支持和无文件式的文件处理。

IBM为建设Web站点所推出的 WebSphere Studio Advanced Edition及其包含的Visua Age for Java Professional Edition软件已全面转向以Java为中心,这样,Java开发人员对WebSphere全套工具的感觉或许会好了许多。Studio所提供的工具有:Web站点管理、快速开发 JDBC页向导程序、HTML编辑器和HTML语法检查等。这确实是个不错的HTML站点页面编辑环境。Studio和VisualAge集成度很高,菜单中提供了在两种软件包之间快速移动代码的选项。这就让使用 Studio的Web页面设计人员和使用VisualAge的Java程序员可以相互交换文件、协同工作。

Visual Age for Java支持团队开发,内置的代码库可以自动地根据用户做出改动而修改程序代码,这样就可以很方便地将目前代码和早期版本做出比较。与Visual Age紧密结合的Websphere Studio本身并不提供源代码和版本管理的支持,它只是包含了一个内置文件锁定系统, 当编辑项目的时候可以防止其他人对这些文件的错误修改,软件还支持诸如Microsoft Visual SourceSafe这样的第三方源代码控制系统。Visual Age for Java完全面向对象的程序设计思想使得开发程序非常快速、高效。你可以不编写任何代码就可以设计出一个典型的应用程序框架。Visual Age for Java作为IBM电子商务解决方案其中产品之一,可以无缝地与其他IBM产品,如WebSphere、DB2融合, 迅速完成从设计、开发到部署应用的整个过程。

Visual Age for Java独特的管理文件方式使其集成外部工具非常困难,你无法让Visual Age for Java与其他工具一起联合开发应用。

7、BEA 的 WebLogic Workshop

BEA WebLogic Workshop是一个统一、简化、可扩展的开发环境,使所有的开发人员都能在 BEA WebLogic Enterprise Platform之上构建基于标准的企业级应用,从而提高了开发部门的生产力水平,加快了价值的实现。

WebLogic Workshop除了提供便捷的Web服务之外,它能够用于创建更多种类的应用。作为整个 BEA WebLogic Platform的开发环境。不管是创建门户应用、编写工作流、还是创建Web应用,Workshop 8.1都可以帮助开发人员更快更好地完成。

WebLogic Workshop的主要特点如下:

① 使 J2EE 开发切实可行,提高开发效率

BEA WebLogic Workshop 使开发人员远离 J2EE 内在的复杂性,集中精力专注业务逻辑,无须操心单调乏味的基础结构代码。这种创新意味着,已被企业验证的 J2EE 的强大功能,最终被大多数不熟悉 Java 和 J2EE 的应用开发人员所掌握,从而使 IT 部门的工作效率提高一个数量级。

可视化设计器以及直观的概念,如事件、属性和控件等,实现了基于事件的开发。Workshop 简化的程序设计模型,使开发人员不必掌握复杂的 J2EE API 和面向对象的程序设计原理。所有开发人员,包括 J2EE 专家和具有可视化和过程化语言技能的应用开发人员在内,都可以共同工作在 BEA WebLogic Enterprise Platform 之上。Workshop 的可视化开发环境,创建带有代码注释的标准 Java 文件,用来说明由运行时框架实施的企业级需求。J2EE 和其他高级开发人员,借助功能强大的代码编辑功能,可以访问 Java 源代码,从而弥补了可视化设计器的不足。

② 构建企业级应用

通过在可伸缩、安全可靠的企业级架构上实施各种应用,BEA WebLogic Workshop 大大降低了开发风险。而且,所有应用的创建都使用标准的 J2EE 组件,既保护了您的技术投资,又保持了最大的灵活性。 BEA WebLogic Workshop 运行框架,是统一整个架构的汇聚层,使单一、简化的程序设
计模型扩展到所有的 BEA WebLogic Enterprise Platform 应用类型。通过解释设计时创建的注释代码,运行时框架可以实现必要的 J2EE 组件,并且提取出与 J2EE 应用开发有关的所有底层细节。

③ 降低 IT 复杂性

BEA WebLogic Workshop 提供各种 Java 控件,使得与 IT 资源的连接更轻而易举。另外,在构建任何 BEA WebLogic Platform 的应用中,Java 控件不仅可扩展而且完全相同。这种强大、有效的方法能够:降低 IT 技术的复杂性,优化信息的可用性,推动包含"最佳业务方案"的可重用服务的开发,使开发人员能以更低的成本、更短的时间实现更大的产出。

利用 BEA WebLogic Workshop,任何开发人员都能以最大的生产效率,构建各种Web 服务、Web 应用、门户和集成项目。 BEA WebLogic Workshop是BEA的产品战略核心,它帮助客户接触和利用面向服务架构(SOA)的强大功能。 BEA Weblogic Workshop 8.1极大简化了当前实际企业集成环境中企业级应用和服务的构建,并成为全面支持关键企业级应用(如异步、真正松耦合和粗粒度消息传送等)的自然选择。它的缺点就是过于复杂,对于初学者来说,理解起来较为困难。

8、WebGain 的Visual Cafe for Java

Visual Cafe 是只能在Symantec公司的Java虚拟机、Netscape公司的Java虚拟机和Microsoft虚拟机上工作的调试器。这对于开发者来讲是一个重要的特性,因为用户开发的Java代码中的许多软件bug就可能中会在某种特定的虚拟机上起作用。

在修改后进行编译基继续进行调试时,Visual Cafe会自动将文件存盘,使用Visual Cafe创建的原生应用具有许多特点。除了明显的速度提高之外,Symantec使类库的二进制方式比正常的JDK小Visual Cafe为所指定的关系自动生成或更新必要的Java代码。利用 Visual Cafe,用户可以从一个标准对象数据库中集合完整的Java应用程序和Applet,而不必再编写源代码。Visual Cafe还提供了一个扩充的源代码开发工具集。

Visual Cafe综合了Java软件的可视化源程序开发工具,它允许开发人员在可视化视图和源视图之间进行有效地转换。在可视化视图中进行的修改立即反映在源代码中。对源代码的改变自动更新可视化视图。

Visual Cafe具有许多源文件方面的特性,如全局检索和替换。绝大多数Java开发工具的文献的问题在于简单地挨个介绍开发工具的每部分组件,但用户在开应用时还需要一个面向任务的手册,利用这个手册你可以不必知道工具每一部分的特定功能就可以开始创建自己的应用。Visual Cafe提供了非常全面的用户指南,它对最开始的安装到创建第一个Java应用和Applet都提供了全面的帮助,Visual Cafe将自动生成所指明关系的必要 Java代码。Visual Cafe可以在Windows 95和Windows NT平台下运行,Symantec公司为Java开发工作提供一个在 Macintosh操作系统下可以运行的RAD工具。Visual Cafe编译器速度很快,在国际化支持方面比较突出;缺点就是对于初学者来说,较复杂,也比较难。

9、Macromedia的JRUN

Macromedia公司的JRun是一个具有最广阔适用性的Java引擎,用于开发及实施由Java Servlets和JavaServer Pages编写的服务器端 Java应用。JRun是第一个完全支持JSP 1.0 规格书的商业化产品,全球有超过80,000名开发人员使用JRun在他们已有的Web服务器上添加服务器端Java的功能。其中Web服务器包括了Microsoft IIS,Netscape Enterprise Server,Apache 等。

JRun是开发实施服务器端Java的先进引擎。如果我们希望在我们的Web应用中添加服务器端Java功能,那么JRun将成为我们的正确选择。

JRun目前有3个版本,它是第一个支持Java Server Pages(JSP)规格书1.0的商业化产品。JSP是一种强大的服务器端技术,它是用于创建复杂Web应用的一整套快速应用开发系统。JRun可以使我们开始开发并测试Java应用。它最多接受5个并发的连接并且包括全部 Java Servlet API,支持JavaServer Pages(JSP),支持所有主要的Web servers和计算机平台。 JRun Pro能够在生产环境下承受大访问量的负载,帮助我们实施应用、服务或Web站点(包括内联网)。JRun Pro 支持无限量并发式连接运行多个Jav
a虚拟机,包括多个并发的Java虚拟机(JVM)。提供一个远程管理applet以及一个远程可再分布式的管理applet。JRun Pro Unlimited包括了所有JRun Pro的功能,除次以外,还可以运行无限量的,并发的JVM。

JRun依靠其内置的JRun Web Server可以单独运行。使用服务器端Java,用户可以开发出复杂的商业应用系统。最重要的一点是,由于 servlets的平台独立性,以及更加简单的开发、更快速的实施、更经济的维护成本,它是CGI(Common Gateway Interface) 或Perl scripts的极佳的替代产品。缺点就是对于初学者来说,较复杂,也比较难。

10、JCreator

JCreator 是一个Java程序开发工具,也是一个Java集成开发环境(IDE)。无论你是要开发Java应用程序或者网页上的Applet元件都难不倒它。在功能上与Sun公司所公布的JDK等文字模式开发工具相较之下来得容易,还允许使用者自订义操作窗口界面及无限Undo/Redo等功能。

JCreator为用户提供了相当强大的功能,例如项目管理功能,项目模板功能,可个性化设置语法高亮属性、行数、类浏览器、标签文档、多功能编绎器,向导功能以及完全可自定义的用户界面。通过JCreator,我们不用激活主文档而直接编绎或运行我们的JAVA程序。

JCreator能自动找到包含主函数的文件或包含Applet的Html文件,然后它会运行适当的工具。在JCreator中,我们可以通过一个批处理同时编绎多个项目。JCreator的设计接近Windows界面风格,用户对它的界面比较熟悉。其最大特点是与我们机器中所装的JDK完美结合,是其它任何一款IDE所不能比拟的。它是一种初学者很容易上手的java开发工具,缺点是只能进行简单的程序开发,不能进行企业J2EE的开发应用。

11、Microsoft VJ++

Visual J++ 是Microsoft 公司推出的可视化的Java 语言集成开发环境(IDE),为Java 编程人员提供了一个新的开发环境,是一个相当出色的开发工具。无论集成性、编译速度、调试功能、还是易学易用性,都体现了Microsoft 的一惯风格。Visual J++ 具有下面的特点:

1)Visual J++ 把Java 虚拟机(JVM)作为独立的操作系统组件放入Windows,使之从浏览器中独立出来。

2)Microsoft 的应用基本类库(AFC,Application Foundation Class Library)对SUN 公司的JDK 作了扩展,使应用基本类库更加适合在Windows 下使用。

3) Visual J++ 的调试器支持动态调试,包括单步执行、设置断点、观察变量数值等。

4) Visual J++ 提供了一些程序向导(Wizards)和生成器(Builders),它们可以方便地帮助用户快速地生成Java 程序,帮助你在自己的工程中创建和修改文件。

5) Visual J++ 界面友好,其代码编辑器具有智能感知、联机编译等功能,使程序编写十分方便。Visual J++ 中建立了Java 的 WFC,这一新的应用程序框架能够直接访问Windows 应用程序接口(API),使你能够用Java 语言编写完全意义上的Windows 应用程序。

6)Visual J++ 中表单设计器的快速应用开发特性使用WFC 创建基于表单的应用程序变得轻松、简单。通过WFC 可以方便地使用ActiveX 数据对象(ADO,ActiveX Data Objects)来检索数据和执行简单数据的绑定。通过在表单设计器中使用 ActiveX 数据对象,可以快速地在表单中访问和显示数据。

Visual J++能结合微软的一贯的编程风格,很方便进行Java 的应用开发,但它的移植性较差,不是纯的Java 开发环境。

12、Eclipse

Eclipse是一种可扩展的开放源代码IDE。2001年11月,IBM公司捐出价值4,000万美元的源代码组建了Eclipse联盟,并由该联盟负责这种工具的后续开发。集成开发环境(IDE)经常将其应用范围限定在“开发、构建和调试”的周期之中。为了帮助集成开发环境(IDE)克服目前的局限性,业界厂商合作创建了Eclipse平台。Eclipse允许在同一IDE中集成来自不同供应商的工具,并实现了工具之间的互操作性,从而显着改变了项目工作流程,使开发者可以专注在实际的嵌入式目标上。

Eclipse框架的这种灵活性来源于其扩展点。它们是在XML中定义的已知接口,并充当插件的耦合点。扩展点的范围包括从用在常规表述过滤器中的简单字符串,到一个Java类的描述。任何Eclipse插件定义的扩展点都能够被其它插件使用,反之,任何Eclipse插件也可以遵从其它插件定义的扩展点。除了解由扩展点定义的接口外,插件不知道它们通过扩展点提供的服务将如何被使用。

利用Eclipse,我们可以将高级设计(也许是采用UML)与低级开发工具(如应用调试器等)结合在一起。如果这些互相补充的独立工具采用Eclipse扩展点彼此连接,那么当我们用调试器逐一检查应用时,UML对话框可以突出显示我们正在关注的器件。事实上,由于 Eclipse并不了解开发语言,所以无论Java语言调试器、C/C++调试器还是汇编调试器都是有效的,并可以在相同的框架内同时瞄准不同的进程或节点。

Eclipse的最大特点是它能接受由Java开发者自己编写的开放源代码插件,这类似于微软公司的 Visual Studio和Sun微系统公司的NetBeans平台。Eclipse为工具开发商提供了更好的灵活性,使他们能更好地控制自己的软件技术。Eclipse联盟已经宣布将在2004年中期发布其3.0版软件。这是一款非常受欢迎的java开发工具,这国内的用户越来越多,实际上实用它 java开发人员是最多的。缺点就是较复杂,对初学者来说,理解起来比较困难。

13、Ant

Another Neat Tool(Ant)是一种基于Java的build工具。理论上来说,它有些类似于(Unix)C中的make ,但没有 make的缺陷。因为Ant的原作者在多种(硬件)平台上开发软件时,无法忍受这些工具的限制和不便。类似于make的工具本质上是基于shell(语言)的:他们计算依赖关系,然后执行命令(这些命令与你在命令行敲的命令没太大区别)。这就意味着你可以很容易地通过使用OS特有的或编写新的(命令)程序扩展该工具;然而,这也意味着你将自己限制在了特定的OS,或特定的OS类型上,如Unix。Ant就不同了。与基于shell命令的扩展模式不同, Ant用Java的类来扩展。(用户)不必编写shell命令,配置文件是基于XML的,通过调用target树,就可执行各种task。每个task由实现了一个实现了特定Task接口的对象来运行。

Ant支持一些可选task,一个可选task一般需要额外的库才能工作。可选 task与Ant的内置task分开,单独打包。这个可选包可以从你下载Ant的同一个地方下载。ANT本身就是这样一个流程脚本引擎,用于自动化调用程序完成项目的编译,打包,测试等。除了基于JAVA是平台无关的外,脚本的格式是基于XML的,比make脚本来说还要好维护一些。Ant是Apache 提供给Java开发人员的构建工具,它可以在Windows OS和Unix OS下运行,它不仅开放源码并且还是一个非常好用的工具。Ant是 Apache Jakarta中一个很好用的Java开发工具,Ant配置文件采用XML文档编写,所以Java程序员对其语法相当熟悉,Ant是专用于 Java项目平台,能够用纯Java来开发,它能够运行于Java安装的平台,即体现了它的跨平台功能。它的缺点显示执行结果只能是DOS字符界面,不能进行复杂的java程序开发。

14、IntelliJ

Intellij IDEA 是一款综合的Java 编程环境,被许多开发人员和行业专家誉为市场上最好的IDE。它提供了一系列最实用的的工具组合:智能编码辅助和自动控制,支持 J2EE,Ant,JUnit和CVS集成,非平行的编码检查和创新的GUI设计器。IDEA把Java开发人员从一些耗时的常规工作中解放出来,显着地提高了开发效率。具有运行更快速,生成更好的代码;持续的重新设计和日常编码变得更加简易,与其它工具的完美集成;很高的性价比等特点。在4.0版本中支持Generics,BEA WebLogic集成,改良的CVS集成以及GUI设计器。

IntelliJ IDEA能尽可能地促进程序员的编程速度。它包括了很多辅助的功能,并且与Java结合得相当好。不同的工具窗口围绕在主编程窗口周围,当鼠标点到时即可打开,无用时也可轻松关闭,使用户得到了最大化的有效屏幕范围。以技术为导向的IDEA集成了调试器,支持本地和远程的调试,即使我们需要修改一些设置上的东西使我们的工作顺利进展。另外,它还提供了通常的监视,分步调试以及手动设置断点功能,在这种断点模式下,我们可以自动地在断点之外设置现场访问,甚至可以浏览不同的变量的值。IDE支持多重的JVM设置,几个编译程序和Ant建造系统,并且,它使得设置多重的自定义的类途径变得简单。

IntelliJ Idea是一个相对较新的Java IDE。它是Java开发环境中最为有用的一个。高度优化的IntelleJ Idea使普通任务变得相当容易,Idea支持很多整合功能,更重要的使它们设计的好容易使用。Idea支持XML中的代码实现,Idea同时还会校正XML,Idea支持 JSP的结构。作用于普通Java代码的众多功能同样适用于JSP(比如整合功能),同时支持JSP调试;支持EJB,尽管它不包括对个别应用服务器的特殊支持。Idea支持Ant建立工具,不仅是运行目标它还支持编译与运行程序前后运行目标,另外也支持绑定键盘快捷键。在编辑一个Ant建立XML文件时,Idea还对组成Ant工程的XML部分提供支持。IntelliJ IDEA 被称为是最好的JAVA IDE开发平台,这套软件就是以其聪明的即时分析和方便
的 refactoring 功能深获大家所喜爱。缺点是较复杂,对初学者来说,理解起来比较困难。

小结

现在常用的Java项目开发环境有:JBuilder、VisualAge for Java、Forte for Java, Visual Cafe、Eclipse、NetBeans IDE、JCreator +J2SDK、jdk+记事本、EditPlus+ J2SDK等等。一般开发J2EE项目时都需要安装各公司的应用服务器(中间件)和相应的开发工具,在使用这些开发工具之前,我们最好能熟知这些软件的优点和缺点,以便根据实际情况选择应用。编程工具只是工具,为了方便人们工作而开发的,各有特点,因此,选工具主要的依据自己将要从事的领域是什么,而不是盲目的认为那种工具好,那种工具不好。最后希望大家都能找到自己合适的java 开发工具。

阅读全文

与编译的处理方案有几种分别是什么相关的资料

热点内容
找酒吧设计公司用什么app 浏览:678
基本初等函数的导数公式及导数的运算法则 浏览:915
为什么小米app启动广告关不了 浏览:877
空调压缩机一直不停 浏览:511
养殖系统开发源码 浏览:82
pdf的目录 浏览:406
光遇安卓如何一个人拍视频 浏览:277
怨女pdf 浏览:708
扭曲服务器什么时候开 浏览:23
加密货币换平台 浏览:609
手机内存压缩软件 浏览:33
生成树是否与遍历算法有关 浏览:728
python强化学习迷宫 浏览:450
老包子解压视频 浏览:885
服务器注册是什么意思 浏览:418
程序员群体焦虑如何破局 浏览:585
程序员在广州上班 浏览:803
androidlinuxadt 浏览:512
广联达软件加密锁原装芯片 浏览:338
如何打开数据库服务器 浏览:311