bytecode相关内容
有没有办法通过dis.dis获取的反汇编来创建代码对象? 例如,我使用co = compile('print("lol")', '', 'exec')编译了一些代码,然后使用dis.dis(co)打印反汇编,现在我想将反汇编“编译”回codeObject(因为它保存所有相同的数据,并且不会丢失任何数据)。 推荐答案 令人惊讶的是,是的,有点。 但是,您需要了解一
..
为什么python在解释之前要把源码编译成字节码? 为什么不直接从源头解释? 解决方案 几乎没有解释器真正直接逐行解释代码——这实在是太低效了.几乎所有解释器都使用一些可以轻松执行的中间表示.此外,还可以对此中间代码进行小幅优化. Python 还存储了这段代码,这对下次执行这段代码有很大的好处:Python 不再需要解析代码;解析是编译过程中最慢的部分.因此,字节码表示可以大
..
汇编、机器码、字节码和操作码之间的实际关系是什么? 我已经阅读了大部分关于汇编和机器代码的 SO 问题,例如 this,但它们的级别太高,并且没有显示将实际汇编代码转换为机器代码的示例.结果,我仍然不明白它在更深层次上是如何工作的. 这个问题的理想答案是展示一些汇编代码的具体示例,例如下面的代码片段,以及每个汇编指令如何映射到机器码、字节码和/或操作码.这样的回答对以后学习汇编的人很有
..
我目前正在编写一个针对 Java 字节码翻译的玩具编译器. 我想知道在编写 .class 文件之前是否可以在发出的字节码中进行各种简单的窥视孔优化的某种目录(可能是摘要).我实际上知道一些具有此功能的库,但我想自己实现它. 解决方案 你知道Proguard吗?http://proguard.sourceforge.net/ 这是一个很棒的字节码优化器,它实现了很多优化.有关列表
..
我的编译器类正在创建一种我们打算编译为 Java 字节码的语言.我们已经取得了很大进展,并且已经接近生成代码的时间了. 我们在查找有关如何从我们的编译器创建 .class 文件的信息时遇到问题.你有什么资源可以给我们一些帮助吗?我们已经有很多关于指令集的文档,但是需要关于如何直接填写类文件/十六进制编写的信息. 我们不需要反编译 .class 文件的信息或建议. 即使是从头开始写
..
Lambda 翻译是一个两步过程,一个:将 lambda 脱糖成同一类中的静态方法. 公共类 Main {公共静态无效主要(字符串[]参数){可运行 r = () ->System.out.println("你好");System.out.println(Arrays.asList(Main.class.getDeclaredMethods()));}} [private static voi
..
有人知道为什么 JSR/RET 字节码对在 Java 6 中被弃用了吗? 我在网上找到的唯一有意义的解释是,它们使运行时的代码分析变得越来越难执行.有人知道其他原因吗? 解决方案 JSR 和 RET 使字节码验证比其他方式更困难,因为放宽了一些正常的字节码约束(例如在JSR 的入口).好处非常小(在某些情况下可能会使用更小的方法),并且验证器在处理奇怪的 JSR/RET 模式(以及潜
..
我正在尝试获取 Java 程序方法参数的值.我正在使用 ASM 来检测字节码并获取这些值.但是,我遇到了一些麻烦. 这是用于检测代码的 visitCode() 方法.它正在做的是: 创建一个空数组来存储收集到的参数. 对于每个参数,将其值加载到数组中. 将此数组发送到我的代理的 OnMethodEntry 方法(将在其中使用值). . @Override公共无效访问代码()
..
正如我们所知,我们不必向 Java 构造函数添加任何返回类型. 类示例{......样本(){...........}} 在 Objective C 中,如果我们创建一个构造函数,它会返回一个指向其类的指针.但我认为这不是强制性的. AClass *anObject = [[AClass alloc] init];//init是构造函数,返回类型是指向AClass的指针 同理,构造函数是否
..
我阅读了关于编译开关的 JVM 规范并对如何编译 String 上的 switch 语句产生了兴趣.这是我检查的测试方法(JDK1.7.0_40): static int test(String i) {开关(一){案例“a":返回-100;案例“45b":返回 1;案例“c":返回 2;默认值:返回-1;}} 我希望这个方法被编译成简单的lookupswitch on hashCode的字符
..
字节码如何在 JVM 中得到验证? 解决方案 Oracle 自己有一个关于其工作原理的小片段页面 这里. 基本上,JRE 不信任 JDK.那是因为它不知道哪个 JDK 编译器创建了类文件.在验证之前,它将类文件视为敌对文件. 在此基础上,字节码验证是防止 Sun 所谓的“恶意编译器"的必要步骤.Sun 自己的 Java 编译器确保 Java 源代码不违反安全规则,但是,当应
..
我想知道 scala 是如何生成字节码的,它是否使用了像 ASM 这样的库?或者只是将二进制文件写入 .class 文件以提高性能? 解决方案 Scala 编译器从 2.10 开始使用 ASM 4 发出字节码,支持 -target:jvm-1.5 、 -target:jvm-1.6 和 -target:jvm-1.7 后端的实现方面描述如下: 通过 ASM 发出 Scala 类
..
Java 版本之间是否存在不兼容性,Java 源代码/Java 类文件针对 Java 版本 X 无法在版本 Y(其中 Y > X)下编译/运行? “Java 版本"是指以下版本: JDK 1.0(1996 年 1 月) JDK 1.1(1997 年 2 月) J2SE 1.2(1998 年 12 月) J2SE 1.3(2000 年 5 月) J2SE 1.4(2002 年 2
..
JVM 运行时数据区为每个正在执行的方法单独的堆栈.它包含操作数堆栈和局部变量.每次加载变量时,都需要const到操作数栈,然后store到局部变量.为什么不直接操作局部变量表,做一些看似重复的工作? 解决方案 具有直接操作数的指令集必须对每条指令中的操作数进行编码.相反,使用操作数堆栈的指令集,操作数是隐式的. 在查看诸如将常量加载到变量之类的小琐碎操作时,隐式参数的优势并不明显.
..
JIT 对 Java 程序意味着什么?它是否使执行速度更快?或者是否有不是 JIT 的字节码? 解决方案 有两种方法可以禁用 JIT -Djava.compiler=NONE 否则这几乎不会编译任何东西 -XX:CompileThreshold=2000000000 或在 IBM JVM 上 -nojit 禁用 JIT 会大大降低您的代码速度,例如50 倍,但并非总是如此.如果
..
目前 (Java 6) 是否有一些您可以在 Java 字节码中执行而您无法在 Java 语言中执行的操作? 我知道两者都是图灵完备的,所以将“可以做到"理解为“可以做得更快/更好,或者只是以不同的方式". 我正在考虑像 invokedynamic 这样的额外字节码,它不能使用 Java 生成,除非特定的字节码用于未来版本. 解决方案 据我所知,Java 6 支持的字节码中没有主
..
我多次听说 Java 实现了 JIT(即时)编译,其可跨平台移植的字节码被 JVM “解释".但是,我真的不知道字节码是什么,以及 JVM 在 Java 语言体系结构中的实际含义;我想了解更多关于他们的信息. 解决方案 JVM(Java虚拟机)有一个指令集,就像一个真正的机器.该指令集的名称是 Java Bytecode.Java 虚拟机规范 中对其进行了描述.其他语言在执行前会被翻译成字
..
我最近一直在查看 Java 虚拟机规范(JVMS)试图更好地理解是什么让我的程序工作,但我发现了一个我不太明白的部分...... 4.7.4 部分描述StackMapTable 属性,在该部分中,文档详细介绍了堆栈映射框架.问题是它有点罗嗦,我最好通过例子来学习;不是通过阅读. 我知道第一个堆栈映射框架是从方法描述符派生的,但我不明白如何(这应该是解释 这里.)另外,我不完全理解堆栈映
..
invokedynamic 指令用于帮助 VM 在运行时确定方法引用,而不是在编译时对其进行硬接线. 这对于在运行时才知道确切方法和参数类型的动态语言很有用.但 Java lambda 并非如此.它们被转换为具有明确定义的参数的静态方法.并且可以使用 invokestatic 调用此方法. 那么 invokedynamic 对 lambda 有什么需求,尤其是在性能受到影响的情况下?
..
在Java中,“二进制代码"和“Java字节码"的意思一样吗? 这是 Java 中的流程吗? Java 文件 (.java) -> [javac] ->字节码文件 (.class) -> [JVM/Java解释器] -> 运行它(首先将其转换为二进制代码特定于机器) 谢谢! 解决方案 答案取决于你所说的二进制代码是什么意思. Java 字节码 是一种二进制数据格式,
..