标签: bytecode

'main'方法中的JVM指令ALOAD_0指向'args'而不是'this'?

我正在尝试为学术研究实现Java的一个子集.好吧,我处于最后阶段(代码生成),我编写了一个相当简单的程序来查看如何处理方法参数:

class Main {
    public static void main(String[] args) {
        System.out.println(args.length);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我构建了它,并通过我在以下网址找到的在线反汇编程序运行'Main.class':http: //www.cs.cornell.edu/People/egs/kimera/disassembler.html

我得到了'main'方法的以下实现:(反汇编输出在Jasmin中)

.method public static main([Ljava/lang/String;)V
    .limit locals 1
    .limit stack 2

    getstatic   java/lang/System/out Ljava/io/PrintStream;
    aload_0
    arraylength
    invokevirtual   java/io/PrintStream.println(I)V
    return
.end method
Run Code Online (Sandbox Code Playgroud)

我的问题是:
1.aload_0应该将'this'推送到堆栈(这就是JVM规范似乎说的)
2.arraylength应该返回引用位于堆栈顶部的数组的长度

所以根据我的说法,1和2的组合甚至不应该起作用.

它是如何/为什么有效?或者是反汇编工具,实际的字节码是别的吗?

java jvm bytecode instructions jasmin

21
推荐指数
1
解决办法
6456
查看次数

Lua的字节码规范

谁能告诉我在哪里可以找到Lua的字节码规范?我一直在寻找15分钟,但我找不到任何东西.

documentation lua bytecode

20
推荐指数
4
解决办法
2万
查看次数

什么是字节码以及JVM如何处理它们

我多次听说Java实现了JIT(即时)编译,它的跨平台可移植的字节码得到了JVM的"解释".但是,我真的不知道字节码是什么,以及JVM在Java语言架构中的实际意义; 我想更多地了解他们.

java jvm bytecode

20
推荐指数
2
解决办法
2万
查看次数

.pyc文件在哪里?

我是python的完全新手,因此是一个愚蠢的问题.

据我所知,在第一次执行*.py程序时,字节代码被创建到*.pyc并一直使用,直到*.py文件发生变化.

在项目中可以找到*.pyc字节码的位置?

我会想bin,但没有什么

python bytecode

20
推荐指数
2
解决办法
1万
查看次数

是否在.NET中明确地将无限循环作为一种特殊情况处理?

今天早些时候,当我编写一个方法时,我发现我不确定为什么我正在实现的成语编译.如果其他一切都被抽象掉了,它看起来像这样:

    private int Example()
    {
        while (true)
        {
            if (some condition)
            {
               return 1;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

你有一个显式无限循环,循环内部的一些条件导致循环以return语句结束.让我们暂时忽略为什么我这样做,而不是检查while子句中的终止条件,因为答案是错综复杂且无关紧要的 - 我想知道的是为什么编译器不会将此标记为"Not"所有路径都返回一个值." 错误,严格地说并非所有路径都返回值.永远不会输入while循环(当然,从未发生过)的情况不会返回任何内容.

现在,我可以想象它发生的原因有两个:这是由于其他原因而发生的优化的副作用,或者这种情况显然由编译器处理以允许这个习惯用法.我的直觉是它可能是第一种情况.例如,这根本不会让我感到惊讶:

private int Example2()
{
   if (true) return 1;
}
Run Code Online (Sandbox Code Playgroud)

因为编译器在if中看到一个常量true,并优化条件.我不明白为什么这会"修复"第一个例子.

哦,甚至更奇怪的是,如果摆脱循环的一些优化正在发挥作用,这将编译:

    private int Example3()
    {
        while (true)
        {
            if (false)
            {
               return 1;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我认为整个内部循环将被优化掉,摆脱所有有效的回报.在字节码/编译器级别实际上是什么让这一切都有意义?

.net c# bytecode compiler-optimization visual-studio

20
推荐指数
1
解决办法
552
查看次数

什么是使用try-catch-finally的Java 7 try-with-resources字节码等效?

我试图通过使用常规try-catch-finally语句重新创建它来了解新的try-with-resources语句是如何工作的.给定以下使用Java 7 try-with-resources的测试类:

import java.io.IOException;
import java.util.zip.GZIPOutputStream;

public class TryWithResources {
    public static void main(String[] args) {
        try (GZIPOutputStream gzip = new GZIPOutputStream(System.out)) {
            gzip.write("TEST".getBytes("UTF-8"));
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

你会如何重写这个类来使用try-catch-finally语句,这些语句产生与try-with-resources语句产生完全相同的字节码?此外,使用两个资源时的问题相同,如下例所示:

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;

public class TryWithResources2 {
    public static void main(String[] args) {
        try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
                GZIPOutputStream gzip = new GZIPOutputStream(baos)) {
            gzip.write("TEST".getBytes("UTF-8"));
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

java bytecode try-catch

20
推荐指数
2
解决办法
1万
查看次数

为什么要将String编译切换为两个开关

我在编译开关时阅读了JVM规范,并对如何编译String上的switch语句感兴趣.这是我检查的测试方法(JDK1.7.0_40):

static int test(String i) {
    switch (i) {
        case "a":  return  -100;
        case "45b":  return  1;
        case "c":  return  2;
        default: return -1;
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望这个方法能够在string的hashCode上编译成简单的lookupswitch,但突然之间

static int test(java.lang.String);
Code:
   0: aload_0
   1: astore_1
   2: iconst_m1
   3: istore_2
   4: aload_1
   5: invokevirtual #6         // Method java/lang/String.hashCode:()I
   8: lookupswitch  { // 3
                97: 44
                99: 72
             51713: 58
           default: 83
      }
  44: aload_1
  45: ldc           #7 // String a
  47: invokevirtual #8 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
  50: ifeq          83 …
Run Code Online (Sandbox Code Playgroud)

java jvm bytecode switch-statement java-7

20
推荐指数
1
解决办法
850
查看次数

为什么导入时会创建.pyc文件?

我已经看到几个资源描述了什么.pyc文件以及它们何时被创建.但现在我想知道为什么在.py导入文件时创建它们?

另外,为什么不.pyc为执行导入的主Python文件创建文件?

我猜这与性能优化和学习有关,这鼓励我打破我的文件,因为内置的编译似乎很好用.但是我不确定是不是这种情况,而且我也很好奇是否有人有关于运行带和不带.pyc文件的程序之间差异的统计数据,如果它确实是速度的话.

我自己运行它们但是我没有一个好的,大的Python代码库来测试它.:(

python bytecode pyc python-internals

20
推荐指数
1
解决办法
4238
查看次数

编译为java字节码(不使用Java)

我的编译器类正在创建一个我们打算编译为Java Bytecode的语言.我们已经取得了很多进展,并且正在接近代码生成的时间.

我们在查找有关如何从编译器创建.class文件的信息时遇到问题.你有什么资源可以给我们一些帮助吗?我们已经有很多关于指令集的文档,但是需要有关如何直接填写类文件/ hex的写入的信息.

我们不需要有关反编译.class文件的信息或建议.

即使是从头开始编写.class文件的简单示例也是非常好的.

JVM规范不是我们追求的.我们真正需要的是一个例子或演练.

java compiler-construction bytecode

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

"()V"在班级签名中的含义是什么?

我用Javassist创建了一个没有实际方法的构造函数

CtConstructor c = CtNewConstructor.make ( argTypes, null, newClass );
Run Code Online (Sandbox Code Playgroud)

当我试图推出这个类的签名时

c.getSignature();
Run Code Online (Sandbox Code Playgroud)

我明白了

public Echo ()V
Run Code Online (Sandbox Code Playgroud)

我很困惑"V"是什么意思?我期待公共Echo(); 或类似的东西......

java bytecode javassist

19
推荐指数
3
解决办法
8722
查看次数