标签: bytecode

Java字节码是否与不同版本的Java兼容?

如果我使用Java 5代码将应用程序编译为字节码,那么生成的.class文件是否能够在Java 1.4下运行?

如果后者可以工作,我正在尝试在我的Java 1.4应用程序中使用Java 5框架,那么我应该注意什么?

java compatibility jvm bytecode java1.4

3
推荐指数
1
解决办法
2394
查看次数

exec()字节码与任意本地?

例如,假设我想执行代码

    value += 5
Run Code Online (Sandbox Code Playgroud)

在我自己的命名空间内(所以结果基本上是mydict['value'] += 5).有一个函数exec(),但我必须在那里传递一个字符串:

    exec('value += 5', mydict) 
Run Code Online (Sandbox Code Playgroud)

并且将语句作为字符串传递似乎很奇怪(例如,它没有这样的颜色).可以这样做:

    def block():
        value += 5

    ???(block, mydict)
Run Code Online (Sandbox Code Playgroud)

?最后一行的明显候选人是exec(block.__code__, mydict),但没有运气:它提出UnboundLocalError了value.我相信它基本上执行block(),而不是块内的代码,所以分配并不容易 - 这是正确的吗?

当然,另一种可能的解决方案是拆卸block.__code__......

仅供参考,因为这个帖子,我得到了这个问题.此外,这就是为什么有些人(我未定)要求新语法

    using mydict: 
        value += 5
Run Code Online (Sandbox Code Playgroud)

注意这不会引发错误,但也不会改变mydict:

    def block(value = 0):
        value += 5

    block(**mydict)
Run Code Online (Sandbox Code Playgroud)

python bytecode codeblocks python-3.x

3
推荐指数
1
解决办法
2314
查看次数

fantom生成的字节码与java等效字节码一样高效吗?

从现在出现的许多jvm语言来看,有一种看起来特别吸引人

看一下

http://fantom.org/doc/docIntro/Tour.html

我只是想知道,当忽略动态类型功能时,生成的字节码是否与java等效...

ps:增加了关于性能的声明

java performance bytecode fantom

3
推荐指数
1
解决办法
1611
查看次数

Java ASM4:super(ASM4);?

