求minijavac语言编译器源代码码,或编译原理。。

编译原理第三版附带的实验源码_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
编译原理第三版附带的实验源码
上传于||暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩9页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢9444人阅读
虚拟机(JVM)是可运行
代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行。本文首先简要介绍从Java文件的编译到最终执行的过程,随后对JVM规格描述作一说明。
  一.Java源文件的编译、
、解释和执行
  Java应用程序的开发周期包括编译、
、解释和执行几个部分。Java编译程序将Java源程序翻译为JVM可执行代码?字节码。这一编译过程同C/
的编译有些不同。当C编译器编译生成一个对象的代码时,该代码是为在某一特定硬件平台运行而产生的。因此,在编译过程中,编译程序通过查表将所有对符号的引用转换为特定的内存偏移量,以保证程序运行。Java编译器却不将对变量和方法的引用编译为数值引用,也不确定程序执行过程中的内存布局,而是将这些符号引用信息保留在字节码中,由解释器在运行过程中创立内存布局,然后再通过查表来确定一个方法所在的地址。这样就有效的保证了Java的可移植性和
  运行JVM字节码的工作是由解释器来完成的。解释执行过程分三部进行:代码的装入、代码的校验和代码的执行。装入代码的工作由&类装载器&(class
loader)完成。类装载器负责装入运行一个程序需要的所有代码,这也包括程序代码中的类所继承的类和被其调用的类。当类装载器装入一个类时,该类被放在自己的名字空间中。除了通过符号引用自己名字空间以外的类,类之间没有其他办法可以影响其他类。在本台计算机上的所有类都在同一地址空间内,而所有从外部引进的类,都有一个自己独立的名字空间。这使得本地类通过共享相同的名字空间获得较高的运行效率,同时又保证它们与从外部引进的类不会相互影响。当装入了运行程序需要的所有类后,解释器便可确定整个可执行程序的内存布局。解释器为符号引用同特定的地址空间建立对应关系及查询表。通过在这一阶段确定代码的内存布局,Java很好地解决了由超类改变而使子类崩溃的问题,同时也防止了代码对地址的非法访问。
  随后,被装入的代码由字节码校验器进行检查。校验器可发现操作数栈溢出,非法数据类型转化等多种错误。通过校验后,代码便开始执行了。
  Java字节码的执行有两种方式:
  1.即时编译方式:解释器先将字节码编译成机器码,然后再执行该机器码。
  2.解释执行方式:解释器通过每次解释并执行一小段代码来完成Java字节码程
序的所有操作。
  通常采用的是第二种方法。由于JVM规格描述具有足够的灵活性,这使得将字节码翻译为机器代码的工作
  具有较高的效率。对于那些对运行速度要求较高的应用程序,解释器可将Java字节码即时编译为机器码,从而很好地保证了Java代码的可移植性和高性能。
  二.JVM规格描述
  JVM的设计目标是提供一个基于抽象规格描述的计算机模型,为解释程序开发人员提很好的灵活性,同时也确保Java代码可在符合该规范的任何系统上运行。JVM对其实现的某些方面给出了具体的定义,特别是对Java可执行代码,即字节码(Bytecode)的格式给出了明确的规格。这一规格包括操作码和操作数的语法和数值、标识符的数值表示方式、以及Java类文件中的Java对象、常量缓冲池在JVM的
映象。这些定义为JVM解释器开发人员提供了所需的信息和开发环境。Java的设计者希望给开发人员以随心所欲使用Java的自由。
  JVM定义了控制Java代码解释执行和具体实现的五种规格,它们是:
  JVM指令系统
  JVM寄存器
  JVM栈结构
  JVM碎片回收堆
  2.1JVM指令系统
  JVM指令系统同其他计算机的指令系统极其相似。Java指令也是由
