Javac (J2SE) 编译器代码生成介绍
- 格式:pdf
- 大小:176.14 KB
- 文档页数:25
JDK、JRE、JVM三者间的关系JDK(Java Development Kit)是针对Java开发员的产品,是整个Java的核⼼,包括了Java运⾏环境JRE、Java⼯具和Java基础类库。
Java Runtime Environment(JRE)是运⾏JAVA程序所必须的环境的集合,包含JVM标准实现及Java核⼼类库。
JVM是Java Virtual Machine(Java虚拟机)的缩写,是整个java实现跨平台的最核⼼的部分,能够运⾏以Java语⾔写作的软件程序。
在计算机开发语⾔的历史中,从来没有哪种语⾔象Java那样受到如此众多⼚商的⽀持,有如此多的开发⼯具。
JDK(Java Development Kit)JDK是Java开发⼯具包,是Sun Microsystems针对Java开发员的产品。
JDK中包含JRE,在JDK的安装⽬录下有⼀个名为jre的⽬录,⾥⾯有两个⽂件夹bin和lib,在这⾥可以认为bin⾥的就是jvm,lib中则是jvm⼯作所需要的类库,⽽jvm和 lib和起来就称为jre。
JDK是整个JAVA的核⼼,包括了Java运⾏环境JRE(Java Runtime Envirnment)、⼀堆Java⼯具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。
①SE(J2SE),standard edition,标准版,是我们通常⽤的⼀个版本,从JDK 5.0开始,改名为Java SE。
②EE(J2EE),enterprise edition,企业版,使⽤这种JDK开发J2EE应⽤程序,从JDK 5.0开始,改名为Java EE。
③ME(J2ME),micro edition,主要⽤于移动设备、嵌⼊式设备上的java应⽤程序,从JDK 5.0开始,改名为Java ME。
Java Runtime Environment(JRE)是运⾏基于Java语⾔编写的程序所不可缺少的运⾏环境。
JDK开发使用手册1、JDK简介JDK 是整个Java的核心,包括了Java运行环境,Java工具和Java基础的类库。
JDK是学好Java的第一步。
而专门运行在x86平台的Jrocket在服务端运行效率也要比Sun JDK好很多。
从SUN的JDK5.0开始,提供了泛型等非常实用的功能,其版本也不断更新,运行效率得到了非常大的提高。
JDK的三个主要版本:SE(J2SE),standard edition,标准版,是我们通常用的一个版本,从JDK 5.0开始,改名为Java SE。
EE(J2EE),enterprise edition,企业版,使用这种JDK开发J2EE应用程序,从JDK 5.0开始,改名为Java EE。
ME(J2ME),micro edition,主要用于移动设备、嵌入式设备上的java应用程序,从JDK 5.0开始,改名为Java ME。
2、JDK组件介绍JDK包含的基本组件包括:javac –编译器,将源程序转成字节码jar –打包工具,将相关的类文件打包成一个文件javadoc –文档生成器,从源码注释中提取文档jdb – debugger,查错工具java –运行编译后的java程序(.class后缀的)appletviewer:小程序浏览器,一种执行HTML文件上的Java小程序的Java浏览器。
Javah:产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件。
Javap:Java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。
Jconsole: Java进行系统调试和监控的工具3、JDK常用包ng:这个是系统的基础类,比如String等都是这里面的,这个包是唯一一个可以不用引入(import)就可以使用的包java.io: 这里面是所有输入输出有关的类,比如文件操作等java.nio;为了完善io包中的功能,提高io包中性能而写的一个新包,例如NIO非堵塞应用: 这里面是与网络有关的类,比如URL,URLConnection等。
《一脚踹进J2SE》视频教程第一章问候JA V A他大爷Java1234_小锋扣扣:527085608Java1234官方群1,2:(已满)Java1234官方群3:301638853第一节Java简介第二节Java运行环境搭建第三节HelloWorld实现及Java运行原理介绍第一节Java简介百度百科:Java第二节Java运行环境搭建1,下载JDK1.62,安装JDK下载地址:/share/link?shareid=478126&uk=24856498581,在D盘新建文件夹jdk1.6;2,把jdk安装到D盘;3,环境变量配置1,JAVA_HOME(新建):D:\jdk1.62,classpath(新建):.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar 3,path(已存在):%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin测试:java javac第三节HelloWorld实现及Java运行原理介绍1,HelloWorld实现public class HelloWorld{public static void main(String args[]){System.out.println("Java大爷,你好!");}}2,Java运行原理介绍HelloWorld.javaJavac编译HelloWorld.classJava运行执行并运行结果第一章作业1,把第一章代码操作三遍或者三遍以上,达到熟练程度,掌握其原理。
(熟能生巧)2,通过度娘或者谷歌,找出查询jdk版本的命令。
(培养自己的能动性)《一脚踹进J2SE》视频教程第二章JA V A基础语法Java1234_小锋扣扣:527085608Java1234官方群1,2:(已满)Java1234官方群3:301638853第一节:Eclipse引入第二节:注释,标识符命名规则及Java中的关键字第三节:Java基本数据类型第四节:Java运算符与表达式第五节:Java选择与循环语句第六节:Java数组第一节:Eclipse引入1,Eclipse简介2,Eclipse下载,解压安装Eclipse下载地址:/share/link?shareid=3480133578&uk=305605848 3,用Eclipse编写HelloWorld.作业:1,在控制台输出“我爱Java”;2,在控制台上打印出*************第二节:注释,标识符命名规则及Java中的关键字1,Java注释1,单行注释://2,多行注释:/*....*/3,文档注释:/**...*/2,标识符命名标识符定义:Java语言中,对于变量,常量,函数,语句块也有名字,我们统统称之为Java标识符.标识符作用:标识符是用来给类、对象、方法、变量、接口和自定义数据类型命名的。
前言翻译初衷,记录JNI编程经验以备后查,并奢望以JNI为蓝本,写一本更深入的关于虚拟机的书。
真做起来,才发现以现有水平只能仰望这个目标,要达到它,还需要几年积累。
本书没有采用逐字逐句的翻译,更多采用意译,请大家在阅读时多参考原著;对于书中夹杂的评论,如有伤观感,请大家见谅。
现在有无数优秀的开源项目,以前高深莫测的技术(虚拟机、编译器、操作系统、协议栈和IDE...), 我们终于有机会一探究竟了,真令人兴奋。
我们学习,我们参与,希望有一天我们中国人也能创一门牛技术。
感谢Die...ken的审稿,他严谨和认真的态度,深感敬佩;哥们儿祝你:天天开心,早结连理。
感谢老婆。
老婆读书时,看见别人写的书总会感谢太太云云,煞是羡慕,总追问:你什么时候写书感谢我?难!翻译都这么费劲,写书就不知猴年马月了,在这儿感谢一下,糊弄糊弄得了。
do.chuan@Preface 本书涵盖了Java Native Interface(JNI)的内容,将探讨以下问题:•在一个Java项目中集成一个C/C++库•在一个用C/C++开发的项目中,嵌入JavaVM•实现Java VM•语言互操作性问题,特别是互操作过程中的垃圾回收(GC, garbage collection)和并发编程(multithreading)首先,通过本书,你会很容易的掌握JNI开发,并能了解到方方面面的关于JNI的知识。
本书详尽的叙述,会带给你你很多如何高效使用JNI的启示。
JNI自1997年初发布以来,Sun的工程师们和Java社区使用JNI的经验造就了本书。
第二,本书介绍了JNI的设计原理。
这些原理,不仅会使学术界感兴趣,也是高效使用JNI的前提。
第三,本书的某些部分是Java 2平台规范的最终版本。
JNI程序员可以此书作为规范的参考手册,Java虚拟机实现者必须遵循规范,以保证各平台实现的一致性。
(...几段不重要,未翻译...)C HA P T E R1IntroductionJNI是Java平台中的一个强大特性。
J2SE1.5inaNutshell中文版Article[h2]J2SE 1.5 in a Nutshell[/h2]--------------------------------------------------------------------------------译者按:因为对J2SE 1.5中的新特性理解的不够深入透彻,所以在翻译中肯定会有一些失准的地方,请各位看官不吝赐教告诉我--------------------------------------------------------------------------------Calvin AustinFebruary 2004Java2平台标准版(J2SE)1.5版本(代号"Tiger")是对Java平台和语言的下一个重要修改;目前1.5版本的J2SE包含了15个JSR的请求,相应的JCP导致了将近100个显著的修改.看到这个版本带来了这么多激动人心的变动,你可能想知道你应该从哪里开始.和以往的发布一样,所有的改动都会有一个清晰的列表保存在"Release notes guide".这篇来自J2SE开发团队的文章将带领你巡视主要的变动,使得你可以在深入API文档之前快速的把握J2SE 1.5能提供什么.J2SE 1.5版本将关注在下面几个关键的主题:简易的开发 Ease of Development可扩展性和性能 Scalability and Performance监视和管理能力 Monitoring and Manageability桌面客户端 Desktop Client还有一些特性也很重要,但是和这些主题不相关,所以他们被列在了文末:其他的特性 Miscellaneous Features简易开发 Ease of Development你可能已经看到了一些能使得开发变得更加简易的Java语言上新特性的报告.这些特性包括了泛型类别,元数据,自动装箱,一个增强的for 循环,枚举类型,静态引入,C语言风格的输入输出,变量参数,并行工具和一个简单化了的RMI接口生成.JSR 201包含了上述语言特性中的4个:增强的for循环,枚举类型,静态导入和自动装箱;JSR 175 说明了元数据机能;而JSR 14则详细说明了泛型类别.在javac编译器中使用的默认的语言是J2SE1.4.这就意味着如果你想使用任何的这些新语言特性必须在编译的时候在javac的命令行上添加一个参数 -source 1.5.(译者按:这也是目前很多的开发人员下载了这个版本以后发现无法使用这些新特性的原因.)元数据 MetadataJ2SE 1.5 中的元数据特性提供了一个连接附加数据到Java Class,Interface,Method和Field中的能力.这些附加的数据或者注解能被javac编译器或者其他的工具识别,并且可以根据配置保存在class文件中,并且能在运行时通过Java的reflection API来发现.给Java平台添加元数据的一个主要原因是似的开发和运行工具能得到一个基础框架,使得可以减少在编码和发布的时候需要的额外的努力.一个工具能使用这些元数据信息来产生一些额外的代码或者在调试的时候提供额外的信息.代替元数据工具,下面的范例代码创建了一个智能调试的元数据注解.这个注解将在随后的调试中简单的显示出来.我们可以看到大部分的元数据标签组成了一个标准的,固定的集合.import ng.annotation.*;import ng.reflect.*;@Retention(ng.annotation.RetentionPolicy.RUNTIME) @interface debug {boolean devbuild() default false;int counter();}public class MetaT est {final boolean production=true;@debug(devbuild=production,counter=1) public void test Method() {}public static void main(String[] args) {MetaTest mt = new MetaTest();try {Annotation[] a = mt.getClass().getMethod("testMethod").ge tAnnotations();for (int i=0; i<a.length ; i++) {System.out.println("a["+i+"]="+a[i]+" ");}} catch(NoSuchMethodException e) {System.out.println(e);}}}有了元数据处理工具,很多重复的编码步骤可以减少到一个简洁的元数据标签中.比如访问JAX-RPC的时候需要的远程接口服务实现可以按照下面这样实现:以前 Beforepublic interface PingIF extends Remote {public void ping() throws RemoteException;}public class Ping implements PingIF {public void ping() {}}用了元数据后 Afterpublic class Ping {public @remote void ping() {}}泛型类型 Generic Types泛型类别在Java社区中已经期待已久,现在泛型成了J2SE 1.5 的一部分.第一显著的能看到泛型类别的地方是集合的API中.集合的API 提供了一些通用功能例如:LinkedLists,ArrayLists和HashMaps等等这些能用于多种类型的集合类型.下面的例子使用J2SE 1.4.2的类库,并且使用默认的javac编译模式.ArrayList list = new ArrayList();list.add(0, new Integer(42));int total = ((Integer)list.get(0)).intValue();上面例子中最后一行一个强制转型到Integer类型是泛型类别想解决的强制转型问题.这个问题就是J2SE 1.4.2的集合API是用Object来存储集合对象的,这就意味这集合不能在编译的时候侦测到类型不符这样的问题.一个典型的问题就是会在运行时抛出ClassCastException.下面是运用了泛型类别后改写的上面的范例:ArrayList<Integer> list = new ArrayList<Integer>();list.add(0, new Integer(42));int total = list.get(0).intValue();这些泛型化的集合API强制在编译的时候用<>来指定集合中存储的数据类型.用了泛型以后就不再有转型的需要了,而且在这个例子中如果试图添加一个String类型的变量到这个声明为Integer的集合中去将会导致一个编译错误.泛型类别使得API的设计者能提供通用的机能,并且能运用于多种数据类型,并且能在编译的时候就检查类型的安全性.泛型的API要稍微复杂一些.建议可以从java.util.Collection包的源代码和API的使用指南开始看起.基本类型的自动装箱和自动拆箱 Autoboxing and Auto-unboxing of Primitive Types在基本类型和对应的对象副本之间的转化,例如从基本型int,boolean到他们相对应的对象副本Integer和Boolean的转化会需要一些根本不必要的代码,特别是一些只在在集合API中会出现的转化操作.对Java基本类型的自动装箱和自动拆箱使得代码能更加简洁易懂.下面的这个例子示范了将一个int类型的数据存储到一个ArrayList中,并且再取出来.J2SE 1.5使得在int和Integer对象之间的转化能自动进行.以前 BeforeArrayList<Integer> list = new ArrayList<Integer>();list.add(0, new Integer(42));int total = (list.get(0)).intValue();使用自动装箱和自动拆箱后 AfterArrayList<Integer> list = new ArrayList<Integer>();list.add(0, 42);int total = list.get(0);增强的for循环 Enhanced for loop在集合的API中,Iterator类别是使用率非常高的一个class.他提供了一种顺序访问集合元素的能力.新增强的for循环能在简单的顺序访问集合元素的时候代替Iterator.编译器会自动产生必要的带类型安全,并且不需要转型操作的循环代码.以前 BeforeArrayList<Integer> list = new ArrayList<Integer>();for (Iterator i = list.iterator(); i.hasNext();) {Integer value=(Integer)i.next();}使用增强for循环以后 AfterArrayList<Integer> list = new ArrayList<Integer>();for (Integer i : list) { ... }枚举化的类型 Enumerated types这种类型和使用static final的常量相比提供了枚举化的类型.如果你曾经在你的代码中用enum这样的变量名,当你用javac -source 1.5进行编译的时候将需要调整一下你的代码,因为J2SE 1.5 引入了一个新的关键字enum.public enum StopLight { red, amber, green };静态引入 Static Import静态引入的特性是用"import static"这样的语句使得你能不输入类名就可以直接使用一个类中的静态常量.比如我们经常在添加一个控件的时候用的BorderLayout.CENTER,使用了静态引入后,你只需要简单的调用CENTER就可以了.import static java.awt.BorderLayout.*;getContentPane().add(new JPanel(), CENTER);格式化的输出 Formatted Output开发人员现在可以使用类似C语言中的printf这样的功能来产生格式化的输出.现在可以象C语言中一样使用printf,而且语言上基本没有变化,一般可以不变,有些格式可能需要稍微的变化一下.大部分的通用C printf格式都可以使用,同时一些Java的类例如Date和BigInteger也拥有了格式化规则.可以在java.util.Formatter 类中找到更多的信息.System.out.printf("name count\n");System.out.printf("%s %5d\n", user,total);格式化的输入 Formatted Input这个Scanner API提供了基本的读入数据的功能,例如从控制台上或者其他任何的数据流中读入数据的功能.下面的范例从标准输入中读入了一个字符串并且希望字符串随后是一个int值.Scanner中的方法例如next和nextInt会在没有数据的时候自动失效.如果你需要处理一个非常复杂的输入,那么还可以使用java.util.Formatter类中的模式匹配算法.Scanner s=Scanner.create(System.in);String param= s.next();int value=s.nextInt();s.close();不定参数 Varargs不定参数(varargs)机能允许在一个方法中传入多个不定数量的参数.而这只是简单需要用...来表示某个方法接受不定参数.而这正是在printf方法中接受任意数量个参数的基础.void argtest(Object ... args) {for (int i=0;i <args.length; i++) {}}argtest("test", "data");并行工具 Concurrency Utilities并行工具包是由Doug Lea在带领的JSR-166中提出要添加到J2SE 1.5中去的,这是一个非常流行的并行工具包.他提供了功能强大的,高层次的线程构造器,包含了执行器,例如一个线程任务框架,线程安全的队列,计时器,锁(包含了原子级别的锁)和其他一些同步的基本类型.其中的锁是一个众所周知的信号.一个信号能在现在使用wait的地方使用,他通常用来限制对某一代码块的访问.信号量将更加灵活并且能允许多个并行的线程来访问,也允许你在得到一个锁之前可以测试这个锁.下面的代码示范了使用一个信号量,也被称为是二分信号.更多的信息请参看java.util.concurrent包.final private Semaphore s= new Semaphore(1, true);s.acquireUninterruptibly(); //for non-blocking version use s.acquire()balance=balance+10; //protected values.release(); //return semaphore tokenrmi编译器--rmic rmic -- the rmi Compiler你可能再也不需要使用rmic来产生那些远程的接口桩.动态代理的方法说明了通常由桩提供的信息可以在在运行时被发现.更多的信息请参看RMI release notes.可扩展性和性能 Scalability and PerformanceJ2SE 1.5版本的发布保证改进可扩展性和性能,尤其是在启动时和内存印记的时候,使得能更加简单的发布一个应用程序并且运行的非常快.一个非常显著的更新是介绍类数据在Hotspot JVM中的分享.这个技术不仅在多个运行的JVM之间分享只读数据,并且改进了启动时间,使得看起来这些类都象JVM的核心的类一样是预先装载的.性能的人体工程学是J2SE 1.5中的一个新特性,这意味这如果你在过去的J2SE版本中使用过特殊的JVM运行时选项来提升性能,这将值得你在J2SE的JVM中没有JVM运行时没有参数或者少量参数的情况下重新验证你的性能,因为J2SE的性能已经提升了很多了.监视和管理 Monitoring and Manageability监视和管理是Java平台上RAS(Reliability, Availability, Serviceability)的一个关键组件.JVM的监视和管理API(JSR-174)详细说明了一套非常容易理解的JVM内部机制,这些内部机制在一个运行的JVM上被监视到.这个信息是通过JMX(JSR-003)消息Bean来访问的,并且能通过JMX的远程接口(JSR-160)来远程的访问或者通过业界标准的SNMP工具来访问.最重要的特性之一是一个底层的内存探测器 .当入口(threshold)交叉的时候,JMX MBeans能通知那些被注册过的监听器,详细内容请参看javax.management 和 ng.management为了能直观的看到使用这些 API是多么的简单,下面就有一个报告在Hotspot JVM中内存堆栈详细使用情况的范例.import ng.management.*;import java.util.*;import javax.management.*;public class MemT est {public static void main(String args[]) {List pools =ManagementFactory.getMemoryPoolMBeans();for(ListIterator i = pools.listIterator(); i.hasNext();) {MemoryPoolMBean p = (MemoryPoolMBean) i.next();System.out.println("Memory type="+p.getType()+" Memoryusage="+p.getUsage());}}}新的JVM 整形API(JSR-163) New JVM profiling API (JSR-163) 这次的发布还包含了一个非常强劲的本地整形API叫做JVMTI.这套API在JSR163中已经详细说明过,并且是针对改进整形接口的需求而来的.不管怎么样,JVMTI想关注所有本地进程内的工具访问.除了整形以外,还包括了监视,调试和一个可能将会支持多种代码分析的工具.这些API的实现包括了一套bytecode测试设备的机制,JPLIS(Java Programming Language Instrumentation Services -Java编程语言测试设备服务).这将允许分析工具在必要的时候来添加额外的整形.这个技术的优点是他允许更多的焦点分析并且限制JVM中跑的不同的整形工具之间的冲突.这套测试设备甚至能在运行时自动的生成,就如同class的装载时候和预处理的class文件一样.下面的范例建立了一套能从磁盘上装载一个修改过 class文件的测试设备勾子.要运行下面的测试,在启动JRE的时候,用java -javaagent:myBCI BCITest的方式.//File myBCI.javaimport ng.instrument.Instrumentation;public class myBCI {private static Instrumentation instCopy;public static void premain(String options, Instrumentation i nst) {instCopy = inst;}public static Instrumentation getInstrumentation() {return instCopy;}}//File BCITest.javaimport java.nio.*;import java.io.*;import java.nio.channels.*;import ng.instrument.*;public class BCITest {public static void main (String[] args) {try {OriginalClass mc = new OriginalClass();mc.message();FileChannel fc=new FileInputStream(new File("modified"+Fil e.separator+"OriginalClass.class")).getChannel();ByteBuffer buf = fc.map(FileChannel.MapMode.READ_ONLY, 0, (int)fc.size());byte[] classBuffer = new byte[buf.capacity()];buf.get(classBuffer, 0, classBuffer.length);myBCI.getInstrumentation().redefineClasses(new ClassDefini tion[] {new ClassDefinition(mc.getClass(), classBuffer)});mc.message();}catch (Exception e){}}}//OriginalClass.java//Compile in current directory//Copy source to modified directory,change message and re compilepublic class OriginalClass {public void message() {System.out.println("OriginalClass");}}改进的诊断能力 Improved Diagnostic Ability在没有控制台窗口的时候生成堆栈跟踪是无用的.现在有两个新的API,getStackTrace和Thread.getAllStackTraces提供了使得这些信息可编程的能力.StackTraceElement e[]=Thread.currentThread().getStackTrac e();for (int i=0; i <e.length; i++) {System.out.println(e[i]);}System.out.println("\n"+Thread.getAllStackTraces());Hotspot JVM包括了一个致命错误的处理机制,使得在JVM放弃的时候运行一个用户支持的脚本或者一段程序.一个调试工具也能用Hotspot JVM的可服务代理连接器连接到这个已经挂起的JVM或者那些核心文件.-XX:OnError="command"-XX:OnError="pmap %p"-XX:OnError="gdb %p"optional %p used as process id桌面客户端 Desktop ClientJava的桌面客户端仍然是作为Java平台的一个关键组件,同时这个组件在J2SE 1.5中也有了很大的改进.在这次的Beta发布中包含了一些早先对启动时间和内存印记的改进.不仅变的快速了,而且Swing的工具中还带了一个崭新的界面风格叫做Ocean.在J2SE 1.4.2的基础上,对GTK可更换的Look and Feel以及Window XP的Look and Feel有了进一步的改进.Windows XPClick to EnlargeLinux/RedhatClick to EnlargeLinux和Solaris的用户只要有最新的OpenGL驱动和显卡,就能让Java2D得到本地的硬件加速,可以非常显著的改善显示效果,只需要在启动的时候添加下面这样的参数就可以了:java -Dsun.java2d.opengl=true -jar Java2D.同时在Linux的发布版本中还包含了一个快速的X11工具包,叫做XAWT,默认就是使用这个工具包的.如果你需要使用过去的motif的工具包,你需要在启动的时候添加如下的系统参数:java -Dawt.toolkit=sun.awt.motif.MT oolkit -jar Notepad.jar (X11的工具包叫做sun.awt.X11.XT oolkit)同时X11的工具包还使用了xDnD的协议,所以你可以在Java和其他应用程序之间,比如StarOffice或者Mozilla,拖拽简单的组件.其他的一些新特性 Miscellaneous Features核心支持XML Core XML SupportJ2SE 1.5 介绍了一些对核心XML平台的修改,包括了XML 1.1,Namespace,XML Schema.还有SAX 2.0.1,XSLT和快速的XLSTC编译器,还有对DOM level 3的支持.除了对核心XML的支持特性以外,JWSDP(Java Web Services Developer Pack)将会发布最新的Web services标准:JAX-RPC & SAAJ(WSDL/SOAP),JAXB,XML加密以及数字签名和注册用的JAXR.补充的字符支持 Supplementary Character Support32位的补充字符支持是被非常小心的添加到了J2SE 1.5中来的,他是作为过渡到Unicode 4.0支持的一个部分.补充的字符被编码成特殊的一对对UTF16的值来生成一个个不同的字符,或者从代码的角度来看,被代替的一对值是由一个高位的UTF16值紧随一个低位的UTF16值,而这个高位和低位的值都是从一个特殊的UTF16值范围内取出来的.通俗点说,当使用一个String或者字符序列的时候,核心的API库会透明的为你处理这些补充的字符.但是java的char类型数据仍然是16位的,少数使用char作为参数的方法现在有了相应的能接受一个int值的方法,这些方法能表现新的这些大值.特别是Character类,添加了一些象下面代码中的方法来找回当前的字符和随后的字符来支持这些补充的字符:String u="\uD840\uDC08";System.out.println(u+"+ "+u.length());System.out.println(Character.isHighSurrogate(u.charAt(0)));System.out.println((int)u.charAt(1));System.out.println((int)u.codePointAt(0));详细信息请参考Character类中的Unicode部分.JDBC的行集 JDBC RowSets对JDBC 行集的支持上有两个更新.一个是CachedRowSet,包含了保存在内存中从数据库中取回来的行集合.并且他们是未连接的,这就意味着对这些行集的更新可以在过一段时间后同步到数据库中.另外一个是WebRowSet,是一种用XML的方式来传递数据库中的行数据信息.参考 References:关于简化开发的新语言特性请参考:J2SE Tiger这个版本中包含的JSR Tiger Component JSRs003 Java Management Extensions (JMX) Specification013 Decimal Arithmetic Enhancement014 Add Generic Types To The Java Programming Language 028 Java SASL Specification114 JDBC Rowset Implementations133 Java Memory Model and Thread Specification Revision 3160 Java Management Extensions (JMX) Remote API 1.0163 Java Platform Profiling Architecture166 Concurrency Utilities174 Monitoring and Management Specification for the Java Virtual Machine175 A Metadata Facility for the Java Programming Languag e200 Network Transfer Format for Java Archives201 Extending the Java Programming Language with Enumerations, Autoboxing, Enhanced for Loops and Static Import 204 Unicode Supplementary Character Support206 Java API for XML Processing (JAXP) 1.3。
Java学习从入门到精通一、JDK (Java Development Kit)JDK 是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库 (rt.jar)。
不论什么Java应用服务器实质都是内置了某个版本的JDK。
因此掌握JDK是学好Java的第一步。
最主流的JDK 是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如IBM公司开发的JDK,BEA公司的Jrocket,还有GNU组织开发的 JDK 等等。
其中IBM的JDK包含的JVM(Java Virtual Machine)运行效率要比Sun JDK包含的JVM高出许多。
而专门运行在x86平台的Jrocket在服务端运行效率也要比Sun JDK好很多。
但不管怎么说,我们还是需要先把Sun JDK掌握好。
1、JDK 的下载和安装JDK又叫做J2SE(Java2 SDK Standard Edition),可以从Sun的Java网站上下载到,/j2se/downloads.html ;;;,JDK 当前最新的版本是J2SDK1.4.2,建议下载该版本的JDK,下载页面在这里:/j2se/1.4.2/download.html。
下载好的JDK是一个可执行安装程序,默认安装完毕后会在C:Program FilesJava目录下安装一套JRE(供浏览器来使用),在C:j2sdk1.4.2下安装一套JDK(也包括一套JRE)。
然后我们需要在环境变量PATH的最前面增加java的路径C:j2sdk1.4.2in。
这样JDK就安装好了。
2、JDK的命令工具JDK的最重要命令行工具:java:启动JVM执行 classjavac:Java编译器jar:Java打包工具javadoc:Java文档生成器这些命令行必须要非常非常熟悉,对于每个参数都要很精通才行。
9 代码生成 9 代码生成 ................................................................................................................................... 1 9.1 指令的编码 ............................................................................................................... 2 9.2 生成代码的管理 ....................................................................................................... 5 9.3 指令的发射 ............................................................................................................... 6 9.4 存储管理 ................................................................................................................. 10 9.5 为Java语言的各种结构生成代码 ........................................................................ 12 9.5.1 为Java方法生成代码 .................................................................................... 12 9.5.2 为方法的调用生成代码 ................................................................................. 14 9.5.3 为循环结构生成代码 ..................................................................................... 15 9.5.4 为条件语句生成代码 ..................................................................................... 17 9.5.5 为异常捕获部分生成代码 ............................................................................. 18 9.6 代码生成运行实例分析 ......................................................................................... 22 9.7 小结 ......................................................................................................................... 25
代码生成作为编译器的最后一个阶段,要将某种形式的中间表示翻译成最终的目标代码。一般来讲代码生成器要负责存储的管理,与编译器的前端协作完成将源程序中的名字映射为运行时存储器中数据对象的地址。并且,它要充分利用目标处理器的资源,生成高效的代码。对于CISC结构的处理器,要利用体系结构支持的丰富的寻址模式,生成简洁的代码,这就需要使用基于树的模式匹配指令选择算法。对于面向寄存器的指令集,要进行寄存器分配。这些都是编译器中代码生成程序需要完成的功能。 从抽象语法树生成代码,需要对抽象语法树进行遍历。基本的算法可以用下面的递归过程描述(采用二叉树,但容易推广到节点子树多于2的情况): procedure genCode(T :treenode) begin if T is not nil then generate code to prepare for code of the left child of T; genCode(left child of T); generate code to prepare for the code of the right child of T; genCode(right child of T) generate code to implement the action of T; end;
一遍的代码生成算法,需要解决的一个主要问题是:当生成一条跳转指令时,我们可能并不知道需要跳转到的目标地址。为解决这个问题,需要使用回填技术(backpatching)。我们可以生成一系列未指定目标地址的跳转指令。这些指令被放入到一个列表中,该列表中元素的地址在标号确定后进行回填。这项技术被广泛应用于各种高级语言的控制结构生成代码,如循环,跳转,条件语句等等。 寄存器分配也是代码生成的一项重要内容。在处理器中,寄存器是比存储器要快很多,而且这种差距有着拉大的趋势。为了加快程序的执行速度,就需要让程序生成的代码尽可能多的使用寄存器。寄存器的分配算法,从简单的基于静态引用计数的寄存器分配算法,到复杂的基于图着色的寄存器分配算法,学术界和工程界已经进行了多年的研究,这方面的技术已经广泛应用到各种编译器之中。基于静态引用计数的寄存器分配算法根据对程序结构的静态分析,来推测变量被引用的次数,一次读或者写操作引用计数加一,对于循环结构中的引用,根据循环嵌套层数在基本的引用计数乘以一个加权因子后进行累加,对于一层循环和两层循环这个加权因子一般为10,100,以此类推。最后,为引用计数最多的变量分配寄存器。在生成代码时,如果对分配了寄存器的变量进行操作,就采用寄存器操作指令,相反,如果对没有分配寄存器的变量操作,就采用内存操作指令。基于图着色的寄存器分配算法,也是一种被广泛使用的寄存器分配算法,使用这种算法可以生成高质量的代码。由于算法比较复杂,这里不进行介绍,有兴趣的读者请参考相关文献[4]。 本书以Java语言的编译器GJC作为背景,由于Java虚拟机的指令集是面向堆栈的指令集,所以本书实例分析中没有涉及基于树的模式匹配的指令选择技术和寄存器分配技术。 在GJC中代码生成遍的主要任务是: 指令翻译:从Java虚拟机的指令集中选择合适的指令,对源程序的各种结构,如方法、表达式、循环、跳转、异常的抛出和捕获进行翻译。 存储管理:将源程序中的局部变量映射为运行时局部数据区中数据对象的地址。并且将源程序中的静态变量映射为Java类文件格式中常量池表项的索引。 字节码生成:将指令逐条按照Java虚拟机指令集的规定进行编码,生成最终的字节码文件。
9.1 指令的编码 一般来说,为了完成指令的编码任务,编译器需要完成两个映射:一个是字节码的助记符到字节码编码值的映射;另一个是字节码的助记符到字节码名字的映射。例如对于ByteCode第一条指令的助记符为nop,编码值为0,字节码名字为“nop”。为了输出字节码名字在程序中保存为字符串形式的“nop”。第一个映射的作用是显而易见的,它使编译器在代码生成的过程中只需要指定指令的助记符,通过这个映射对助记符进行编码。第二个映射的作用也很重要,它可以输出程序员能够识别的辅助信息,方便编译器的开发和调试。 在GJC中,从字节码助记符到字节码编码值的映射,是由Code/ByteCode.java中的程序来完成。
1 /** 2 * @(#)ByteCodes.java 1.13 03/01/23 3 * 4 * Copyright 2003 Sun Microsystems, Inc. All rights reserved. 5 * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. 6 */ 7 package com.sun.tools.javac.v8.code; 8 9 /** 10 * Bytecode instruction codes, as well as typecodes used as 11 * instruction modifiers. 12 */ 13 public interface ByteCodes { 14 15 /** 16 * Byte code instruction codes. 17 */ 18 int illegal = -1; 19 20 /** 21 * Byte code instruction codes. 22 */ 23 int nop = 0; 24 25 /** 26 * Byte code instruction codes. 27 */ 28 int aconst_null = 1; 29 30 /** 31 * Byte code instruction codes. 32 */ 33 int iconst_m1 = 2; 34 35 /** 36 * Byte code instruction codes. 37 */ 38 int iconst_0 = 3; 39 40 /** 41 * Byte code instruction codes. 42 */ 43 int iconst_1 = 4; 44 。。。。。。 1039 1040 /** 1041 * Virtual instruction codes; used for constant folding. 1042 */ 1043 int string_add = 256; 1044 1045 /** 1046 * Virtual instruction codes; used for constant folding. 1047 */ 1048 int bool_not = 257; 1049 1050 /** 1051 * Virtual instruction codes; used for constant folding.