如果我使用Java 5代码将应用程序编译为字节码,那么生成的.class文件是否能够在Java 1.4下运行?
如果后者可以工作,我正在尝试在我的Java 1.4应用程序中使用Java 5框架,那么我应该注意什么?
例如,假设我想执行代码
value += 5
Run Code Online (Sandbox Code Playgroud)
在我自己的命名空间内(所以结果基本上是mydict['value'] += 5).有一个函数exec(),但我必须在那里传递一个字符串:
exec('value += 5', mydict)
Run Code Online (Sandbox Code Playgroud)
并且将语句作为字符串传递似乎很奇怪(例如,它没有这样的颜色).可以这样做:
def block():
value += 5
???(block, mydict)
Run Code Online (Sandbox Code Playgroud)
?最后一行的明显候选人是exec(block.__code__, mydict),但没有运气:它提出UnboundLocalError了value.我相信它基本上执行block(),而不是块内的代码,所以分配并不容易 - 这是正确的吗?
当然,另一种可能的解决方案是拆卸block.__code__......
仅供参考,因为这个帖子,我得到了这个问题.此外,这就是为什么有些人(我未定)要求新语法
using mydict:
value += 5
Run Code Online (Sandbox Code Playgroud)
注意这不会引发错误,但也不会改变mydict:
def block(value = 0):
value += 5
block(**mydict)
Run Code Online (Sandbox Code Playgroud) 从现在出现的许多jvm语言来看,有一种看起来特别吸引人
看一下
http://fantom.org/doc/docIntro/Tour.html
我只是想知道,当忽略动态类型功能时,生成的字节码是否与java等效...
ps:增加了关于性能的声明
好吧,我正在阅读ASM4字节码库中的PDF教程/文档/书籍(如果你愿意的话).我正在尝试这些例子并通过阅读,实际输入代码,执行,然后从输出中学习来学习.我遇到了这个部分:
public class ClassPrinter extends ClassVisitor {
public ClassPrinter() {
super(ASM4);
}
Run Code Online (Sandbox Code Playgroud)
链接在这里: http://download.forge.objectweb.org/asm/asm4-guide.pdf
我无法弄清楚在超级中传递什么.我的IDE也不是很有帮助.
每次我尝试理解已编译的Java文件的反汇编代码时,我都想知道为什么缺少某些指令编号.
一个小例子:
我反汇编($ javap -c HelloWorld)一个简单的HelloWorld类.这是输出:
Compiled from "HelloWorld.java"
public class HelloWorld {
public HelloWorld();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3 // String Hello World!
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}
Run Code Online (Sandbox Code Playgroud)
如您所见,构造函数中的指令3和4以及main方法中的一些指令都缺失.
有人知道为什么这些指令编号丢失了吗?是否有一些由于某种原因隐藏的字节码指令?
我见过这个帖子:如果与条件相比的速度
我自己上课检查速度
public class Question {
static long startTime;
static long elapsedTime;
static String mStatic;
private String mPublic;
public static void main(String[] args) {
Question q = new Question();
q.executeGlobal();
q.executeStatic();
q.executeLocal();
}
public void executeLocal() {
String mLocal;
startTime = System.nanoTime();
for (int i = 0; i < 1000000000; i++) {
mLocal = "";
}
elapsedTime = System.nanoTime() - startTime;
System.out.println("Type Local: " + elapsedTime + " ns");
}
public void executeGlobal() {
startTime = System.nanoTime();
for (int …Run Code Online (Sandbox Code Playgroud) 标识符由Java语言规范,Java SE 7 Edition(§3.8)很好地定义
Run Code Online (Sandbox Code Playgroud)An identifier is an unlimited-length sequence of Java letters and Java digits, the first of which must be a Java letter.
据我所知,由于方法名称是标识符,因此不可能在java中命名以数字开头的方法,并javac遵守此规则.
那么,为什么Java虚拟机似乎不遵守这个规则,允许我们在Bytecode中命名一个以数字开头的函数?
这个简单的代码片段实际上会打印f99()方法名称及其参数的值.
public class Test {
public static void main(String[] args) {
Test t = new Test();
System.out.println(t.f99(100));
}
public int f99(int i){
System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName());
return i;
}
}
Run Code Online (Sandbox Code Playgroud)
编译和执行:
$ javac Test.java
$ java Test
Run Code Online (Sandbox Code Playgroud)
输出:
f99
100
Run Code Online (Sandbox Code Playgroud)
可以在编译后反汇编代码,并f99通过99(在reJ之类的工具的帮助下 )重命名所有出现的代码.
$ java …Run Code Online (Sandbox Code Playgroud) 我在这里有点困惑,JVM是代表字节码(生成它)还是它只是将已编译的.class文件(字节码)加载到内存中?!或者JVM只是以独立于平台的方式运行字节码的规范?!非常感谢你.
使用给定的字节码,当遇到switch指令时,我想知道下一条指令的位置(不运行代码).为了做到这一点,我想我应该计算指令的总大小,包括跳转偏移或匹配偏移对.这可能吗?如果不是,怎么可能知道下一条指令在哪里?
此外,还有其他任何具有动态大小的字节码指令(它们的大小基于变量)吗?
tableswitch
<0-3 byte pad>
defaultbyte1
defaultbyte2
defaultbyte3
defaultbyte4
lowbyte1
lowbyte2
lowbyte3
lowbyte4
highbyte1
highbyte2
highbyte3
highbyte4
jump offsets...
Run Code Online (Sandbox Code Playgroud)
lookupswitch
<0-3 byte pad>
defaultbyte1
defaultbyte2
defaultbyte3
defaultbyte4
npairs1
npairs2
npairs3
npairs4
match-offset pairs...
Run Code Online (Sandbox Code Playgroud) RubyVM可以将Ruby代码编译为字节代码,然后直接执行它.例如,
COMPILE.rb
File.write(ARGV[1],RubyVM::InstructionSequence.compile_file(ARGV[0]).to_binary)
Run Code Online (Sandbox Code Playgroud)
EXECUTE.rb
RubyVM::InstructionSequence.load_from_binary(File.read(ARGV[0]).force_encoding(Encoding::ISO_8859_1)).eval
Run Code Online (Sandbox Code Playgroud)
TEST.BAT
ruby COMPILE.rb test.rb test.rbx
ruby EXECUTE.rb test.rbx
Run Code Online (Sandbox Code Playgroud)
test.rb本身的ruby代码实际上是执行的.这里有任何明显的缺点吗?一位朋友建议人们可能要小心,因为它可能不会在其他操作系统上运行.但是我希望它适用于所有操作系统,例如Java字节码,它可以在JVM执行的所有操作系统上运行.
编译Ruby到字节代码有什么明显的缺点(当然可读性除外)?
bytecode ×10
java ×8
jvm ×3
performance ×2
codeblocks ×1
disassembly ×1
fantom ×1
identifier ×1
java1.4 ×1
javac ×1
javap ×1
mnemonics ×1
python ×1
python-3.x ×1
ruby ×1