操作码和操作数两部分组成。操作码为8位二进制数,操作数进紧随在操作码的后面,其长度根据需要而不同。操作码用于指定一条指令操作的性质(在这里我们采用汇编符号的形式进行说明),如iload表示从存储器中装入一个整数,anewarray表示为一个新数组分配空间,iand表示两个整数的&与&,ret用于流程控制,表示从对某一方法的调用中返回。当长度大于8位时,操作数被分为两个以上字节存放。JVM采用了&big
endian&的编码方式来处理这种情况,即高位bits存放在低字节中。这同 Motorola及其他的RISC
CPU采用的编码方式是一致的,而与Intel采用的&little endian
&的编码方式即低位bits存放在低位字节的方法不同。
  Java指令系统是以Java语言的实现为目的设计的,其中包含了用于调用方法和监视多先程系统的指令。Java的8位操作码的长度使得JVM最多有256种指令,目前已使用了160多种操作码。
  2.2JVM指令系统
  所有的CPU均包含用于保存系统状态和处理器所需信息的寄存器组。如果虚拟机定义较多的寄存器,便可以从中得到更多的信息而不必对栈或内存进行访问,这有利于提高运行速度。然而,如果虚拟机中的寄存器比实际CPU的寄存器多,在实现虚拟机时就会占用处理器大量的时间来用常规存储器模拟寄存器,这反而会降低虚拟机的效率。针对这种情况,JVM只设置了4个最为常用的寄存器。它们是:
  pc程序计数器
  optop操作数栈顶指针
  frame当前执行环境指针
  vars指向当前执行环境中第一个局部变量的指针
  所有寄存器均为32位。pc用于记录程序的执行。optop,frame和vars用于记录指向Java栈区的指针。
  2.3JVM栈结构
  作为基于栈结构的计算机,Java栈是JVM存储信息的主要方法。当JVM得到一个Java字节码应用程序后,便为该代码中一个类的每一个方法创建一个栈框架,以保存该方法的状态信息。每个栈框架包括以下三类信息:
  局部变量
  执行环境
  操作数栈
  局部变量用于存储一个类的方法中所用到的局部变量。vars寄存器指向该变量表中的第一个局部变量。
  执行环境用于保存解释器对Java字节码进行解释过程中所需的信息。它们是:上次调用的方法、局部变量指针和操作数栈的栈顶和栈底指针。执行环境是一个执行一个方法的控制中心。例如:如果解释器要执行iadd(整数加法),首先要从frame寄存器中找到当前执行环境,而后便从执行环境中找到操作数栈,从栈顶弹出两个整数进行加法运算,最后将结果压入栈顶。
  操作数栈用于存储运算所需操作数及运算的结果。
  2.4JVM碎片回收堆
  Java类的实例所需的存储空间是在堆上分配的。解释器具体承担为类实例分配空间的工作。解释器在为一个实例分配完存储空间后,便开始记录对该实例所占用的内存区域的使用。一旦对象使用完毕,便将其回收到堆中。
  在Java语言中,除了new语句外没有其他方法为一对象申请和释放内存。对内存进行释放和回收的工作是由Java运行系统承担的。这允许Java运行系统的设计者自己决定碎片回收的方法。在SUN公司开发的Java解释器和Hot
Java环境中,碎片回收用后台线程的方式来执行。这不但为运行系统提供了良好的性能,而且使程序设计人员摆脱了自己控制内存使用的风险。
  2.5JVM存储区
  JVM有两类存储区:常量缓冲池和方法区。常量缓冲池用于存储类名称、方法和字段名称以及串常量。方法区则用于存储Java方法的字节码。对于这两种存储区域具体实现方式在JVM规格中没有明确规定。这使得Java应用程序的存储布局必须在运行过程中确定,依赖于具体平台的实现方式。
  JVM是为Java字节码定义的一种独立于具体平台的规格描述,是Java平台独立性的基础。目前的JVM还存在一些限制和不足,有待于进一步的完善,但无论如何,JVM的思想是成功的。
  对比分析:如果把Java原程序想象成我们的
原程序,Java原程序编译后生成的字节码就相当于C++原程序编译后的80x86的机器码(二进制程序文件),JVM虚拟机相当于80x86计算机系统,Java解释器相当于80x86CPU。在80x86CPU上运行的是机器码,在Java解释器上运行的是Java字节码。
  Java解释器相当于运行Java字节码的&CPU&,但该&CPU&不是通过硬件实现的,而是用软件实现的。Java解释器实际上就是特定的平台下的一个应用程序。只要实现了特定平台下的解释器程序,Java字节码就能通过解释器程序在该平台下运行,这是Java跨平台的根本。当前,并不是在所有的平台下都有相应Java解释器程序,这也是Java并不能在所有的平台下都能运行的原因,它只能在已实现了Java解释器程序的平台下运行。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:71060次
