我记得一位教授曾经说过,解释后的代码比编译的代码慢了10倍.解释和字节码之间的速度差异是多少?(假设字节码不是JIT编译的)
我问,因为有些人一直在围绕将vim脚本编译成字节码的想法,我只是想知道会得到什么样的性能提升.
我在一个运行Java应用程序的平台上工作.这些应用程序经常被混淆,大多数都使用ProGuard,这使得我们平台的调试问题非常困难.
目前我正在使用JD(http://java.decompiler.free.fr/)对这些应用进行反编译.JD做得不错,但有时候生成的代码太难理解了.
这似乎主要是因为混淆工具利用较少约束的JVM字节码规范来生成有效的字节码,而不会映射回有效的Java代码(例如:积极的重载).
所以,我的问题是:是否有专门用于处理混淆字节码的反编译器?
我正在使用asm库来执行一些Java字节码修改 - 专门用于修改我的类以实现新的接口和相关方法.我目前的方法是通过javaagent使用核心asm API.我想保留这种动态方法,而不是静态修改.class文件.
在更高的层次上,我的问题是,如果我选择修改从B扩展的A类,我还需要修改B.(鉴于我对如何在JVM中加载类的理解,我相信B类将永远是在A级之前交给变压器.(如果我错了,请纠正我.)鉴于这个假设,我认为我需要返回并重新转换 B.我的方法在这段代码中被捕获:
public byte[] transform(ClassLoader l, String name, Class<?> clazz, ProtectionDomain d, byte[] b) {
throws IllegalClassFormatException {
// **1**
System.out.println("--->>> " + name);
if (interestingClass(name)) {
try {
ClassReader cr = new ClassReader(b);
ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
PyClassVisitorAdapter pv = new PyClassVisitorAdapter(cw, name);
cr.accept(pv, 0);
// **2** Retrieve the superclass and try to transform that
if (! "Ljava/lang/Object;".equals(pv.getSuperName())) {
String cName = classJvmToCanonical(pv.getSuperName());
Class[] classes = inst.getAllLoadedClasses();
for (Class c …Run Code Online (Sandbox Code Playgroud) Python 2和3,字节码(pyo&pyc)向后兼容吗?
我可以用python 3执行python 2 pyo&pyc文件吗?
上周五我参加了面试,不得不回答以下问题:为什么这段代码会引发异常(UnboundLocalError: local variable 'var' referenced before assignment在包含的行上var += 1)?
def outer():
var = 1
def inner():
var += 1
return var
return inner
Run Code Online (Sandbox Code Playgroud)
我无法给出正确答案; 这个事实让我心烦意乱,当我回到家时,我很难找到合适的答案.好吧,我已经找到了答案,但现在有别的东西,让我困惑.
我必须事先说,我的问题更多的是关于设计语言时做出的决定,而不是关于它是如何工作的.
所以,请考虑这段代码.内部函数是一个python闭包,var并不是本地的outer- 它存储在一个单元格中(然后从单元格中检索):
def outer():
var = 1
def inner():
return var
return inner
Run Code Online (Sandbox Code Playgroud)
反汇编看起来像这样:
0 LOAD_CONST 1 (1)
3 STORE_DEREF 0 (var) # not STORE_FAST
6 LOAD_CLOSURE 0 (var)
9 BUILD_TUPLE 1
12 LOAD_CONST 2 (<code object inner at 0x10796c810)
15 LOAD_CONST 3 …Run Code Online (Sandbox Code Playgroud) JVM参数noverify和Xverify之间有什么区别:none?
查看类文件时,org.apache.log4j.Logger它定义了一个Class带有name 的类型的合成字段class$org$apache$log4j$Logger.
从查看字节代码可以清楚地看出,该字段表示从常量池尚未引用类型的时间开始的自引用类.但是什么我也觉得奇怪的是,这一领域是的修改0x41008,其表示private,synthetic场(即我能听懂),而且还增加了一个修正0x40000,我不能找不到任何相关文档.
第19位的这个修饰符来自何处,它表达了什么?(Log4j是为Java 1编译的).
假设我有2个相同类的实例,但它们的行为不同(遵循不同的代码路径)基于构造时设置的最终布尔字段.像这样的东西:
public class Foo {
private final boolean flag;
public Foo(boolean flagValue) {
this.flag = flagValue;
}
public void f() {
if (flag) {
doSomething();
} else {
doSomethingElse();
}
}
}
Run Code Online (Sandbox Code Playgroud)
理论上,2个Foo具有不同值的实例flag可以由2个不同的程序集支持,从而消除了if的成本(对于人为的例子,这是我能想到的最简单的例子).
所以我的问题是 - 任何JVM实际上都这样做吗?或者是一个总是由单个程序集支持的单个类?
无论如何,是否可以从.pyt文件中获取源代码?当我尝试打开所有时,我得到的是一堆符号。我有一个.exe文件,然后将文件转换为.pyc,但是主要的源代码似乎在.pyt中,尽管这是我假设的文件名是“ FILE”,但是当您通读时可以看到它的文件名是源代码中的.pyt。
我尝试使用在线工具进行解码,但没有运气。
我得到的例子:
c @ sG d d l Z d d l Z d d l Z d d l Z d d l m Z d d l m Z d d l m Z d d l Z d d l
m Z d d l m
Z
d d l m Z d d l Z d d l Z d d l Z d d l m Z d d l m Z d …Run Code Online (Sandbox Code Playgroud) bytecode ×10
java ×6
python ×3
jvm ×2
closures ×1
decode ×1
decompiler ×1
decompiling ×1
interpreter ×1
jvm-hotspot ×1
optimization ×1
performance ×1
proguard ×1
pyc ×1
vim ×1