在我所知道的面向对象语言中,除了C++和Objective-C之外,几乎所有语言都编译为在某种虚拟机上运行的字节码.为什么有这么多不同的语言在编译成字节码时,而不是机器码?在princible中是否可以使用高级内存管理的OOP语言编译为机器代码?
编辑:我知道多平台支持通常是这种方法的优势.但是,很有可能在多个平台上进行本机编译,而无需为每个平台创建新的编译器.每个例子都可以发出C代码然后用GCC编译.
我正在尝试设法java字节码.
我想识别java循环的进入和退出,但我发现循环的识别非常具有挑战性.我花了几个小时看ASM和开源反编译器(我认为他们必须一直解决这个问题)但是,我做得很短.
我正在扩充/扩展的工具是使用ASM,所以理想情况下我想知道如何通过ASM来检测java中不同循环结构的进入和退出.但是,我也欢迎建议一个好的开源解编译器,因为显然它们可以解决同样的问题.
据我所知,GHC(Glorious Glasgow Haskell编译器)将Haskell编译为"Core",然后将Core编译为机器代码.将Haskell程序作为GHC Core分发是否完全可行,就像它是"字节码"一样?这样的发行会有什么好处吗?为什么或者为什么不?
在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) 我是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编写的代码需要用JVM解释的字节代码编译,但是用JavaScript这样的语言编写的代码不需要编译,可以直接在浏览器中运行?
有没有一种简单的方法来理解这个?
这两种语言的编写方式之间的根本区别是什么,这可能有助于理解这种行为?
我不是CS学生,所以请原谅这个问题的天真.
我试图通过使用ASM 4.0重写类的字节码来替换所有native非native存根方法.
到目前为止我有这个:
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 …
我正在寻找像Javassist这样的高级字节码操作工具,但它了解Scala的一些特性.较低级别的字节码操作工具应该是相对不可知的,但对于我的用例,Javassist级别的东西要好得多.但是,该级别的工具需要了解源语言及其字节码映射.Scala有这样的东西吗?到目前为止,我已经能够将Javassist与Scala一起用于非常简单的事情,但是我已经被一些Scala/Java差异所困扰了其他一些事情.
我在理解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,6和9?
我将非常感谢您可以找到此信息的特定资源.
我正在开发一个项目,其中有很多由库创建的对象,我无法访问这些对象的创建过程.
以下片段是说明我的问题的一个很好的例子.
码:
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)
以下代码是我遇到的问题.请注意以下事项:
run()仅当c是其实例时才被调用ExampleInterface.getRunConditions(Clazz c)并且executeClazz(Clazz c)是我无法访问的类中的私有方法.Clazz将不包含名为方法run().码:
public class ExampleExecutor {
public void executeClazz(Clazz c) …Run Code Online (Sandbox Code Playgroud)