标签: bytecode

为什么几乎所有的OO语言都编译为字节码?

在我所知道的面向对象语言中,除了C++和Objective-C之外,几乎所有语言都编译为在某种虚拟机上运行的字节码.为什么有这么多不同的语言在编译成字节码时,而不是机器码?在princible中是否可以使用高级内存管理的OOP语言编译为机器代码?

编辑:我知道多平台支持通常是这种方法的优势.但是,很有可能在多个平台上进行本机编译,而无需为每个平台创建新的编译器.每个例子都可以发出C代码然后用GCC编译.

compiler-construction oop programming-languages bytecode

17
推荐指数
2
解决办法
4887
查看次数

识别java字节代码中的循环

我正在尝试设法java字节码.

我想识别java循环进入和退出,但我发现循环的识别非常具有挑战性.我花了几个小时看ASM开源反编译器(我认为他们必须一直解决这个问题)但是,我做得很短.

我正在扩充/扩展的工具是使用ASM,所以理想情况下我想知道如何通过ASM来检测java中不同循环结构的进入和退出.但是,我也欢迎建议一个好的开源解编译器,因为显然它们可以解决同样的问题.

java instrumentation loops bytecode

17
推荐指数
2
解决办法
7383
查看次数

GHC Core为"字节码"?

据我所知,GHC(Glorious Glasgow Haskell编译器)将Haskell编译为"Core",然后将Core编译为机器代码.将Haskell程序作为GHC Core分发是否完全可行,就像它是"字节码"一样?这样的发行会有什么好处吗?为什么或者为什么不?

haskell bytecode ghc

17
推荐指数
1
解决办法
1088
查看次数

使用assertTrue而不是assertNull时缺少分支

在Java/Junit中,我需要使用某个对象测试null.我可以通过多种方式测试条件,但我一直在使用assertTrue进行大多数测试.当我在assertTrue中检查空值时,EclEmma声明它只测试一个分支.

当我手动将语句解析为变量(比如将结果设置为布尔值并将其传递给assertTrue)时,代码覆盖率在断言上被认为是完整的,而不是在变量初始化行上.

为什么会这样?这是否与Java显然添加的额外字节代码相关,如http://sourceforge.net/apps/trac/eclemma/wiki/FilteringOptions所述?任何解决方案(除了使用其他断言语句).

assertTrue:

assertTrue( myObject == null ); //1 of 2 branches
Run Code Online (Sandbox Code Playgroud)

assertTrue:

boolean test = (myObject == null); //1 of 2 branches missing
assertTrue(test); // complete
Run Code Online (Sandbox Code Playgroud)

assertNull:

assertNull( myObject ) //complete;
Run Code Online (Sandbox Code Playgroud)

junit code-coverage bytecode emma jacoco

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

java字节码的不同行为

我是Java Bytecode的新手.我通过一些例子理解了字节码,但我陷入了一个例子.
这些是我的java和字节码文件

class SimpleAdd{
    public static void main(char args[]){
        int a,b,c,d;
        a = 9;
        b = 4;
        c = 3;
        d = a + b + c;
        System.out.println(d);
    }
}  
Compiled from "SimpleAdd.java"
class SimpleAdd extends java.lang.Object{
SimpleAdd();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(char[]);
  Code:
   0:   bipush  9
   2:   istore_1
   3:   iconst_4
   4:   istore_2
   5:   iconst_3
   6:   istore_3
   7:   iload_1
   8:   iload_2
   9:   iadd
   10:  iload_3
   11:  iadd
   12:  istore  4 …
Run Code Online (Sandbox Code Playgroud)

java bytecode

17
推荐指数
2
解决办法
1625
查看次数

为什么需要编译Java代码,但JavaScript代码不需要编译

为什么用Java编写的代码需要用JVM解释的字节代码编译,但是用JavaScript这样的语言编写的代码不需要编译,可以直接在浏览器中运行?

有没有一种简单的方法来理解这个?

这两种语言的编写方式之间的根本区别是什么,这可能有助于理解这种行为?

我不是CS学生,所以请原谅这个问题的天真.

javascript java bytecode compilation

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

使用ASM重写Java本机方法

我试图通过使用ASM 4.0重写类的字节码来替换所有nativenative存根方法.

到目前为止我有这个:

class ClassAdapter extends ClassVisitor {

