我正在尝试为学术研究实现Java的一个子集.好吧,我处于最后阶段(代码生成),我编写了一个相当简单的程序来查看如何处理方法参数:
class Main {
public static void main(String[] args) {
System.out.println(args.length);
}
}
Run Code Online (Sandbox Code Playgroud)
然后我构建了它,并通过我在以下网址找到的在线反汇编程序运行'Main.class':http: //www.cs.cornell.edu/People/egs/kimera/disassembler.html
我得到了'main'方法的以下实现:(反汇编输出在Jasmin中)
.method public static main([Ljava/lang/String;)V
.limit locals 1
.limit stack 2
getstatic java/lang/System/out Ljava/io/PrintStream;
aload_0
arraylength
invokevirtual java/io/PrintStream.println(I)V
return
.end method
Run Code Online (Sandbox Code Playgroud)
我的问题是:
1.aload_0应该将'this'推送到堆栈(这就是JVM规范似乎说的)
2.arraylength应该返回引用位于堆栈顶部的数组的长度
所以根据我的说法,1和2的组合甚至不应该起作用.
它是如何/为什么有效?或者是反汇编工具,实际的字节码是别的吗?
谁能告诉我在哪里可以找到Lua的字节码规范?我一直在寻找15分钟,但我找不到任何东西.
我多次听说Java实现了JIT(即时)编译,它的跨平台可移植的字节码得到了JVM的"解释".但是,我真的不知道字节码是什么,以及JVM在Java语言架构中的实际意义; 我想更多地了解他们.
我是python的完全新手,因此是一个愚蠢的问题.
据我所知,在第一次执行*.py程序时,字节代码被创建到*.pyc并一直使用,直到*.py文件发生变化.
在项目中可以找到*.pyc字节码的位置?
我会想bin,但没有什么
今天早些时候,当我编写一个方法时,我发现我不确定为什么我正在实现的成语编译.如果其他一切都被抽象掉了,它看起来像这样:
private int Example()
{
while (true)
{
if (some condition)
{
return 1;
}
}
}
Run Code Online (Sandbox Code Playgroud)
你有一个显式无限循环,循环内部的一些条件导致循环以return语句结束.让我们暂时忽略为什么我这样做,而不是检查while子句中的终止条件,因为答案是错综复杂且无关紧要的 - 我想知道的是为什么编译器不会将此标记为"Not"所有路径都返回一个值." 错误,严格地说并非所有路径都返回值.永远不会输入while循环(当然,从未发生过)的情况不会返回任何内容.
现在,我可以想象它发生的原因有两个:这是由于其他原因而发生的优化的副作用,或者这种情况显然由编译器处理以允许这个习惯用法.我的直觉是它可能是第一种情况.例如,这根本不会让我感到惊讶:
private int Example2()
{
if (true) return 1;
}
Run Code Online (Sandbox Code Playgroud)
因为编译器在if中看到一个常量true,并优化条件.我不明白为什么这会"修复"第一个例子.
哦,甚至更奇怪的是,如果摆脱循环的一些优化正在发挥作用,这将编译:
private int Example3()
{
while (true)
{
if (false)
{
return 1;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我认为整个内部循环将被优化掉,摆脱所有有效的回报.在字节码/编译器级别实际上是什么让这一切都有意义?
我试图通过使用常规try-catch-finally语句重新创建它来了解新的try-with-resources语句是如何工作的.给定以下使用Java 7 try-with-resources的测试类:
import java.io.IOException;
import java.util.zip.GZIPOutputStream;
public class TryWithResources {
public static void main(String[] args) {
try (GZIPOutputStream gzip = new GZIPOutputStream(System.out)) {
gzip.write("TEST".getBytes("UTF-8"));
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
你会如何重写这个类来使用try-catch-finally语句,这些语句产生与try-with-resources语句产生完全相同的字节码?此外,使用两个资源时的问题相同,如下例所示:
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;
public class TryWithResources2 {
public static void main(String[] args) {
try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
GZIPOutputStream gzip = new GZIPOutputStream(baos)) {
gzip.write("TEST".getBytes("UTF-8"));
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud) 我在编译开关时阅读了JVM规范,并对如何编译String上的switch语句感兴趣.这是我检查的测试方法(JDK1.7.0_40):
static int test(String i) {
switch (i) {
case "a": return -100;
case "45b": return 1;
case "c": return 2;
default: return -1;
}
}
Run Code Online (Sandbox Code Playgroud)
我希望这个方法能够在string的hashCode上编译成简单的lookupswitch,但突然之间
static int test(java.lang.String);
Code:
0: aload_0
1: astore_1
2: iconst_m1
3: istore_2
4: aload_1
5: invokevirtual #6 // Method java/lang/String.hashCode:()I
8: lookupswitch { // 3
97: 44
99: 72
51713: 58
default: 83
}
44: aload_1
45: ldc #7 // String a
47: invokevirtual #8 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
50: ifeq 83 …Run Code Online (Sandbox Code Playgroud) 我已经看到几个资源描述了什么.pyc文件以及它们何时被创建.但现在我想知道为什么在.py导入文件时创建它们?
另外,为什么不.pyc为执行导入的主Python文件创建文件?
我猜这与性能优化和学习有关,这鼓励我打破我的文件,因为内置的编译似乎很好用.但是我不确定是不是这种情况,而且我也很好奇是否有人有关于运行带和不带.pyc文件的程序之间差异的统计数据,如果它确实是速度的话.
我自己运行它们但是我没有一个好的,大的Python代码库来测试它.:(
我的编译器类正在创建一个我们打算编译为Java Bytecode的语言.我们已经取得了很多进展,并且正在接近代码生成的时间.
我们在查找有关如何从编译器创建.class文件的信息时遇到问题.你有什么资源可以给我们一些帮助吗?我们已经有很多关于指令集的文档,但是需要有关如何直接填写类文件/ hex的写入的信息.
我们不需要有关反编译.class文件的信息或建议.
即使是从头开始编写.class文件的简单示例也是非常好的.
JVM规范不是我们追求的.我们真正需要的是一个例子或演练.
我用Javassist创建了一个没有实际方法的构造函数
CtConstructor c = CtNewConstructor.make ( argTypes, null, newClass );
Run Code Online (Sandbox Code Playgroud)
当我试图推出这个类的签名时
c.getSignature();
Run Code Online (Sandbox Code Playgroud)
我明白了
public Echo ()V
Run Code Online (Sandbox Code Playgroud)
我很困惑"V"是什么意思?我期待公共Echo(); 或类似的东西......