"字节码程序通常通过一次解析一个指令来执行.这种字节码解释器非常便携.一些系统,称为动态转换器,或"即时"(JIT)编译器,将字节码转换为机器语言在运行时必要时:这使得虚拟机不可移植."
关于这一段的问题是:在处理字节码之后,解析的指令和机器语言(或机器代码)之间有什么区别?
compiler-construction interpreter programming-languages bytecode
我目前正在研究一种工具,它允许我们在大型as3/Air项目(超过2000级)中查看功能是耗时的,以确定需要优化的瓶颈和功能.
实现此目的的一种方法是使用Flash Builder Profiler但它非常慢并且在1或2分钟后崩溃.另一种方法是手动编写具有最重要的功能耗时信息的文件.但这是一个手动过程,我无法涵盖所有项目的功能.
所以我正在寻找一种直接在编译的swf中注入as3字节码的方法.使用这样的工具,我将在每次函数调用后注入一个日志,因此我将能够涵盖所有项目的功能.
有些as3 libs存在这样的事情(AS3Commons ByteCode)但是对我的项目不起作用(我得到解析错误)并且as3很慢.
你可以在整个互联网上看到汇编代码和汇编编码器,但字节码几乎没有.这是为什么 ?在汇编中编程的需求和优点也应该适用于字节码编程.
虽然 switch 语句可以表示为一系列 if 语句,但似乎在将 Java switch 语句编译成字节码时,使用了不同的方法。
我正在尝试在Android中执行Java程序.使用链接如何使用命令在android中执行dex文件?作为参考.我的问题是,我可以从eclipse在模拟器上运行Java程序吗?当我尝试使用adb install HelloWorld.apk(在命令提示符下)时,它表示缺少AndroidManifest.xml.我有选择吗?请帮忙.
我读到了即时编译(JIT),据我所知,有两种方法 - Interpreter和JIT,它们都在运行时解释字节码.
为什么不准备将所有字节码解释为机器代码,然后才开始运行该过程而不再需要解释器?
我是编程的初学者,我只是想知道序列化过程和转换为字节代码(中间语言)的过程之间是否存在差异.
我在javacodegeeks.com上发现了这个:
当需要通过网络发送数据或存储在文件中时,通常会使用序列化.数据我指的是对象而不是文本.现在的问题是您的网络基础设施和您的硬盘是理解位和字节但不了解Java对象的硬件组件.序列化是将Java对象的值/状态转换为字节以通过网络发送或保存它.- > 另一方面,反序列化是将字节代码转换为相应的java对象.< -
根据我对这一段的理解,序列化可能是java将其程序转换为字节代码的过程,以便能够传输到不同的计算机环境并仍能正常运行.
我在想这个是正确的吗?
Java代码如下所示:
File f1 = File.createTempFile("example", ".txt");
File f2 = File.createTempFile("outExample", ".txt");
FileInputStream in = new FileInputStream(f1);
FileOutputStream out = new FileOutputStream(f2);
try {
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
}
finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
return f1.delete() && f2.delete();
Run Code Online (Sandbox Code Playgroud)
和字节码:
TRYCATCHBLOCK L0 L1 L1
L2
LINENUMBER 138 L2
LDC "example"
LDC ".txt"
INVOKESTATIC File.createTempFile (String, String) : File
ASTORE 1
L3
LINENUMBER 139 …Run Code Online (Sandbox Code Playgroud) 在撰写本文时的Byte Buddy教程中,所有内容都得到了解释,但是一个简单的after和before方法拦截器不存在,正如我在下面解释的那样,我错过了什么或者教程很复杂.(请参阅LoggerInterceptor示例给出方法但不是对象,ChangingLoggerInterceptor示例给出对象但不调用方法)
我想要实现的是在setter方法执行后调用对象的方法.如何编写拦截器并在Java 6中使用它?
public class DirtyClass{
private String _sField;
private boolean _bDirty;
public void setField(String sField) {
_sField = sField;
//setDirty(true); to be appended after proxying
}
public String getField() {
return _sField;
}
public void setDirty(boolean bDirty){
_bDirty = bDirty;
}
public boolean isDirty(){
return _bDirty;
}
}
DirtyClass d = new ByteBuddy().subclass(DirtyClass.class)...???
d.setField("dirty now");
System.out.println(d.isDirty()); //Expecting true
Run Code Online (Sandbox Code Playgroud) 给定一个由以下3行代码编译而成的代码对象:
code = compile('''a = 1 / 0 # bad stuff. avoid running this!
b = 'good stuff'
c = True''', '', 'exec')
Run Code Online (Sandbox Code Playgroud)
调用dis.dis(code)将分解为:
1 0 LOAD_CONST 0 (1)
2 LOAD_CONST 1 (0)
4 BINARY_TRUE_DIVIDE
6 STORE_NAME 0 (a)
2 8 LOAD_CONST 2 ('good stuff')
10 STORE_NAME 1 (b)
3 12 LOAD_CONST 3 (True)
14 STORE_NAME 2 (c)
16 LOAD_CONST 4 (None)
18 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)
如何仅提取并运行第二行的字节码b = 'good stuff'?
例如,如果我只想提取并运行c = True从字节索引开始的最后一行字节代码12,我可以对代码对象的co_code …
bytecode ×10
java ×6
interpreter ×2
android ×1
assembly ×1
byte-buddy ×1
flash ×1
json ×1
jvm ×1
performance ×1
python ×1
python-3.x ×1
xml ×1