排名:千里之外
原创:28篇
转载:17篇
评论:31条
(2)(1)(1)(1)(4)(1)(1)(1)(1)(1)(3)(2)(8)(1)(1)(11)(2)(3)java编译原理_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
java编译原理
上传于||文档简介
&&文​章​介​绍​了​j​a​v​a​编​译​原​理
大小:6.66KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢& & 一、任务概述 本项大作业将设计并实现一个Mini Java 语言的编译器 Mini Java概述 Mini Java是Java语言的子集。作为一种很好的编译课程教学语言,它与Java相比做了如下精简: (1)不允许重载(overloading) (2)一个文件中可以申明若干个类,但必须有且只有一、任务概述& & 本项大作业将设计并实现一个MiniJava语言的编译器& & Mini Java概述& & Mini Java是Java语言的子集。作为一种很好的编译课程教学语言,它与Java相比做了如下精简:& & (1)不允许重载(overloading)& & (2)一个文件中可以申明若干个类,但必须有且只有一个的主类,辅类可以有多个,类不能申明为public;主类中只能有一个主方法,该方法的签名必须为“public static void main(String[])”,其中String[]参数不做处理。主方法中只能有一条输出语句:System.out.println( int ),该语句只能输出整型变量值& & (3)只有类,没有接口,有继承关系(单继承)& & (4)类中只能申明变量和方法& & (5)只有四种变量类型:整型(integer)、布尔型(boolean)、数组(array)、对象;只有一类数组:整型数组(int[]);变量必须申明为(auto)型& & (6)方法必须为public,必须有返回值,返回值类型受(5)限制;可以有参数,可以没有,参数数量没有限制,类型受(5)限制& & (7)一共有6中语句(statement):代码块(block)、简单赋值语句(assignment statement)、数组赋值语句(array assignment statement)、打印语句(print statement)、if语句、while语句& & (8)一共有9种表达式(expression):与(and)、比较(compare)、加(plus)、减(minus)、乘(times)、数组定位(array lookup)、数组长度(array length)、消息传递(message sending,即参数传递)、主表达式(primary expression);与表达式为“短路与”(&&);比较只能作小于比较& & (9)主表达式一共有9种:整数(Integer)、“真”(true)、“假”(false)、对象、this、初始化(allocation)、数组初始化(array allocation)、非(not)、括号(bracket)& & (10)初始化时只能使用空参数,所以没有“构造器(constructor)”概念& & (11)对标识符(IDENTIFIER)没有作明确定义,在这里规定只能是字母、数字的集合,但必须以字母开头,区分大小写& & (12)对整数(INTEGER_LITERAL)没有作明确定义,在这里规定为无符号整数,32位(0~)& & (13)不允许注释& & (14)类变量声明时不能初始化,初始化必须在方法中完成& & (15)不能定义内部类& & 保留字、终结符& & 保留字& & 识别编码& & 记忆符& & 值& & & & 0& & EOF& & -& & boolean& & 1& & BOOLEAN& & -& & class& & 2& & CLASS& & -& & else& & 3& & ELSE& & -& & extends& & 4& & EXTENDS& & -& & fasle& & 5& & FALSE& & -& & if& & 6& & IF& & -& & int& & 7& & INT& & -& & length& & 8& & LENGTH& & -& & main& & 9& & MAIN& & -& & new& & 10& & NEW& & -& & public& & 11& & PUBLIC& & -& & return& & 12& & RETURN& & -& & static& & 13& & STATIC& & -& & this& & 14& & THIS& & -& & true& & 15& & TRUE& & -& & void& & 16& & VOID& & -& & while& & 17& & WHILE& & -& & String& & 18& & STRING& & -& & System.out.println& & 19& & PRINTLN& & -& & =& & 20& & EQUAL& & -& & !& & 21& & NOT& & -& & &&& & 22& & AND& & -& & +& & 23& & PLUS& & -& & -& & 24& & MINUS& & -& & *& & 25& & TIMES& & -& & <& & 26& & COMPARE& & -& & .& & 27& & DOT& & -& & ;& & 28& & SEMICOLON& & -& & ,& & 29& & COMMA& & -& & [& & 30& & LEFT_SQUARE& & -& & ]& & 31& & RIGHT_SQUARE& & -& & (& & 32& & LEFT_BRACKET& & -& & )& & 33& & RIGHT_BRACKET& & -& & {& & 34& & LEFT_BLOCK& & -& & }& & 35& & RIGHT_BLOCK& & -& & 标识符& & 36& & ID_STRING& & 内部字符串& & 无符号整数& & 37& & ID_INTEGER& & 整数值& & 本编译器概述& & (1)语法分析程序用带回溯的递归子程序法& & (2)对源文件进行两遍处理:第一遍词法分析,第二遍语法分析& & (3)使用编译时静态分配存储空间& & (4)整型数据类型32位,占4个字节;布尔型数据类型8位,占1个字节;内存(由列表虚拟)寻址10位,1KB& & (5)为了实现方便,父类必须在子类之前定义& & (6)由于时间原因,编译器做了如下简化:& & (i)表达式只能处理加法、减法、乘法、小于比较、逻辑与,且只能对整数或布尔值直接进行计算,而不能计算变量的值& & (ii)不能处理方法调用& & (iii)不能处理数组& & (iv)不能进行对象初始化& & (v)不能处理结构化语句& & 原文转自:http://www.ltesting.net
声明:该文章系网友上传分享,此内容仅代表网友个人经验或观点,不代表本网站立场和观点;若未进行原创声明,则表明该文章系转载自互联网;若该文章内容涉嫌侵权,请及时向
上一篇:下一篇:
相关经验教程
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
论文写作技巧

参考资料

 

随机推荐