    public ClassAdapter(ClassVisitor cv) {
        super(Opcodes.ASM4, cv);
    }

    @Override
    public MethodVisitor visitMethod(int access, String base, String desc, String signature, String[] exceptions) {
        return cv.visitMethod(access & ~Opcodes.ACC_NATIVE, base, desc, signature, exceptions);
    }

}
Run Code Online (Sandbox Code Playgroud)

由执行

private static byte[] instrument(byte[] originalBytes, ClassLoader loader) {
    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
    ClassAdapter adapter = new ClassAdapter(cw);

    ClassReader cr = new ClassReader(originalBytes);
    cr.accept(adapter, ClassReader.SKIP_FRAMES);

    return cw.toByteArray();
}
Run Code Online (Sandbox Code Playgroud)

这似乎很简单:我删除ACC_NATIVE了方法visitMethod()并保留其他所有内容.然而,当我这样做时java.lang.Object …

java java-native-interface bytecode metaprogramming sandbox

17
推荐指数
1
解决办法
1677
查看次数

是否有Scala意识到像Javassist这样的高级字节码操作工具?

我正在寻找像Javassist这样的高级字节码操作工具,但它了解Scala的一些特性.较低级别的字节码操作工具应该是相对不可知的,但对于我的用例,Javassist级别的东西要好得多.但是,该级别的工具需要了解源语言及其字节码映射.Scala有这样的东西吗?到目前为止,我已经能够将Javassist与Scala一起用于非常简单的事情,但是我已经被一些Scala/Java差异所困扰了其他一些事情.

scala bytecode bytecode-manipulation javassist

17
推荐指数
1
解决办法
781
查看次数

如何读取python字节码?

我在理解Python的字节码及其dis模块时遇到了很多困难.

import dis
def func():
   x = 1
dis.dis(func)
Run Code Online (Sandbox Code Playgroud)

在解释器中输入上面的代码会产生以下输出:

    0 LOAD_CONST                  1(1)
    3 STORE_FAST                  0(x)
    6 LOAD_CONST                  0(NONE)
    9 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)

例如:

是什么意思LOAD_CONST,STORE_FAST和喜欢的数字0,3,69

我将非常感谢您可以找到此信息的特定资源.

python bytecode python-2.7

17
推荐指数
1
解决办法
7583
查看次数

是否可以在Java中在运行时实现接口?

我正在开发一个项目,其中有很多由库创建的对象,我无法访问这些对象的创建过程.

以下片段是说明我的问题的一个很好的例子.

码:

public class Clazz {
    //The contents of Clazz are irrelevant
    //Clazz is NOT my class. I have no access to its internal structure.
    //However, I do have access to Clazz objects that were created elsewhere.
}
Run Code Online (Sandbox Code Playgroud)

ExampleInterface 是Clazz在编译时可能会或可能不会实现的接口.

码:

public interface ExampleInterface {
    public void run();
}
Run Code Online (Sandbox Code Playgroud)

以下代码是我遇到的问题.请注意以下事项:

  1. run()仅当c是其实例时才被调用ExampleInterface.
  2. getRunConditions(Clazz c)并且executeClazz(Clazz c)是我无法访问的类中的私有方法.
  3. 在编译时,Clazz包含名为方法run().
  4. ExampleExecutor 不是我的班级.我无法以任何方式访问它(我甚至无法获得该类的实例).

码:

public class ExampleExecutor {
    public void executeClazz(Clazz c) …
Run Code Online (Sandbox Code Playgroud)

java bytecode

17
推荐指数
2
解决办法
7516
查看次数