Javac编译过程

Javac编译源码为字节码的过程 对于上述代码片段,语法树可能包含一个变量声明节点,其中包含一个类型节点(“int”)和一个变量节点(“num”),还有一个赋值节点,其中包含一个变量节点和一个常量节点。在这个阶段,Javac将语法树转换为字节码表示形式,字节码是一系列操作码(Opcode)和操作数的序列。总结起来,Javac将源代码编译为字节码的过程包括词法分析、语法分析、语义分析、中间代码生成、优化和字节码生成。生成字节码(Bytecode Generation):最后,Javac将经过优化的中间代码转换为最终的字节码文件。 阅读详情

引入

Java的编译器先将其编译为class文件,也就是字节码,这一步称为Javac编译;然后将字节码交由jvm(java虚拟机)解释执行,因而很多地方说“java是一种半编译、半解释执行”的语言。当然现在由于JIT的出现,这种说法有部分是错误的。接下来的两篇博客,会简略介绍一下Javac 编译过程和JIT机制。

Javac编译过程

Javac编译器将.java文件编译成为.class文件的过程,这里的Javac编译器称为前端编译器;相对应的还有后端编译器,它在程序运行期间将字节码转变成机器码。

Javac编译(前端编译)包括 词法、语法分析 、填充符号表 、语义分析、字节码生成。

词法、语法分析

词法分析是将源代码的字符流转变为标记(Token)集合。单个字符是程序编写过程中的的最小元素,而标记则是编译过程的最小元素,关键字、变量名、字面量、运算符等都可以成为标记。例如,下面这行代码

int num = a + 6;

这行代码包含了6个标记,分别是 int 、 num 、 = 、 a 、+ 、 6;

这里的整型标志int虽然由三个字符构成,但是它只是一个标记,不可拆分。

词法分析的作用是将Java源文件的字符流转变成对应的Token系列。而语法分析是将词法分析生成的Token序列来构建更加结构化的抽象语法树的过程。

抽象语法树是一种用来描述程序代码语法结构的树形表示方式,语法树的每一个节点都代表着程序代码中的一个语法结构,例如包、类型、修饰符、运算符、接口、返回值甚至代码注释等都可以是一个语法结构。语法分析过程由com.sun.tools.javac.parser.Parser类实现,这个阶段产出的抽象语法树由com.sun.tools.javc.tree.JCTree类表示。

经过这个步骤之后,编译器就基本不会再对源码文件进行操作了,后续的操作都是建立在抽象语法树上。

填充符号表

符号表是由一组符号地址和符号信息构成的表格。在目标代码生成阶段,对符号名进行地址分配时,符号表是地址分配的依据。

可以把它想象成哈希表K-V值对,或者JavaScript中键值对的形式。

一个类除了类本身会定义一些符号变量如类名称、变量名称和方法名称等,还有一些符号是引用其它类的,这些符号会调用其它类的方法或者变量等,还有一些类可能会继承或者实现超类和接口等。这些符号都是在其他类中定义的,那么就需要将这些类的符号也解析到符号表中。

记载的信息通常是标识符(identifier)的相关信息,如类型,作用域等。它通常会在语义分析(Semantic Analysis)阶段运用到,如我们在语法分析(Syntax Analysis)阶段是不会处理这样的情况的:

int a;
a = "Hello,World!";

而这种情况,我们则可以在语义分析分析阶段,利用Symbol Table进行处理,识别出类型的不匹配情况。

语义分析

语法树能表示一个结构正确的源程序的抽象,但无法保证源程序是符合逻辑的。而语义分析的主要任务是读结构上正确的源程序进行上下文有关性质的审查。
语义分析过程分为标注检查和数据及控制流分析两个步骤:

  • 标注检查步骤检查的内容包括诸如变量使用前是否已被声明、变量和赋值之间的数据类型是否匹配等。
  • 数据及控制流分析是对程序上下文逻辑更进一步的验证,它可以检查出诸如程序局部变量在使用前是否有赋值、方法的每条路径是否都有返回值、是否所有的受查异常都被正确处理了等问题。

