No
Yes
我问的是没有真正知道(显然)所以随意重定向到JIT超链接.
我正在用Java编写一个带有REPL的玩具解释器.我想从语言生成字节码并运行它,而不是解释AST并运行它.
由于我的Java有点生疏,是否可以在JVM上动态运行生成的字节码?
我有一个混合Java/Scala的项目,它是使用Scala库的Java GUI代码.有没有办法编写Scala代码,以便在编译时发出Java枚举?到目前为止我尝试过的方法(密封的case类,扩展Enumeration)似乎生成了正常的类,这使得从Java中使用它们比直接枚举更加繁琐.
据我所知,java开发人员需要让他们的.java文件成为.class,而.class需要JVM转换为本机代码才能执行.为什么Java设计会这样?为什么不只是使用解释器作为脚本语言来解释.java文件?或者为什么不将它转换为像C这样的可执行文件?为什么需要转换为字节码?java语言背后的设计理念是什么?
我在哪里可以找到官方和非官方Visual Basic 6规范的列表,这些规范可以让我完全解释VB6 EXE文件的内容并进行分析,或者单独解释它们而不是使用MSVBVM60.DLL?
类似于虚拟机及其语言的规范.
诸如操作码,指令,助记符,是否使用一个或多个堆栈,堆栈指针,寄存器等等.
鉴于Java应用程序是在考虑性能的情况下编写的(即在源代码中故意不将方法声明为'strictfp'),是否可以允许用户以strictfp模式运行整个应用程序?
看起来粗略的方法是使用使用javassist编写的自定义类加载器简单地将"strictfp"属性添加到所有类的所有方法.这类似于:
http://www.verious.com/qa/no-strictfp-in-scala-workarounds/
但是,类加载器需要将strictpf属性添加到应用程序中的所有类方法,包括私有方法.(该应用程序太大而且非常复杂,无法显式列出可能需要strictfp属性的所有可能方法.)
javassist中的反射API似乎不支持列出私有方法:
http://www.csg.ci.iu-tokyo.ac.jp/~chiba/javassist/html/javassist/CtClass.html#getMethods()
我想在javassist中做什么(或者通过自定义类加载器方法)?
我正在尝试生成字节码,它将创建没有代码初始化逻辑的对象实例.其实我想重现generateSerializationConstructor行为.
{
mv = cw.visitMethod(ACC_PUBLIC, "newObjectInstance", "()Ljava/lang/Object;", null, null);
mv.visitCode();
mv.visitTypeInsn(NEW, classNameInternal);
mv.visitInsn(DUP);
classNameInternal = "java/lang/Object";
mv.visitMethodInsn(INVOKESPECIAL, classNameInternal, "<init>", "()V");
mv.visitInsn(ARETURN);
mv.visitMaxs(0, 0);
mv.visitEnd();
}
Run Code Online (Sandbox Code Playgroud)
不幸的是我得到了这样的错误:
java.lang.VerifyError :(类:com/esotericsoftware/reflectasm/benchmark/ConstructorAccessBenchmark $ SomeClass_ ClassAccess _,方法:newObjectInstance签名:()Ljava/lang/Object;)调用错误的初始化方法
虽然多态性的主要原则是将"什么与谁"脱钩types,但令我困惑的是方法调用机制如何找出并在多态中调用正确的方法体.
因为在java中,所有方法绑定都是late-binding除非方法是static,final或者private,并且后期绑定由JVM完成,JVM method table为每个类预先计算,然后在正常方法调用的运行时期间查找表.
但同样的事情也发生在多态性中.例如
假设我有一个Cycle带有ride()方法的Generic类
class Cycle {
public void ride(){
System.out.println("I'm Riding generic Cycle()");
}
}
Run Code Online (Sandbox Code Playgroud)
我有三个Specialized Class Bicycle Tricycle,Unicycle它扩展了Generic类Cycle并覆盖了它的ride()方法.
class Bicycle extends Cycle {
public void ride() {
System.out.println("I'm riding Bicycle");
}
}
class Tricycle extends Cycle{
public void ride() {
System.out.println("I'm riding Tricycle ");
}
}
class Unicycle extends Cycle {
public void ride() …Run Code Online (Sandbox Code Playgroud) 为了更好的调试,我经常希望:
Exception
at com.example.blah.Something.method()
at com.example.blah.Xyz.otherMethod()
at com.example.hello.World.foo()
at com.example.debug.version_3_8_0.debug_info_something.Hah.method() // synthetic method
at com.example.x.A.wrappingMethod()
Run Code Online (Sandbox Code Playgroud)
如上所示的调试堆栈帧将动态生成,就像a一样java.lang.reflect.Proxy,除了我想完全控制最终在代理上的完整限定方法名称.
在通话网站上,我会做一些愚蠢而简单的事情:
public void wrappingMethod() {
run("com.example.debug.version_3_8_0.debug_info_something.Hah.method()", () -> {
World.foo();
});
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,这wrappingMethod()是一个真正的方法,最终在堆栈跟踪上,Hah.method()是一个动态生成的方法,而又World.foo()是一个真正的方法.
是的,我知道这会污染已经很深的堆栈痕迹.别担心.我有我的理由.
是否有(简单)方法来执行此操作或与上述类似的方法?
接下来是四个具有相同输出的函数,但是要么用列表理解,要么用紧密循环编写,并且对vs内联条件进行函数调用。
有趣的是,a并且b在反汇编时具有相同的字节码,但是b比快得多a。
此外,d使用没有函数调用的紧密循环的,比a使用带有函数调用的列表理解的函数要快。
为什么函数a和b具有相同的字节码,为什么b的性能要比给定的相同字节码好得多?
import dis
def my_filter(n):
return n < 5
def a():
# list comprehension with function call
return [i for i in range(10) if my_filter(i)]
def b():
# list comprehension without function call
return [i for i in range(10) if i < 5]
def c():
# tight loop with function call
values = []
for i in range(10):
if my_filter(i):
values.append(i)
return values
def d(): …Run Code Online (Sandbox Code Playgroud) bytecode ×10
java ×8
jvm ×3
enums ×1
interop ×1
interpreter ×1
javassist ×1
jit ×1
polymorphism ×1
private ×1
python ×1
python-3.6 ×1
python-3.x ×1
reflection ×1
scala ×1
strictfp ×1
vb6 ×1