




已阅读5页,还剩80页未读, 继续免费阅读
(交通信息工程及控制专业论文)基于M68HC11的嵌入式JAVA开发系统研究与实现.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
南京航空航天大学硕士学位论文 - i - 摘 要 摘 要 嵌入式系统是以应用为中心,软硬件可裁剪的专用计算机系统。它主要由嵌入式处理器、 固件程序、 嵌入式操作系统及应用软件等组成。 m68hc11 是摩托罗拉公司生产的八位增强型单 片微控制器,主要用于智能化仪器仪表、家用电器、通讯以及自动控制系统,本论文采用以 m68hc11 为核心的扩展系统为目标机,进行 java 开发系统的研究与实现。 论文首先研究了 java 编译器(jcompiler)的设计与实现,将编译器的设计分成建立编译 环境、词法分析、语法分析、语义分析、优化和字节码生成六个主要阶段,中间包含异常处 理和出错处理; 在此基础上通过对 kaffe 虚拟机的深入剖析, 研究了基于 m68hc11 平台的 java 虚拟机的实现流程,并针对目标机的特点和应用需求开发了相关的设备驱动程序以及本地方 法;论文还根据 java 和目标机的特点研究并实现了目标文件加载器,通过特殊自引导方式将 虚拟机目标文件、本地方法文件和用户程序字节码文件加载到目标机中,然后目标机切换到 正常扩展方式运行启动程序,进行目标机内存、外设和相关驱动的初始化,再调用 java 虚拟 机来解释执行用户程序,从而实现了一种嵌入式开发系统。最后对论文的研究工作进行了总 结,并对进一步研究方向进行了展望。 关键词: 关键词:嵌入式系统,m68hc11,java,编译器,java 虚拟机 基于 m68hc11 的嵌入式 java 开发系统研究与实现 -ii- abstract the embedded system is a special purpose computer system which consists of embedded processing unit, firmware, embedded operating system and application software system. the target machine for this thesis is an extension system of m68hc11, which is an enhanced 8-bit microprocessor produced by motorola company. on this target machine an integrated embedded java developing environment is designed and implemented. in the thesis the design and realization of a java compiler, jcompiler in short, are dealt with. the process of the jcompiler execution is divided into establishing compiler environment, lexical analysis, syntax analysis, semantic analysis, optimization and bytecode file generation. and the jcompiler is also equipped with the capabilities of exception processing and error processing. based on the detailed analysis of kaffe, an offshelf java virtual machine (jvm), jvm for m68hc11 platform is furtherly studied. the executive codes of jvm, native methods and the application programe are downloaded into the target machine through the special bootstrap mode of m68hc11. after that the target machine is switched to the normal expanded mode to conduct the initialization of the whole system and start jvm to interpretively run the bytecode application program. so a kind of embedded system is realized.the last chapter concludes the thesis and points out the future work. keywords:embedded system,m68hc11,java,compiler,jvm 基于 m68hc11 的嵌入式 java 开发系统研究与实现 - vi - 图、表清单 图 2. 1 目标机体系结构图 . 5 图 2. 2 m68hc11 存储空间映像图. 6 图 2. 3 系统开发流程图 . 7 图 2. 4 反编译工具 jad 的作用 . 8 图 3. 1 jcompiler 编译流程图. 9 图 3. 2 javacc 的两个辅助工具. 14 图 3. 3 语法分析在编译器中的地位 . 15 图 3. 4 语义分析流程图 . 23 图 3. 5 语法制导翻译 . 24 图 3. 6 语法分析树例子图 . 26 图 3. 7 字节码文件生成器 . 34 图 3. 8 链接器 classlinker 的用途 . 41 图 4. 1 kaffe 虚拟机流程图. 42 图 4. 2 java 虚拟机内部体系结构. 43 图 4. 3 及时编译流程图 . 44 图 4. 4 应用程序堆中的存放 . 46 图 4. 5 方法帧的结构 . 46 图 5. 1 启动程序流程图 . 52 图 6. 1 目标机图 . 56 图 6. 2 编译出错图 . 57 图 6. 3 编译成功图 . 57 图 6. 4 目标文件加载图 . 58 图 6. 5 运行效果图. 58 表 2. 1 硬件方式选择 . 6 表 3. 1 method 的数据结构-method_info. 30 表 3. 2 code_attribute 的数据结构. 30 表 3. 3 字节码文件格式 . 33 表 3. 4 field 的数据结构-field_info. 36 表 5. 1 cm-162 的引脚. 50 表 6. 1 目标文件加载后的内存地址映像 . 55 表 b. 1 constantpool_info 表的形式. 75 表 b. 2 constant_utf8_info . 75 南京航空航天大学硕士学位论文 - vii - 表 b. 3 constant_utf8_integer . 75 表 b. 4 constant_float . 75 表 b. 5 constant_long_info . 75 表 b. 6 constant_double_info . 75 表 b. 7 constant_class_info . 76 表 b. 8 constant_string_info . 76 表 b. 9 constant_field_info . 76 表 b. 10 constant_methodref_info . 76 表 b. 11 constant_interfacemethodref_info . 76 表 b. 12 constant_nameandtype_info . 76 表 c. 1 access_flags 项的标志位. 77 表 c. 2 方法的标志位 . 77 表 c. 3 constantvalue_attribute . 77 表 c. 4 synthetic_attribute . 77 表 c. 5 exception_info 的数据结构. 78 表 c. 6 attribute_info 的数据结构. 78 表 c. 7 line_number_table_info 的数据结构. 78 表 c. 8 九种属性 . 78 表 c. 9 constantvalue 属性-constantvalue_attribute. 79 表 c. 10 sourcefile 属性-sourcefile_attribute. 79 表 c. 11 deprecated 属性-deprecated_attribute. 79 表 c. 12 synthetic 属性-synthetic_attribute. 79 表 c. 13 innerclass 属性-innerclass_attribute. 79 表 c. 14 exception 属性-exception_attribute. 79 表 c. 15 linenumbertable 属性-linenumbertable_attribute. 80 表 c. 16 localvariabletable 属性-localvariabletable_attribute. 80 表 c. 17 inner_class_info 的数据结构. 80 表 c. 18 inner_class_access_flags 的标志位. 80 南京航空航天大学硕士学位论文 承诺书 我郑重声明:本人恪守学术道德,所呈交的学术论文,是本人在导师的悉心 指导下,进行独立实验和研究所取得的成果。尽我所知,除文中明确注明、引用 和致谢的地方外, 本论文的研究成果不包含他人已经发表或者撰写过了的研究成 果。 对本论文所涉及的研究做出贡献的其他个人和集体, 都在文中以明确方式标 明。 我授权南京航空航天大学可以有权保留送交论文的复印件, 允许本论文被查 阅和借阅, 可以将学位论文的全部或者部分内容编入有关数据库进行检索。 可以 采用影印、缩印、扫描或者其它复制手段保存论文。 (保密的学位论文在解密后适用本承诺书) 作者签名: 夏 兵 日 期: 二 00 七年一月 南京航空航天大学硕士学位论文 - 1 - 第一章第一章 绪论绪论 1.1 嵌入式系统概述 嵌入式系统是指以应用为中心,以计算机技术为基础,并且软硬件可裁剪, 适用于应用系统对功能、可靠性、成本、体积和功耗有严格要求的专用计算机系 统。它一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户的应用 程序等四个部分组成,用于实现对其它设备的实时控制、监视或管理等功能。 嵌入式系统包括硬件和软件部分。硬件包括微处理器、存储器及外围器件和 i/o 端口、 图形控制端口等。 软件部分包括要求实时多任务的操作系统以及应用程 序,操作系统控制着应用程序编程与硬件交互的基础。嵌入式系统软件开发包括 bootloader、嵌入式操作系统内核、根文件系统和应用程序。 在嵌入式开发过程中有宿主机和目标机的角色之分。宿主机是执行编译、链 接、定址过程的计算机,文中提到的宿主机是运行在 windows 平台下的个人计算 机;目标机指运行嵌入式软件的硬件平台,本系统的目标机是以 m68hc11 为 mcu 的单片机。为使应用程序能够在目标机中运行,首先需把应用程序转换成可以在 目标机上运行的二进制代码。 嵌入式处理器是嵌入式系统的核心,嵌入式系统中的处理器、接口以及软件 都是由处理器来协调控制运行。根据嵌入式处理器功能的不同和芯片复杂度的不 同,将其分成嵌入式微处理器、嵌入式微控制器、嵌入式数字信号处理器和嵌入 式片上系统四类 1。本系统中的嵌入式处理器采用了摩托罗拉公司的 m68hc11,它 将整个计算机系统集成到一块芯片上,芯片内部根据需要集成了存储器、定时器、 计数器、i/o 接口、看门狗、adc、dac 等必要的功能模块和外围设备。由于嵌入 式微控制器集成在一块芯片上,因而体积小、成本低、稳定性高。 嵌入式系统的存储器用于存放系统软件、应用程序和应用数据。由于嵌入式 系统有体积小的特点, 所以使用的存储器一般都是根据存储特点选用不同的内存, 而不使用大容量外存。m68hc11e1 系列微控制器内部有 512 个字节的 ram(片内内 存)和 192 个字节的 rom。 嵌入式系统的外围设备一般包括输入/输出设备、定时器/计数器、看门狗、 通信与网络设备等等。 1.2 java编译器 结构化语言编译器的编译过程分为词法分析、语法分析、语义分析、中间代 码生成、代码优化、目标代码生成和目标代码优化这七个阶段,其中符号表管理 基于 m68hc11 的嵌入式 java 开发系统研究与实现 - 2 - 和出错处理贯穿了整个编译过程。 而文中的 java 编译器 jcompiler 是一种完全面 向对象语言的编译器,它与传统编译器有一些差异,具体如下: (1)结构化语言的编译器如c编译器一般会采用flex 2作为生成词法分析器的 辅助工具,并采用 bison 2作为生成它对应的语法分析器的辅助工具。而对于论文 中的面向对象语言 java 编译器 jcompiler, 它则是以 javacc 作为生成词法分析器 和语法分析器的唯一辅助工具。javacc 3是用途比较专一的工具,被称为 java 编 译器的编译器。 (2)jcompiler 中除涉及到符号表之外,还用了一个重要数据结构-常量池, 常量池贯穿了语义分析阶段和字节码文件生成阶段。 (3)由于 java 虚拟机中只有程序计数器 pc、局部变量寄存器 vars、栈顶寄存 器 optop 和 frame 寄存器 4,并且虚拟机只用 java 栈来存储中间数据,所以在 jcompiler 的字节码文件生成阶段不需要考虑寄存器分配问题。另外 java 虚拟机 是面向堆栈的,这些都说明了字节码文件平台无关性的根本原因。 1.3 java虚拟机 字节码文件中包括虚拟机指令、一个常量池和其它辅助信息,java 虚拟机用 于对字节码文件进行解释执行或编译执行。 java 虚拟机运行在操作系统之上, 它负责提供执行环境和将 java 字节码指令 转换成本地机器指令。根据平台的不同,需要编写不同平台下的 java 虚拟机,比 如本论文中 m68hc11 平台的虚拟机。为使虚拟机符合目标平台的需要,需要对 windows 平台的 java 虚拟机进行裁剪,再将裁剪好的虚拟机移植到目标平台。 1.4 m68hc11 体系结构 m68hc11 是摩托罗拉公司生产的一种高性能 hcmos 8 位单片机系列,它的 cpu 具有 16 位的寻址能力和强有力的寻址功能。同时 m68hc11 具有理想的片内资源, 包括 ram、e 2prom、rom 存储器、同步和异步串行口、adc、脉冲累加器、实时中断、 看门狗定时器和 i/o 功能。 m68hc11 具有多种型号, 不同型号之间的差异仅仅在片 内存储空间上,在文中出现的 m68hc11 都指的是 m68hc11e1 型号,下面将详细介 绍它的体系结构。 1.4.1 cpu寄存器 ? 累加器:a、b 和双累加器 d 累加器 a、b 是两个通用的 8 位累加器,用于存放算术运算或数据处理的操作 数和结果。一些指令可以把两者联成一个 16 位的累加器 d。 ? 变址寄存器:x、y 南京航空航天大学硕士学位论文 - 3 - 16 位的变址寄存器 x、y 用于变址寻址方式。 ? 堆栈指针:sp m68hc11 的堆栈指针可位于 64k 字节地址空间的任何地方。每当一个字节压 栈,sp 自动减 1;每当一个字节弹出堆栈,sp 自动加 1。 ? 程序计数器:pc 程序计数器是一个 16 位寄存器,它包含下一条要执行的指令的地址。 1.4.2 寻址方式 ? 立即寻址 在立即寻址方式中,操作数在操作码之后,字节数与寄存器相关。 ? 扩展寻址 指令的有效地址出现在指令码后的双字节中。 扩展指令通常格式为:一个操作 码和两个有效地址字节。 ? 直接寻址 在直接寻址方式中,指令码后为指令的有效地址的低位字节,有效地址的高 位字节固定为0 x00, 不包含在指令中。 因此直接寻址只能用于访问0 x00000 x00ff 区域的存储器。 ? 变址寻址 在变址寻址方式中,使用变址寄存器 x 和 y 来计算有效地址。 ? 隐含寻址 在隐含寻址方式中,cpu 知道执行指令的所有相关信息。 ? 相对寻址 相对寻址只用于转移指令。除了位移指令外,转移指令均为两个字节。 1.4.3 指令系统 ? 数据传送指令 包括取数指令、存数指令、寄存器数据传送指令、数据交换指令和堆栈操作指 令。 ? 算术运算指令 包括加法指令、减法指令、比较运算指令。 ? 逻辑运算指令 主要提供了与、或、异或、取反指令。 ? 移位指令 主要提供了算术左移、累加器 d 算术左移、算术右移、逻辑左移、累加器逻 辑左移、逻辑右移。 ? 转移指令 基于 m68hc11 的嵌入式 java 开发系统研究与实现 - 4 - 无条件转移等。 ? 子程序和返回指令 包括子程序调用指令、子程序返回指令、中断返回指令。 ? 位操作指令 包括位置位、位清零、位判断转移、位测试、标志位指令。 1.5 论文组织 本文共分为七章, 围绕基于 m68hc11 的嵌入式 java 开发系统的实现过程进行 具体的讨论。 在绪论部分首先综述了嵌入式系统的组成,然后简要介绍了 java 编译器和 java 虚拟机,最后描述了 m68hc11 的 cpu 寄存器、寻址方式和指令系统。 第二章确立了系统的体系结构。着重描述了目标机的体系结构和 m68hc11 的 工作方式,最后阐明了系统开发的概要流程。 第三章设计并实现了 jcompiler。程序员通常会用 sun 公司的编译器 javac 来编译 java 源程序,然而由于文中 java 源程序是可以控制目标机的外设并且包 含了控制目标机外设的本地方法,所以即使程序是正确的,但用 javac 去编译它 肯定会报错。 考虑到上述原因以及定位源程序错误的方便, 自行设计了 jcompiler。 并且根据对目标机的依赖程度, 将编译过程分成为与java虚拟机无关的前端设计, 以及与 java 虚拟机直接相关的后端设计两部分。前端设计包括词法分析、语法分 析和语义分析;后端设计包括优化和字节码文件生成。 第四章在剖析 kaffe 虚拟机的源代码基础上, 研究了 m68hc11 平台的 java 虚 拟机的实现以及启动程序与它的接口,然后阐述了虚拟机的实现流程及其关键技 术,并突出了目标平台 java 虚拟机的类操作系统的特性。 第五章首先研究了目标机外设的驱动以及相关的本地方法,然后对启动程序 调用 java 虚拟机以及虚拟机解释执行字节码文件的流程做了分析。 第六章实现了自引导程序 bootloader 和目标文件装载器, 并在特殊自引导方 式时通过加载器完成了目标文件加载,最后给出了开发系统的效果图。 最后一章对本学位课题期间所做的工作进行了总结,并对今后的工作进行了 展望。 南京航空航天大学硕士学位论文 -5- 第二章第二章 系统体系结构与开发流程系统体系结构与开发流程 2.1 宿主机和目标机 在嵌入式开发过程中有宿主机和目标机的角色之分, 宿主机一般是执行编译、 链接和定址过程的个人计算机,而目标机指运行嵌入式软件的硬件平台。为使应 用程序能够在目标机中运行,需将它转换成可以在目标机上运行的目标代码,这 一过程包括编译、链接和定址三个步骤。编译可以由宿主机端的编译器或者交叉 编译器来实现,交叉编译器是指运行在一个计算机平台并且为另一个平台产生目 标代码的编译器。本文中的交叉编译器为 as6811,它用于编译摩托罗拉的汇编程 序。编译过程产生的所有输出文件将被链接成一个目标文件,本文中用的链接器 是与编译器 as6811 匹配的 aslink。 定址过程会将物理存储器地址指定给目标文件 的每个相对偏移处,正如 s19 文件要加载的地址已经在该文件里每一行开始处被 指定。该过程生成的目标文件就是可以在以 m68hc11 为微控制器的目标机上执行 的十六进制文件。 2.2 目标机体系结构 2.2.1 目标机外设 本文中的目标机外围设备包括 lcd、伺服电机接口、直流电动机、红外线接口 和蜂鸣器等等,另外还添加了功能键和复位键,它们用于设置目标机工作方式。 程序员可以编写 java 应用程序来控制这些外设,目标机体系结构如图 2.1 所示, 图中的四步骤的通信流程将在 6.3.2 节目标文件加载时将作出详细介绍。 图 2. 1 目标机体系结构图 lcd 伺服电机接口 直流电机接口 红外线接口 蜂鸣器 片外sram sci com 功能键复位键 目标机 m68hc11 片内ram 片内rom 1 3 2 4 目标 文件 握手 信号 引导 文件 同步 信号 宿主机 基于 m68hc11 的嵌入式 java 开发系统研究与实现 - 6 - 2.2.2 m68hc11 工作方式 m68hc11 内部除了 cpu 以外还有具有多种部件, 例如硬件方式选择电路用的寄 存器。硬件中 hprio 寄存器的高四位用于控制 m68hc11 的工作方式,以适用于各 种不同的应用场合。 m68hc11 虽然有四种工作方式, 但只有在特殊自引导方式下才 能执行片内 rom 中的固件程序。表 2.1 中的 moda 对应图 2.1 中的复位键,modb 则对应图 2.1 中的功能键, 通过操作这两个键来完成对 m68hc11 工作方式的选择。 表 2. 1 硬件方式选择 2.2.3 m68hc11 存储器空间 m68hc11 片内有 rom、ram、e 2prom 等存储器,图 2.2 中描述了与 m68hc11 四种 工作方式分别相对应的存储空间映像 4。 位于片内0 xbf400 xbfff地址空间的rom 中固化了 192 个字节的固件程序,这段固件程序只有在特殊自引导方式下才能被 执行。 图 2. 2 m68hc11 存储空间映像图 m o d a m o d b 工 作 方 式 0 1 正 常 单 片 1 1 正 常 扩 展 0 0 特 殊 自 引 导 1 0 特 殊 测 试 0 x0000 0 x1000 0 xb000 0 xe000 0 xffff 正常单片 扩展 扩展 扩展 扩展 扩展 扩展 0 x0000 片内512字节 ram 0 x1000 0 x01ff 0 x103f 片内64字节寄 存器区 0 xb600 0 xb7ff 0 xbf40 0 xbfff 片内 512 字节 eeprom 特殊方式引导 rom 及中断 向量 0 xffc0 0 xffff 正常方式中断 向量 正常扩展 特殊自引导 特殊测试 南京航空航天大学硕士学位论文 -7- 2.2.4 特殊自引导方式和正常扩展方式 本系统开发过程中主要用到了 m68hc11 的特殊自引导方式和正常扩展方式。 只有当 m68hc11 工作在特殊自引导方式时,固件程序才能被激活执行。该固件程 序类似于个人电脑主机中集成在主板上的 bios 5,因为每当开机时就会自动执行 bios 引导程序。bios 主要执行的任务是标志和配置所有的即插即用设备,完成自 检,对引导驱动器的可引导分区定位,加载主引导记录、引导驱动器的分区表和 执行主引导记录。而本目标机片内 rom 中的固件程序与 bios 是区别的,它的作用 是通过sci从宿主机端接收512个字节的数据, 将这些数据加载到0 x00000 x01ff 的片内内存中,而这 512 个字节的数据就是后面将要详细叙述的自引导程序。 复位目标机后,目标机就工作在了正常扩展方式下,这个工作方式允许通过 时分多路地址/数据总线来访问片外内存和外围设备。 当目标程序在自引导程序的 引导下加载完后,目标程序只有在正常扩展方式下才能被执行。 2.3 系统开发流程 硬件条件已经具备,整个系统的开发流程如下图所示,流程比较复杂。 图 2. 3 系统开发流程图 裁减java.lang包并 并生成java.jar包,该 包是自动导入的 用jcompiler编译 userapp.java并且 生成userapp.class 将本地方法和驱 动程序汇编成目标 文件 经过java和classlinker 链接生成 userapp.s19 生成本地方法库 文件native.s19 (1) java虚拟机目标文件 javavm.s19 (2) 本地方法目标文件 native.s19 (3) 用户程序目标文件 userapp.s19 这三个文件在自引导程序引导下 通过加载器被加载到目标机平台 对目标机进行 复位 编写java 源程序 userapp.java 编写驱动 程序和本地 方法 自引导程序 bootloader.h ex java虚拟机 目标文件 javavm.s19 基于 m68hc11 的嵌入式 java 开发系统研究与实现 - 8 - 论文中先借助反编译工具 jad(见图 2.4)为 jcompiler 的实现打下了框架基 础,再将编译器的实现模块化,最终实现了 jcompiler;其次对类路径的内容进行 了裁剪并编写目标机外设的驱动程序;最后实现了用于加载目标文件的装载器。 m68hc11 平台的 java 虚拟机是已经存在的,通过调试过其源码,在理解基础上找 出它与启动程序(见 5.3 节)的接口。最终目标是在启动程序中调用虚拟机,让虚 拟机解释字节码文件。 图 2. 4 反编译工具 jad 的作用 2.4 小结 本章讲解了系统的宿主机和目标机,以及目标机的微控制器 m68hc11 在不同 工作方式下的存储空间映像,紧接着着重讨论了与系统实现密切相关的特殊自引 导方式和正常扩展方式。最后以图形结合文字的方式综述了系统的开发流程,并 说明了反编译在设计 java 编译器 jcompiler 过程中起的作用。 java编译单元 (.java) 字节码文件 (.class) java编译器 (javac/jcompiler) java反编译工具 (jad) java虚拟机 目标代码 南京航空航天大学硕士学位论文 -9- 第三章第三章 jcompiler 设计与实现设计与实现 在 java 语言中一个源程序就是一个编译单元,它是无格式的文本文件。在本 文的后续章节中,源程序和编译单元是等同的。java 源程序一般由包声明、导入 声明和类型声明三个部分组成。 由于 sun 公司的 java 编译器源代码未被公开, 但可以借助于反编译工具 jad, 使 jdk 中编译器的字节码文件被反编译成 java 源程序(见图 2.4)。虽然反编译后 得到的 java 源文件是调试不通的,但是从反编译的文件中,可以获悉面向对象语 言 java 的编译器框架,这为自行设计编译器打下了铺垫。jcompiler 将编译过程 主要概括为建立编译环境、词法分析、语法分析、语义分析、优化和字节码文件 生成六个主要阶段,出错处理和异常处理贯穿了整个编译过程。 为了方便了解当前编译单元所处的阶段, 然后进行下一阶段的处理, 作者将编 译单元按正常处理流程分成如下状态:编译单元的起始状态被设置成 class_source,经语法分析后的状态被设置成 class_parsed,经语义分析后的状 态被设置成 class_checked,字节码生成后的状态被设置成 class_compiled。 图 3. 1 jcompiler 编译流程图 3.1 建立编译环境 (1)编译环境 编译环境由用于输出错误信息的流、查找被导入的类所在的绝对路径、源文 件中存在的错误数目和警告数目等组成。 将 java 类路径参数设置成 m68hc11.jar 和 robotic.jar,将引导类路径设置 java 编译单元 词法 分析 语法 分析 javacc 输入文件 javacc 语义 分析 优化 字节码 文件 出错 处理 字节码 生成 基于 m68hc11 的嵌入式 java 开发系统研究与实现 - 10 - 为 java.jar, 该包是对 java.lang 包和 java.util 包进行修改后生成的归档文件。 编译环境贯穿了整个编译过程,它的对象用于保存当前正在被解析或者编译 的对象、存放编译过程中产生的出错信息、编译的中间结果和最终结果。 batchenvironment( outputstream out, /存放编译的中间结果及编译好的结果 classpath sourcepath, /用于查找要编译的 java 源文件的路径 classpath binarypath, /用于查找字节码文件的路径 errorconsumer errorconsumer/用于写入编译过程中的错误信息 ) (2)jcompiler 在下列情况下会退出当前编译的程序 编译过程中未产生错误, 编译器完成编译后正常退出即 exit_ok; 编译过程中 退出,且编译过程中有错误生成即 exit_error;系统错误或者资源被破坏时编译 器退出即 exit_systemerror; 产生的异常导致编译器终止编译即 exit_abnormal。 (3)设置全局性常量 java 魔数的固定值为 0 xcafebabe,为与 java 虚拟机 1.2 版本匹配,将默认 的 java 虚拟机次版本号为 3,主版本号为 45 6。 (4)基本状态 jcompiler 编译 java 源程序的过程是围绕以下八种基本类状态进行: class_undefined/该类尚未被装载 class_undecided/类定义被装载 class_binary /类已经被装载 class_source /该类从源文件中被装载,并且知道类型信息 class_parsed /该类已经过词法分析和语法分析 class_checked /该类已经过语义分析 class_compiled /编译已经完成,且结果被写入字节码文件中 class_notfound /未发现此类 jcompiler 的设计被分成编译前端设计与后端设计。 从类状态流程可以看出如 果编译流程如果依次经过了四种状态,则肯定正确地完成了整个编译流 程,并且会生成字节码文件。状态、状态、状态的上半部分是编译器的前 端设计,而状态的下半部分以及状态属于编译器的后端设计。状态属于编 译中产生了错误,在这种情况下,编译器会以 exit_error 的形式退出编译流程。 南京航空航天大学硕士学位论文 -11- 3.2 词法分析 编译器会先调用语法分析器,语法分析器会向词法分析器请求扫描文件流。 词法分析器在被语法分析调用后执行,不停地给语法分析器传送单词符号。在词 法分析之前,首先需要清晰地认识 java 编译单元的基本组成,这样将有助于更好 认识词法分析器的工作过程。 3.2.1 java 编译单元的组成 java 编译单元由包声明、导入声明和类型声明组成。在编译单元中,编译器 对声明的唯一强制性顺序限制就是包声明必须位于编译单元的顶部,而导入声明 必须紧跟其后。在包声明和导入声明之后是一个或多个类型声明。 3.2.1.1 包声明 一条包声明语句由 package 关键字和一个包的全额限定名组成。位于编译单 元顶部的包声明的主要目的在于界定该编译单元所属的包名, 而不是创建一个包。 默认情况下,编译器会将最后生成的字节码文件输出到编译单元所在的目录。包 的成员包括类、接口以及子包。如果编译单元中没有包声明,那么可以称其为属 于一个无名包。 3.2.1.2 导入声明 在编译单元的顶部,导入声明 import 必须紧跟在包声明后面。如果没有包声 明,导入声明就位于编译单元的最前面。导入声明使用了关键字 import,程序员 可以使用单类型导入声明来导入单个 public 类和接口, 或者使用按需类型导入声 明来导入包中的任何一个 public 的类和接口。 (1)单类型导入,例如:import java.util.hashtable。 (2)按需类型导入,例如:import java.util.*。 导入规则如下:首先只有 public 的类和接口才能被导入;其次由于按需导入 存在效率不高的问题,所以尽量不使用按需导入声明。 除了可以直接使用当前包中的类和接口的简名外,每个编译单元都会自动导 入在 java.lang 包中的公开类和接口。这些类和接口不需要使用包限定,并在系 统初始化时,java.lang 包中的 public 的类和接口都会被 jcompiler 预导入。 在编译过程中, jcompiler 一方面将自动导入定义在 java.lang 包中的公开类 和接口;另一方面它还会忽略冗余导入声明。例如:当使用单类型导入声明的类 在一个按需类型导入中的包中已经存在,或者使用导入声明中重复导入了同一个 类, jcompiler 都会将忽略冗余导入。 特别需要指明的是 jcompiler 处理导入声明 时仅导入包中的单类型,而不导入包中的任何子包。 另外对于单类型导入声明的两条限制:首先单类型导入声明不能用来导入与 基于 m68hc11 的嵌入式 java 开发系统研究与实现 - 12 - 编译单元中同名的字节码文件;其次单类型导入声明不能用来导入两个具有相同 简名的不同类。比如在编译单元中导入 package1.filename1 类的同时又导入 package2.filename1 类,由于这两个类的简名都是 filename1,所以 jcompiler 会报告语法错误。 3.2.1.3 类型声明 类型声明大体上分为类类型和接口类型。其中类类型又分为: ? 外部类 一个编译单元中只能有一个外部类 public class classname。如果在同一 个编译单元中声明两个外部类,则编译会出错。 ? 嵌套类 java 允许在一个类中定义另一个类,这种类叫嵌套类。嵌套类又分为静态嵌 套类和非静态嵌套类。 ? 内部类 任何声明在另一个类体中且非 static 的类都是内部类。 例如:nestinner.java public class nestinner public class neibu public static void main(string args) 编译后生成的内部类文件为 nestinner$neibu.class。 ? 局部类 声明在方法体中的命名类被称为局部类,生成的局部类文件名格式为:外部 类名$阿拉伯数字$局部类名。 public class nestlocal public static void main(string args) class local 上面的文件经 jcompiler 编译后,内部类名字为 nestlocal$1$local.class, 外部类名为 nestlocal.class。 ? 匿名类 类名格式为: 包成员名、一个$号和一个从 1 开始记数的序号。这种类是附加 在类实例创建表达式结尾的后面,在这样的类实例创建表达式中,使用的类型名 南京航空航天大学硕士学位论文 -13- 可以是类或接口。由于匿名类本身无名,所以没有构造方法,它需要显式地调用 一个无参的构造方法。例如: a a=new a() 类实例创建表达式声明了一个匿名类,并同时生成了它的一个实例。匿名类 实际上是一种内部类,并且仅能被使用一次。 ? 歧义类 类名不符合要求,比如文件名和编译单元的外部类名不同,这种情况称之为 歧义类。例如 java 编译单元名为 nuaa.java,然而编译单元中的外部类声明是 public class nuaa ,仅仅由于文件名与外部类名大小写不一致,编译器 还是会报错。 3.2.2 单词定义 词法分析的任务是将编译单元先转换成输入流,然后输出单词符号,放入缓 冲区中。java 编译单元的单词符号可分成如下五种情况: ? 关键字(包括保留字 const 和 goto),例如 abstract、synchronized 等。 ? 标志符,例如方法名、变量名、数组名等。 ? 运算符(算术运算和逻辑运算),例如+、-、 、 /设定输入流为 unicode 编码方式 static = false; /设置后面定义的方法不一定是静态方法 parser_begin(javaparser) /解析代码的入口 public class javaparser parser = new javaparser(new java.io.fileinputstream(file); /语法分析入口 parser_en
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 第七课 学会尊重教学设计-2025-2026学年小学心理健康三年级鄂科版
- 2025年康复科康复护理知识考核试卷答案及解析
- 第11课 初识App Inventor(教案)五年级下册信息技术青岛版
- 德国建筑调色方案设计(3篇)
- 月子馆护理知识培训总结课件
- 【特种作业取证】高处作业模拟考试试卷(3套)
- 中小学体育课教学资源开发案例
- 诚信教育课程方案及班会主持稿
- 2025年学历类自考专业(护理)外科护理学(二)-儿科护理学(二)参考题库含答案解析(5套)
- 2025年学历类自考专业(护理)外科护理学(一)-护理学导论参考题库含答案解析(5套)
- GB/T 20671.1-2006非金属垫片材料分类体系及试验方法第1部分:非金属垫片材料分类体系
- GB/T 17449-1998包装玻璃容器螺纹瓶口尺寸
- 熵权法教学讲解课件
- PMC知识培训课件
- 医师病理知识定期考核试题与答案
- 高中数学教材分析讲座课件第五章-三角函数
- 会计师事务所验资工作底稿模板
- 婚育情况登记表
- 安宁疗护服务流程
- 久日新材料(东营)有限公司 年产87000吨光固化系列材料建设项目环评公示版
- 热分析DSC培训new
评论
0/150
提交评论