字节码生成

字节码生成阶段不仅仅是把前面各个步骤所生成的信息转化成字节码写到磁盘中,编译器还进行了少量的代码添加和转换工作。 实例构造器()方法和类构造器()方法就是在这个阶段添加到语法树之中的。

字节码生成结束后,.java文件就变成.class文件了,在执行Java程序时 ,字节码由JVM逐条解释执行。不过这是在JIT出现之前的情况了,下篇将介绍JIT。

笔者也是边学边写,如有错误,请在评论中指正。

SAP-ABAP:SAP ABAP 深度解析:BAPI 从入门到精通 —— 原理、实战与自定义开发全指南 SAP ABAP BAPI 深度解析摘要 本文全面介绍了 SAP ABAP 中的 BAPI(业务应用程序编程接口)技术,涵盖以下核心内容: BAPI 定义与特点:BAPI 是 SAP 为业务对象提供的标准化编程接口,具有面向对象、封装业务逻辑、标准化错误处理和版本兼容性等特点。 BAPI 与 RFC 关系:所有 BAPI 都是 RFC,但需额外满足业务对象注册、标准化参数和错误处理等要求。 BAPI 核心作用:包括业务逻辑封装、系统集成、标准化错误处理、版本兼容和审计合规。 实战演示:通过创建销售订单的完整 阅读详情

相关推荐

SAM2与Docker的完美组合:5分钟搞定Linux环境下的图像分割部署

本文详细介绍了如何在Linux环境下通过Docker快速部署SAM2图像分割模型,解决安装过程中的常见问题。文章提供了从镜像选择、CUDA版本匹配到容器构建的全流程指南,特别针对GPU加速环境下的'cudnn_frontend: No execution plans support the graph'等报错提供了实用解决方案,帮助开发者在5分钟内完成高效部署。

fern8的博客 933

Java基础 - javac命令详解(1) 编译基本java项目

1.为什么要搞定 javac 命令 1.javac 是java中的编译源代码的命令工具,将.java文件编译成 .class 文件; 2.由于当下为了提高开发效率,大多数的开发工作都在 java的 集成开发环境中进行,因此,也就很少有机会直接使用javac命令来编译我们的代码; 本文就对javac命令的使用场景进行一个较为系统的论述。 希望本文能够帮助到广大的 java coder! 2.javac 命令使用的两个场景 2.0 javac 语法介绍 1. javac 源文件 :

northcastle的博客 6万+

从防御者视角复盘:用WinArpAttacker和Wireshark在Windows上模拟并检测ARP欺骗攻击

本文详细解析了Windows平台下的ARP欺骗攻击与防御策略,通过WinArpAttacker和Wireshark工具模拟攻击并检测异常流量。文章涵盖实验环境搭建、攻击原理深度解析、流量特征分析及企业级防御方案,帮助安全运维人员全面掌握ARP攻击检测与防护技术。

weixin_30918633的博客 121

【Java可执行命令】(一)编译工具javac:从源代码到字节码,深入解析Java编译工具 javac ~

javac是 Java 编译器的命令行前端工具,用于将 Java 源代码文件编译成可在 Java 虚拟机上执行的字节码文件。它具有跨平台性、可移植性以及自动内存管理等优点,同时也存在较长的编译时间和性能损耗的缺点。开发人员可以通过适当使用参数来控制编译过程和生成的字节码文件。javac在编译过程中使用多阶段方法,从解析源代码到生成字节码文件。它在开发 Java 应用程序和跨平台开发方面有广泛应用,并且是 Java 开发人员的常用工具之一。

Technology changes the world of life 6841

Token算力工厂建设方案:从GPU集群到计量计费的全链路设计