好吧,我正在阅读ASM4字节码库中的PDF教程/文档/书籍(如果你愿意的话).我正在尝试这些例子并通过阅读,实际输入代码,执行,然后从输出中学习来学习.我遇到了这个部分:

   public class ClassPrinter extends ClassVisitor {
      public ClassPrinter() {
      super(ASM4);
   }
Run Code Online (Sandbox Code Playgroud)

链接在这里: http://download.forge.objectweb.org/asm/asm4-guide.pdf

我无法弄清楚在超级中传递什么.我的IDE也不是很有帮助.

java bytecode bytecode-manipulation java-bytecode-asm

3
推荐指数
1
解决办法
569
查看次数

javap输出中缺少指令编号

每次我尝试理解已编译的Java文件的反汇编代码时,我都想知道为什么缺少某些指令编号.

一个小例子:

我反汇编($ javap -c HelloWorld)一个简单的HelloWorld类.这是输出:

Compiled from "HelloWorld.java"
public class HelloWorld {
  public HelloWorld();
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return        

  public static void main(java.lang.String[]);
    Code:
       0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #3                  // String Hello World!
       5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return        
}
Run Code Online (Sandbox Code Playgroud)

如您所见,构造函数中的指令3和4以及main方法中的一些指令都缺失.

有人知道为什么这些指令编号丢失了吗?是否有一些由于某种原因隐藏的字节码指令?

java bytecode mnemonics disassembly javap

3
推荐指数
1
解决办法
233
查看次数

为什么static/member变量比局部变量慢?

我见过这个帖子:如果与条件相比的速度

我自己上课检查速度

public class Question {
static long startTime;
static long elapsedTime;

static String mStatic;
private String mPublic;

public static void main(String[] args) {
    Question q = new Question();
    q.executeGlobal();
    q.executeStatic();
    q.executeLocal();
}

public void executeLocal() {
    String mLocal;
    startTime = System.nanoTime();
    for (int i = 0; i < 1000000000; i++) {
        mLocal = "";
    }
    elapsedTime = System.nanoTime() - startTime;
    System.out.println("Type Local: " + elapsedTime + " ns");

}

public void executeGlobal() {
    startTime = System.nanoTime();
    for (int …
Run Code Online (Sandbox Code Playgroud)

java performance bytecode

3
推荐指数
2
解决办法
2080
查看次数

为什么JVM允许我们命名以字节码中的数字开头的函数?

标识符由Java语言规范,Java SE 7 Edition(§3.8)很好地定义

An identifier is an unlimited-length sequence of Java letters and Java digits, the
first of which must be a Java letter.
Run Code Online (Sandbox Code Playgroud)

据我所知,由于方法名称是标识符,因此不可能在java中命名以数字开头的方法,并javac遵守此规则.

那么,为什么Java虚拟机似乎不遵守这个规则,允许我们在Bytecode中命名一个以数字开头的函数?


这个简单的代码片段实际上会打印f99()方法名称及其参数的值.

public class Test {
    public static void main(String[] args) {
        Test t = new Test();
        System.out.println(t.f99(100));
    }

    public int f99(int i){
        System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName());
        return i;
    }
}
Run Code Online (Sandbox Code Playgroud)

编译和执行:

$ javac Test.java
$ java Test
Run Code Online (Sandbox Code Playgroud)

输出:

f99
100
Run Code Online (Sandbox Code Playgroud)

可以在编译后反汇编代码,并f99通过99(在reJ之类的工具的帮助下 )重命名所有出现的代码.

$ java …
Run Code Online (Sandbox Code Playgroud)

java jvm bytecode identifier

3
推荐指数
2
解决办法
610
查看次数

JVM是否生成字节码或运行字节码?

我在这里有点困惑,JVM是代表字节码(生成它)还是它只是将已编译的.class文件(字节码)加载到内存中?!或者JVM只是以独立于平台的方式运行字节码的规范?!非常感谢你.

java compiler-construction jvm bytecode javac

3
推荐指数
2
解决办法
7574
查看次数

Java字节码lookupswitch和tableswitch总指令长度

使用给定的字节码,当遇到switch指令时,我想知道下一条指令的位置(不运行代码).为了做到这一点,我想我应该计算指令的总大小,包括跳转偏移或匹配偏移对.这可能吗?如果不是,怎么可能知道下一条指令在哪里?

此外,还有其他任何具有动态大小的字节码指令(它们的大小基于变量)吗?

tableswitch

tableswitch
<0-3 byte pad>
defaultbyte1
defaultbyte2
defaultbyte3
defaultbyte4
lowbyte1
lowbyte2
lowbyte3
lowbyte4
highbyte1
highbyte2
highbyte3
highbyte4
jump offsets...
Run Code Online (Sandbox Code Playgroud)

lookupswitch

lookupswitch
<0-3 byte pad>
defaultbyte1
defaultbyte2
defaultbyte3
defaultbyte4
npairs1
npairs2
npairs3
npairs4
match-offset pairs...
Run Code Online (Sandbox Code Playgroud)

java bytecode

3
推荐指数
1
解决办法
246
查看次数

编译什么防止?

RubyVM可以将Ruby代码编译为字节代码,然后直接执行它.例如,

COMPILE.rb

File.write(ARGV[1],RubyVM::InstructionSequence.compile_file(ARGV[0]).to_binary)
Run Code Online (Sandbox Code Playgroud)

EXECUTE.rb

RubyVM::InstructionSequence.load_from_binary(File.read(ARGV[0]).force_encoding(Encoding::ISO_8859_1)).eval
Run Code Online (Sandbox Code Playgroud)

TEST.BAT

ruby COMPILE.rb test.rb test.rbx
ruby EXECUTE.rb test.rbx
Run Code Online (Sandbox Code Playgroud)

test.rb本身的ruby代码实际上是执行的.这里有任何明显的缺点吗?一位朋友建议人们可能要小心,因为它可能不会在其他操作系统上运行.但是我希望它适用于所有操作系统,例如Java字节码,它可以在JVM执行的所有操作系统上运行.

编译Ruby到字节代码有什么明显的缺点(当然可读性除外)?

ruby bytecode

3
推荐指数
1
解决办法
61
查看次数