首页 > 编程知识 正文

java和javac命令,javac命令执行不了

时间:2023-05-04 10:42:51 阅读:63091 作者:562

我们知道javac命令的作用是将java源代码编译为二进制代码的class文件。 那么,在从java源文件编译到class文件的过程中,javac命令是如何工作的呢? 或者,javac命令的工作过程是什么样的呢?

首先,让我们来看看编译的原理。 (虽然在学校学过,但现在几乎都还给老师了。 在网上查阅的资料)中,编译过程主要经历以下几个阶段。 编译过程,图像在来自internet的javac命令执行编译操作时,也以同样的过程进行。 )1)词法分析阶段词法分析是将得到的java源代码信息转换为令牌) ),例如转换为关键字和变量的词法分析的过程是分析这些标记。 )语法分析阶段的语法分析以通过词法分析得到的令牌的集合为基础,抽象出对应的语法树。 什么是语法树? 简而言之,一个java源文件包含信息,import信息、类定义信息、方法信息和字段信息作为一个项目进行等待,这些项目集合起来抽象为一个语法树。 为了更直观地说明什么是语法树,这里进行测试。 首先,在eclipse中创建Test1.java文件,并将两个类Test1和Test2添加到该java文件中。 内容如下。 package com.test.map; import java.util.Date; 公共类测试1 {隐私测试名称; 公共静态金融int age=20; 公共语音测试(string username ) { this.name=username; system.out.println (新日期); }公共语音测试2 (inta ) try ) system.out.println (a/0 ); }catch(exceptione ) thrownewruntimeexception; }}classtest2{publicvoidtst{}}然后使用EClipse的AST插件(安装AST插件)分析当前java源代码的语法树。 内容一目了然,包含此java文件的package信息、import引入的依赖信息。类的字段和方法等信息:“3”SymbolTable (symbol table )、“symbol table”是一系列符号可以认为散列表中的K-V值对的形式(实际上,符号表不一定在散列表中实现,而是可以是排序符号表、树符号表、堆栈结构符号表等)。 在符号表中注册的信息用于编译的各个阶段。 在语义分析中,符号表中注册的内容用于语义检查(例如,检查类型是否匹配)和中间代码的生成。 在目标代码生成阶段,在对符号名称进行地址分配时,符号表是地址分配的依据。 (4)评论处理阶段jdk1.5以后,java提供评论支持,评论可以在编译、类加载、运行时读取,执行相应的处理。 注释允许开发人员在源文件中嵌入补充信息,而不更改原始逻辑。 如果编译过程中存在需要处理的注释,则会在当前阶段读取和处理这些注释。 )5)语义分析句法分析后,编译器获得了程序源代码的抽象语法树。 语法树可以表示结构上正确的源程序抽象,但不能保证源程序是逻辑的。 语义分析的主要任务是对结构正确的源程序进行类型审查等上下文相关性质的审查。 举个例子,假设有以下三个变量定义语句。 int a=1; 布尔型b=假; char c=3; 后续代码可能会发生操作赋值执行。 int d=a c; int e=b c; char f=a b; 在上面的代码中,它们都构成了结构上正确的语法树,但只有第一种写法可以毫无意义地编译。 其他两种类型在Java语言中不逻辑,无法编译(Java允许int类型与char、short、byte类型和加减等操作,但不能与boolean相关联)。 在javac编译过程中,语义分析过程分为标注检查、数据和控制流分析、语法糖解除三个步骤。 1、标注检查标注检查主要包括变量在使用前是否声明、变量与赋值之间的数据类型是否匹配等。

在标记检查步骤中,还有一种重要的行为称为常量折叠。 在代码中写入以下定义时,int a=1 2; 那么语法树中依然可见字面量“1”、“2”以及算子“ ”,但经过语义分析阶段的常数折叠后,它们又折叠成字面常数“3”。 2、数据和控制流分析数据和控制流分析进一步验证了程序的上下文逻辑,程序的局部变量在使用前是否赋值,方法的每个路径是否有返回值,所有检查的异常都得到正确处理编译时的数据和控制流分析与类加载时的数据和控制流分析的目的基本一致,但检查范围不同,有只能在编译时或运行时进行的检查项目。 3、解除语法糖。 简而言之,就是在开发语言中添加一些语法。 这些语法对开发人员非常友好和有用,主要用于使用的开发语义的易用性、开发人员开发的代码的可读性、降低程序代码的错误率等。 但是,这些语法对开发语言的功能和性能影响不大。 例如,java中的基本类型及其相应引用类型的直接拆包操作,在我们的代码中可以写为: int a=1; Integer b=a 2; 实际上,编译后,在gui等class逆编译工具中,int a=1; integerb=integer.valueof(a2; 我在j

ava中,还提供了for(i:xx)循环遍历、支持string的switch case、泛型、变长参数等等语法糖。关于java中的语法糖,后续会出一篇博客,专门讲述。解除语法糖阶段,就是将我们代码中java提供的语法糖解析还原为java原本的基础语法结构。因为在运行期间,jvm是不支持这些语法糖对应的语法的。(6)字节码生成阶段字节码生成阶段,会将前面生成的语法树、符号表等信息转化为字节码输出到磁盘中,并且会进行相关的代码添加和转换工作。比如,当我们使用javap查看反汇编代码时,会看到通过new创建对象时,实际上是调用了这个对象的方法,完成对象的初始化,这个方法就是在字节码生成阶段添加的,它会将我们在代码中写的普通语句块、成员变量初始化、调用父类构造器等等操作都放入到方法中,完成对象的初始化操作。再比如,多个字符串变量相加a+b+c,实际上是创建了一个StringBuilder对象,对这些字符串变量进行append()操作,这些通过javap都能看到。关于javap的使用,可以参考我的博客《通过javap命令分析java汇编指令》。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。