在AI应用从“租核”走向“买Token”的范式转换中,算力交付的核心指标已不再是vCPU或GPU实例,而是单位时间内的Token产出量与单Token成本。这一变化推动基础设施从资源租赁向计件生产演进,要求GPU集群、推理引擎、调度系统、计量计费等模块像工厂产线一样协同运转。本文从硬件异构混部、存储网络设计、推理引擎调优、Token网关与配额管理、稳定性治理等维度,系统拆解如何构建一座可量化、可计费、可扩展的Token算力工厂,并给出分三期落地的推进节奏,帮助架构师与技术管理者在AI基础设施建设中实现成本可控

weixin_29095587的博客 264

基于Linux的PCIe设备驱动开发入门到精通-- 11.2 锁机制与并发控制 (自旋锁、互斥锁) 11.3 性能瓶颈分析与优化建议

本文探讨Linux驱动开发中的性能优化方法论,重点聚焦并发控制与性能瓶颈分析。从锁机制选择(自旋锁、互斥锁等)到工具使用(ftrace、perf),详细介绍了定位锁竞争和CPU热点的实战步骤,包括ftrace事件跟踪和perf火焰图分析。针对常见性能瓶颈(CPU/内存/I/O/锁竞争),提出了锁粒度优化、无锁结构替换、中断处理优化等解决方案。强调性能优化需要理论结合实践,通过"假设-测量-验证"的循环持续迭代。为开发者提供了一套从问题定位到解决的完整方法论,助力开发高性能工业级驱动。

MHD0815的博客 130

Javac编译原理:基本结构和工作原理

Javac的编译原理,工作原理,基本结构

m0_73976305的博客 3797

工艺边与定位孔设计经验规则总结

工艺边是在SMT焊接时,为了PCB和导轨接触预留的PCB边。工艺边和PCB的接触部分一般需要开槽,或者使用邮票孔,以方便后期去除工艺边。

fydar的博客 1985

Java之Javac编译

javac 是 Java 开发过程中不可或缺的一部分,它将 Java 源代码转换为可在 JVM 上运行的字节码。通过词法分析、语法分析、语义分析、字节码生成和优化等多个阶段,javac 确保了生成的代码既正确又高效。虽然 javac 的优化能力可能不如一些更高级的编译器,但它提供了足够的灵活性来适应大多数 Java 开发需求。随着 Java 语言的不断演进,javac 也将继续发展,以满足新的挑战和要求。

一个老Java开发的自白 1587

基于Dijkstra算法的共享单车调度优化系统设计与实现

根据最新统计数据,全球共享单车市场规模已超过300亿美元,中国作为最大的共享单车市场,日订单量超过5000万次。Dijkstra算法由荷兰计算机科学家Edsger W. Dijkstra于1956年提出,用于解决带权有向图中的单源最短路径问题。本文详细介绍了基于Dijkstra算法的共享单车调度优化系统的设计与实现。本文将详细介绍基于Dijkstra算法的共享单车调度优化系统的设计与实现,采用Java 17、Spring Boot 3.x等最新技术栈。

2201_76125393的博客 618

大华 DSS 数字监控系统 itcBulletin SQL 注入漏洞复现

大华 DSs 数字监控系统是大华开发的一款安防视频监控系统,拥有实时监视、云台操作、录像回放、报警处理、设备管理等功能。大华 DSS存在SQL注入漏洞,攻击者 pota/services/itcBuletin 路由发送特殊构造的数据包,利用报错注入获取数据库敏感信息。攻击者除了可以利用 SQL注入漏词获取数据库中的信息例如,管理员后台密码、站点的用户人人信息)之外,甚至在高权限的情况可向服务器中写入木马,进一步获取服务器系统权限poc验证是否存在漏洞如果你想查询用户名和密码。

holyxp的博客 4004

Java编译器(javac)

