编译原理之美
宫文学
北京原点代码 CEO
46197 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 45 讲
开篇词 (1讲)
编译原理 · 期中考试周 (1讲)
编译原理之美
15
15
1.0x
00:00/00:00
登录|注册

32 | 字节码生成:为什么Spring技术很强大?

可以更充分地利用寄存器来保存中间值
指令要显式地指出操作数的位置
操作数栈做计算
栈桢包含本地变量数组、操作数栈和常数
每个线程有一个JVM栈
cglib采用了asm来生成字节码
cglib自动生成代理
Java的动态代理技术
用来解析字节码
用来生成字节码
基于寄存器的虚拟机
基于栈的虚拟机
可以被解释执行和即时编译执行
运行在Java虚拟机上
二进制格式的中间代码
建议Java程序员多了解JVM的运行机制和Java字节码
ASM是一个字节码操纵框架
运行程序的虚拟机有两种设计
代理技术
Spring的IoC和AOP特性
不需要关心指令选择、寄存器分配、指令重排序、优化算法
逻辑简单
MethodVisitor
ClassWriter
解析字节码的过程类似XML的解析器解析XML的过程
开源的字节码生成工具
JVM
字节码
课程小结
Spring与字节码生成技术
将AST编译成字节码
字节码生成工具ASM
Java虚拟机和字节码
字节码生成技术

该思维导图由 AI 生成,仅供参考

Java 程序员几乎都了解 Spring。它的 IoC(依赖反转)和 AOP(面向切面编程)功能非常强大、易用。而它背后的字节码生成技术(在运行时,根据需要修改和生成 Java 字节码的技术)就是一项重要的支撑技术。
Java 字节码能够在 JVM(Java 虚拟机)上解释执行,或即时编译执行。其实,除了 Java,JVM 上的 Groovy、Kotlin、Closure、Scala 等很多语言,也都需要生成字节码。另外,playscript 也可以生成字节码,从而在 JVM 上高效地运行!
而且,字节码生成技术很有用。你可以用它将高级语言编译成字节码,还可以向原来的代码中注入新代码,来实现对性能的监测等功能。
目前,我就有一个实际项目的需求。我们的一个产品,需要一个规则引擎,解析自定义的 DSL,进行规则的计算。这个规则引擎处理的数据量比较大,所以它的性能越高越好。因此,如果把 DSL 编译成字节码就最理想了。
既然字节码生成技术有很强的实用价值,那么本节课,我就带你掌握它。
我会先带你了解 Java 的虚拟机和字节码的指令,然后借助 ASM 这个工具,生成字节码,最后,再实现从 AST 编译成字节码。通过这样一个过程,你会加深对 Java 虚拟机的了解,掌握字节码生成技术,从而更加了解 Spring 的运行机制,甚至有能力编写这样的工具!
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了Java字节码生成技术及其在Spring框架中的应用。通过讲解Java虚拟机和字节码的指令、基于栈的虚拟机和基于寄存器的虚拟机的运行机制,以及使用ASM工具生成字节码的过程,读者可以深入了解字节码生成技术的实用价值和基本原理。文章还掏出了基于AST生成JVM字节码的逻辑,以及Spring框架中与字节码生成技术相关的内容。通过掌握字节码生成技术,读者可以更深入了解Java虚拟机,掌握Spring的运行机制,甚至有能力编写类似的工具。整体而言,本文对于想要深入了解Spring技术背后支撑的读者具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《编译原理之美》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(8)

  • 最新
  • 精选
  • 老师能不能为我们展望一下量子计算机的面世和普及,会给编译器、操作系统、网络等传统计算机技术带来什么样的冲击?会不会完全是另外一套技术栈?

    作者回复: 答案是肯定的。因为编译器、操作系统,都是跟底层架构关系密切。我们目前用的编译器和操作系统的基本架构,跟50年前没有太大区别,原因就是计算机的基础架构没有改变。 你的问题是个好问题。我不一定能安排在正文里。但我记下来,有机会再发一篇文章,或者单独回复你!

    2019-11-08
    3
    14
  • 孤星可
    我正在写一个简单的 解释型 jvm 有兴趣欢迎共建 github mini-jvm

    作者回复: 喔,不错。极客范! 这种练习会极快地提升自己,值得提倡! 我先去关注一下,看到了:https://github.com/guxingke/mini-jvm

    2019-11-18
    11
  • 树袋熊
    老师,为什么把dsl编译成字节码会提高性能呢?和用java程序来解析dsl,然后用jvm运行两者有什么不同呢?dsl编译成字节码比较快是相对什么情况比较快?

    作者回复: 这跟解释执行的语言速度慢,而编译后的语言执行速度快,是一样的道理。 以一个简单的加法为例,比如执行“a+b”,如果编译执行,可以知道a和b是什么数据类型,直接生成对应的目标代码。在Java字节码中,处理整数加法和浮点数加法的指令是不一样的。 而如果你写个解释器执行,就必须在运行时判断它们的数据类型,然后执行针对某种数据类型的运算。实际的发生的运算量,要比编译的情况下大很多。

    2020-06-26
    2
  • sugar
    补充一点:基于寄存器的虚拟机,google的js虚拟机v8目前也是了(以前是栈机)。
    2020-05-03
    4
  • Geek_08d95a
    老师 你好 你说的你们正在使用dsl这块做规则引擎 可以分享一下吗
    2022-11-27归属地:广东
    1
  • 阿鼎
    像c++这种编译型语言,如何做到AOP、IOC?
    2021-08-20
    1
  • dll
    栈机并不是不用寄存器,实际上,操作数栈是可以基于寄存器实现的,寄存器放不下的再溢出到内存里。只不过栈机的每条指令,只能操作栈顶部的几个操作数,所以也就没有办法访问其它寄存器,实现更多的优化 -—————————————————————————————————— 不太理解,jvm的指令只能操作栈顶的数据,栈一定不在寄存器上,cpu是通过把这部分字节码的栈放到高速缓存里被快速读取到吗?要是次次都从内存读不得慢死了吗? 但是好像栈用到对象引用地址,对象都得从堆上取真正的对象数据,那不是次次都得访问内存?jvm是自己内部的机制产生的指令才会用到寄存器?专门操作字节码的指令就不用寄存器?是这样吗
    2022-07-27
  • ifelse
    学习了,字节码生成
    2021-10-25
收起评论
显示
设置
留言
8
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部