首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

大牛用一文带你深入解析java虚拟机:C1编译器的编译流程

后续小节将详细描述这些过程。...字节码转换为各种形式的中间表示,然后在其上做代码优化和机器代码生成,这个机器代码就是C1的产出。...可以看出,连通Java字节码和JIT产出的机器代码的桥梁就是中间表示,C1的大部分工作也是针对中间表示做各种变换。...高级中间表示 开发者用Java写代码,经过javac编译得到相对紧凑、简洁的字节码,但是即便是字节码,对于编译器来说也还是太过高级,所以编译器会使用一种更适合编译优化的形式来表征字节码,这个更适合优化的形式即高级中间表示..., &gen, frame_map()); allocator->do_linear_scan(); ... }} 首先使用LIRGenerator将HIR转换为更低级的LIR,然后使用LinearScan

69320

深入浅出JVM(四)之类文件结构

Java虚拟机执行Java虚拟机和字节码是语言、平台无关性的基石本篇文章将深入浅出的解析字节码文件无关性的基石曾经: 源代码->经过编译->本地机器码Java: 源代码->经过编译->字节码 -> 解释器...一次编译,到处运行语言无关性的基石:Java虚拟机字节码Java虚拟机不是只可以执行Java源代码编译而成的字节码,只要符合要求(安全...)的字节码,它都可以执行因此Kotlin...等语言可以运行在.......)Exceptions属性列举出方法中可能抛出的检查异常(Checked Exception),也就是方法声明throws关键字后面的列举异常LineNumberTable属性描述Java源码行号与字节码指令行号...(字节码偏移量)对应关系SourceFile属性记录生成此Class文件的源码名称StackMapTable属性虚拟机类加载验证阶段的字节码验证时,不需要再检验了,只需要查看StackMapTable属性中的记录是否合法编译阶段将一系列的验证类型结果记录在...(字节码行号)对应关系 LocalVariableTable Java源码定义的局部变量与栈帧中局部变量表中的变量对应关系(局部变量名称,描述符,局部变量槽位置,局部变量作用范围等

12221
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Python 高级教程之探索 Python code object

    这类似于像 C 这样的语言的工作方式:您将代码编写为人类可读的文本,该代码由编译器转换为二进制格式,然后运行二进制代码(C 的机器代码和 Python 的所谓字节码)直接由 CPU(对于 C)或由 CPython...这意味着行号表,并存储字节码指令到行号的压缩映射。它是一串二进制数据,其中每两个字节是一对(增加co_code字符串中的偏移量,增加 Python 行号)。...第一行表示我们应该将字节码偏移量加0,行号偏移量加1(第一行号是def行,但没有字节码直接对应)。...然后第二行告诉我们将字节码偏移量增加 6,行号偏移量增加 1,这对应于接下来的 6 个字节在我们刚刚通过的行的事实。然后其余的代码隐含在我们现在到达的那一行。...这些被LOAD_FAST类似的操作码使用,它们将这个元组的索引作为参数。在运行时,VM 分配一个相同大小的数组来保存每个变量的值。

    72940

    你了解 Python 字节码的原理吗?

    Python 将转换为一系列字节码指令: 1.一个LOAD_NAME指令,用于查找函数对象 my_function,并将其推送到计算栈的顶部 2.另一个 LOAD_NAME 指令去查找变量 my_variable...dis 模块的使用 dis 模块包括一些用于处理 Python 字节码的函数,可以将字节码“反汇编”为更便于人阅读的形式。查看解释器运行的字节码还有助于优化代码。.../usr/bin/env python3 # encoding: utf-8 my_dict = {'a': 1} 输出按列组织,包含原始源代码行号,代码对象中的指令地址,操作码名称以及传递给操作码的任何参数...第二列(可选)指示当前执行的指令(例如,当字节码来自帧对象时)【这个例子没有】 第三列 一个标签,表示从之前的指令到此可能的 JUMP 【这个例子没有】 第四列 数字是字节码中对应于字节索引的地址(这些是...其中 SETUP_FINALLY 字节码的含义是将 try 块从 try-except 子句推入块堆栈。 这里可以看出将 LOAD_NAME 将 j 压入栈之后就报错了。

    2.6K40

    从字节码层面看“HelloWorld”

    (使用UltraEdit的16进制模式打开):  红色框内的部分就是HelloWorld.class的内容,其他部分是UltraEdit自动生成的:红色框顶部的0~f代表列号,左边部分代表行号,右侧部分是二进制码对应的字符...minor_version(u2):00 00,小版本号,因为我这里采用的1.7,所以小版本号为0. major_version(u2):00 33,大版本号,x033转换为十进制为51,下表是jdk...第一个方法结束后,接着进入第二个方法: 第二个方法的属性长度为x037,转换为十进制为55个字节。...三、基于字节码的操作:   通过对HelloWorld这个程序的字节码分析,我们应该能够比较清楚的认识到整个字节码的结构。那我们通过字节码,可以做些什么呢?...如果我们手动去修改字节码文件,将打印“HelloWorld”的代码插入到sayHello方法中,原理上肯定没问题,不过操作过程还是比较复杂的。

    31010

    一文带你学明白java虚拟机:C1编译器,HIR代码优化

    规范化 C1解释执行基本块字节码构造SSA指令时会进行规范化(Canonicalize[1]),将HIR指令转化为一种更简洁、更统一的形式,具体说明如下。...ArrayLength:JVM的arraylength字节码可以取数组长度。在规范化期间如果发现数组是编译器可知的字面值,则用常量代替这条指令。...每当将一条字节码转换为一条SSA指令时,调用append_with_bci的过程中就会应用规范化,规范化是这些局部优化执行的最佳时机。...当C1解释执行基本块的字节码构造SSA指令时,如果遇到4条invoke字节码,它会调用GraphBuilder::try_inline()尝试内联。...局部值编号发生在C1解释执行基本块的字节码构造的SSA指令中,如代码清单8-11所示。

    86530

    大多数程序员都懂的java虚拟机:C1编译器从字节码到HIR

    build_hir()会创建一个GraphBuilder对象,而这个创建的过程就是字节码转换为HIR的过程。...识别基本块 字节码是线性结构,所以在识别时可以使用BlockListBuilder线性地遍历字节码,找到if_cmp*、goto、throw、return、tableswitch、lookupswitch...这些可以改变控制流的字节码,将它们标记为leader字节码,并据此划分出基本块的边界,如代码清单8-8所示。...以图8-2所示为例,假设图中所示是一个基本块,包含了左边的字节码。C1解释执行字节码,并将状态放到ValueStack中。状态包括存放局部变量与函数入参的local和存放临时计算结果的stack。...指令;当解释imul时,该字节码会生成SSA指令,该指令以ValueStack的两个值作为参数,产出新的值i11并放入ValueStack;当解释istore_1时,将i11放入局部变量表的第二个槽,该字节码不产生

    67020

    【面试题精讲】字节码文件的组成

    字节码文件是Java源代码编译后生成的一种中间形式,它包含了可以在Java虚拟机(JVM)上执行的指令集。字节码文件由一系列字节组成,每个字节都代表一个特定的操作码或数据。...下面是字节码文件的主要组成部分: 魔数(Magic Number):字节码文件的前4个字节是固定的魔数,用于标识该文件是否为有效的字节码文件。...版本号(Version):紧随魔数之后的两个字节表示字节码文件的版本号。这个版本号用于指示使用哪个版本的Java语言规范进行编译。...常量池中的每个项都有一个索引,通过索引可以快速访问到对应的常量。 访问标志(Access Flags):访问标志描述了类或接口的访问级别和属性。...例如,源文件名、行号表、注解等都可以存储在属性表中。

    19830

    jvm之.class文件解读(下)

    接口索引集合就用来描述这个类实现了哪些接口,这些被实现的接口将按 implements 语句(如果这个类本身是一个接口,则应当是 extends 语句)后的接口顺序从左到右排列在接口索引集合中。...方法表集合 methods:指向常量池索引集合,它完整描述了每个方法的签名。 在字节码文件中,每一个 method_info 项都对应着一个类或者接口中的方法信息。...类文件 仅当一个类为局部类或者匿名类时才能拥有这个属性,这个属性用于标识这个类所在的外围方法 InnerClass 类文件 内部类列表 LineNumberTable Code 属性 Java 源码的行号与字节码指令的对应关系...LineNumberTable 属性是用来描述 Java 源码行号与字节码行号之间的对应关系。这个属性可以用来在调试的时候定位代码执行的行数。...start_pc,即字节码行号;1ine_number,即 Java 源代码行号。

    22530

    Java字节码增强探秘

    在Java中一般是用javac命令编译源代码为字节码文件,一个.java文件从编译到运行的示例如图1所示。 ?...图2中示例代码的字节码前10个字节如下图5所示,将十六进制的24转化为十进制值为36,排除掉下标“0”,也就是说,这个类文件中共有35个常量。 ?...“LineNumberTable”:行号表,将Code区的操作码和源代码中的行号对应,Debug时会起到作用(源代码走一行,需要走多少个JVM指令操作码)。...的语法转换为visitXXXXInsn()这种写法。...第一步将源码转化为助记符就已经够麻烦了,不熟悉字节码操作集合的话,需要我们将代码编译后再反编译,才能得到源代码对应的助记符。第二步利用ASM写字节码时,如何传参也很令人头疼。

    1K20

    Java字节码增强探秘

    在Java中一般是用javac命令编译源代码为字节码文件,一个.java文件从编译到运行的示例如图1所示。 ?...图2中示例代码的字节码前10个字节如下图5所示,将十六进制的24转化为十进制值为36,排除掉下标“0”,也就是说,这个类文件中共有35个常量。 ?...“LineNumberTable”:行号表,将Code区的操作码和源代码中的行号对应,Debug时会起到作用(源代码走一行,需要走多少个JVM指令操作码)。...的语法转换为visitXXXXInsn()这种写法。...第一步将源码转化为助记符就已经够麻烦了,不熟悉字节码操作集合的话,需要我们将代码编译后再反编译,才能得到源代码对应的助记符。第二步利用ASM写字节码时,如何传参也很令人头疼。

    1.9K51

    深入理解Java虚拟机(JVM)的工作原理与内存管理

    引言Java虚拟机(JVM)是Java程序运行的核心组件,负责将Java源代码翻译成可在特定硬件上执行的机器码。了解JVM的工作原理以及内存管理是高级Java开发者必备的知识之一。...Java虚拟机的工作原理1.1 Java程序的执行过程编写源代码: 开发者使用Java语言编写程序。编译源代码: 使用Java编译器将源代码翻译成字节码(bytecode),保存为.class文件。...加载类文件: JVM的类加载器加载编译后的字节码文件。...解释与执行: JVM的解释器解释并执行字节码,或者使用即时编译器(Just-In-Time Compiler,JIT)将字节码转换为本地机器码执行。...1.2 Java虚拟机的内存模型JVM的内存模型主要包括以下几个部分:程序计数器(Program Counter Register): 记录当前线程执行的字节码行号。

    61010

    动手实践:从栈帧看字节码是如何在 JVM 中进行流转的

    然后检查这个符号引用的类字节码是否加载、解析和初始化。如果没有,将执行对应的类加载过程。...查看字节码 命令行查看字节码 使用下面的命令编译源代码 A.java。如果你用的是 Idea,可以直接将参数追加在 VM options 里面。...该属性的作用是描述源码行号与字节码行号(字节码偏移量)之间的对应关系,有了这些信息,在 debug 时,就能够获取到发生异常的源代码行号。...JVM 为我们提供了非常丰富的字节码指令。...我们从实际分析一段代码开始,详细介绍了几个字节码指令对程序计数器、局部变量表、操作数栈等内容的影响,初步接触了 Java 的字节码文件格式。

    22020

    阶段01Java基础day21IO流02

    //将读到的字符强转后打印 } fr.close(); //关流 FileWriter类的write()方法可以自动把字符转为字节写出...因为读取时会把字节转为字符, 写出时还要把字符转回字节....程序需要读取一段文本, 或者需要写出一段文本的时候可以使用字符流 21.05_IO流(字符流是否可以拷贝非纯文本的文件) 不可以拷贝非纯文本的文件 因为在读的时候会将字节转换为字符,在转换过程中,可能找不到对应的字符..., 具有相同的功能, 并且可以统计行号 调用getLineNumber()方法可以获取当前行号 调用setLineNumber()方法可以设置当前行号 LineNumberReader lnr =...2.会用BufferedWriter写出字符到GBK码表和UTF-8码表的文件中 3.会使用BufferedReader从键盘读取一行 声明:本文为原创,作者为 对弈,转载时请保留本声明及附带文章链接

    43630

    linux和windows系统开发语言,java 运行机制,编译原理(CC++的源码到机器语),编译器和解释器,CC++与Java的区别

    .语义分析 在b中语法树的基础上,分析是否有错误语义,编译器所能分析的语义为静态语义,包括:声明是否正确、类型是否匹配、类型的转换是否符合要求 d.经过前面三个过程后,将源代码转换为中间语言...可以分为编译期和运行期两个周期: 编译期的输入为源代码.java文件、输出为字节码.class文件 运行期输入为字节码.class文件,输出为机器码。...Java运行期的工作并非是固定的,最基本的,也是最简单的,当然,也可以理解为保底的,是使用解释器将字节码转换为机器码,该原理相当的清晰明确,有以下步骤: a.按一定的规则寻找相关的类,首先,根据环境变量找到...将源代码转化成一些有效率的字节码或者中间代码,然后再解释运行:比如pvm 3....将源代码编译成字节码或者中间代码,并指示处理器运行编译后的程序:比如JIT java的底层虚拟机就是纯C写的,如果用JAVA写个操作系统,执行的过程就是java-C-汇编-机器指令这样了,就是效率问题

    10800

    Byteman 使用指南(四)

    AT LINE AT LINE 说明符将触发点定位在触发方法中第一个可执行字节码指令之前,其源代码行号大于或等于说明符参数中提供的行号。...AT READ AT READ 说明符后面跟着字段名称,定位触发点在第一个出现的对象字段之前,即它对应于字节码中的第一个 getField 指令。...AT READ 说明符后面跟着一个以 $ 为前缀的局部变量名称、方法参数名称或方法参数索引,定位触发点在读取相应的局部或方法参数变量之前,即它对应于字节码中的 iload、dload、aload 等指令...注意,只有在触发方法的字节码中包含了局部变量表(例如,如果它已经用 -g 标志编译),才可以使用局部或参数变量名称,如 i, this 或 arg1。...相比之下,总是可以使用索引符号 0, 1 等来引用参数变量读取操作(然而,请注意,位置 AT READ 0 将仅匹配实例方法)。

    6710

    9个基本的GNU binutils 工具【Linux-Command-line】

    编译是将程序从某种编程语言(C / C ++)的源代码或文本形式转换为机器代码的过程。 机器代码是CPU(通常被称为硬件)可以理解的1和0的序列,因此可以由CPU执行或运行。...使用该练习中的文件,用“-h”(header)选项输入“readelf”,以便将文件的ELF标题转储到屏幕上。...12.37.48.png 另一方面,在a.out(可执行文件)上运行strings,会显示链接阶段二进制文件中包含的其他信息: 屏幕快照 2019-11-20 下午12.39.47.png 回想一下,编译是将源代码指令转换为机器代码的过程...使用readelf命令可以将二进制文件(a.out)的任何部分转储到屏幕上。...屏幕快照 2019-11-20 下午1.22.42.png addr2line:将地址转换为文件名和行号 addr2line工具只是在二进制文件中查找地址,并将其与C源代码程序中的行进行匹配。

    4.3K50

    Python写的Python解释器(四)

    通过使用Python标准库中的dis模块(dis是一个字节码反汇编工具,可以翻译低级代码,例如汇编代码或字节码,并以人类可读的方式进行打印出来。)...,运行dis.dis时,就会给出cond函数传递的字节码的解释。...以第一条指令LOAD_CONST为例,第一列中的2给出的是Python源代码中的行号。第二列是字节码的索引,表示LOAD_CONST指令出现在零位。 第三列是指令本身,映射成人类可读的名称。...继续再阅读这个字节码的前几个字节:[100,1,0,125,0,0]。这六个字节表示带参数的两条指令。...可以使用dis.opname(将字节变成可理解字符串)来找出指令100和125对应的内容: >>> dis.opname[100] 'LOAD_CONST' >>> dis.opname[125] 'STORE_FAST

    59830
    领券