javac是Java开发中不可或缺的工具,它将人类可读的Java源代码转换为JVM可以执行的字节码。通过掌握javac的用法,你可以有效地编译和管理Java项目。当然!我们可以继续深入探讨Java编译器(javac)的更多功能和使用场景,以及一些常见的编译错误和调试技巧。使用-g选项编译Java程序可以生成调试信息,使得在运行时发生异常时,能够提供详细的错误信息和源代码行号。这对于调试非常有帮助,尤其是在处理复杂的程序时。结合使用jdb等调试工具,可以更有效地定位和解决问题。总的来说,Java编译器(

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 3722

SpringBoot实现快速导入EXCEL

MaterialMonitorController.java @Log(title = "物料监测", businessType = BusinessType.IMPORT) @RequiresPermissions("system:materialMonitor:import") @PostMapping("/importData") @ResponseBody ...

LEN程序员的一生 4817

javac的编译过程

随风而逝的博客 2287

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

java编译过程_【JVM】javac的编译过程

Java 编译是先把xx.java文件编译成xx.class文件。xx.class是个中间状态的字节码(Byte Code)。类加载器(Class Loader)读取到JVM里后, 再一次解析成机器码(Binary Code)执行。也就是说Java是需要做两次编译,其中的第一次编译(.java => .class)是如何执行的呢?之前介绍过C语言编译执行是需要4个步骤(预处理,编译,汇编,链...

weixin_35962107的博客 1291

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java系列——javac 的编译过程

javac 的编译过程

qq_41817756的博客 398

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Javac编译过程笔记

Javac前端编译简述这里不讨论JIT编译、AOT编译,本文提到的编译过程仅仅指把.java文件转变为.class文件的过程,这个过程是我们最常见的,通常由Javac编译器来完成。Javac编译器对代码的运行效率几乎没做什么优化,虚拟机设计者把对代码性能的优化集中到了后端的JIT编译器中。之所以这样设计,因为Class文件拥有虚拟机规范严格定义的通用格式,只要符合Class文件格式,就可以被虚拟机正

Battling against our own ignorance 1012

Javac的编译过程

javac的编译过程: 解析和填充符号表->注解处理->语义分析和字节码生成 其中,注解处理之后,如果注解处理插件对语法树进行了修改,那么再回到解析和填充符号表步骤,重新开始这个Round,直到注解处理器不再对语法树进行修改为止。 这里说的不太细致。原因是,书上描述的也不太细致=。=,等我细致的了解过之后再来更新。

imzoer的专栏 1461

javac 编译过程

javac 编译过程 一、解析与填充符号表:   1. 语法、此法分析:   a) 语法分析:将源代码字符流转换为标记(Token:编译过程最小元素)集合。   b) 词法分析:根据标记序列构造抽象语法树(AST:用来描述程序代码语法结构的树形表示方式,每一个节点代表程序中的一个语法结构。   2. 填充符号表:一组符号地址和符号信息组成的...

weixin_30734435的博客 179

javac编译过程

把.java源文件变成.class。

github_73913334的博客 397

javac编译器的过程

javac编译器的过程: 1)解析与填充符号表过程     1,词法、语法分析     2,填充符号表 2)插入式注解处理器的注解处理过程 3)语义分析与字节码生成过程

xuqiaobo的博客 390

javac编译器的工作过程

前言: 当你跑起你写好的程序时,你是否好奇你的代码是怎么从一个.java的文件变成.class文件,又是怎么加载到jvm中的,又是怎么运行起来的吗?不知道不要紧今天就带你去了解一下; 先来介绍两个东西:javac(编译器)、jvm(虚拟机) javac: javac的任务是将Java源代码语言 (.java文件) 先转化成JVM能够识别的一种语言,然后由JVM将JVM语言再转化成当前这个机器能够识别的机器语言,javac的作用简单来说就是通过一些列的流程之后将.java文件转换为.class文件, ja

一只程序员的博客 584
上一篇: 矩阵奇异值分解与照片压缩、去噪
下一篇: Java中的JIT机制对运行速度的优化
lxydo
博客等级 码龄12年 98粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值