虽然许多字节码很简单,但上面的上半行中的字节很复杂且具体到Java。字节码的长度是一到五字节,因此它们的名字Java助记符使用前缀是32位是整数,A为参考地址,S为16位整数(短),和乙8位字节。我们使用是对于一个16位常量的8位常数和II6。RISC-V使用操作数的寄存器,但JVM使用堆栈。编译器知道每个方法的操作数堆栈的最大最小值,并为其分配简单的空间。
在当前帧中。这里是符号意义栏,下一个位置网络操作系统是去除操作。
由JVM创建的类的常量池,以及框架是指局部方法框架的变量。从里面丢失的Java字节码是一些算术和逻辑运算符,还有一些棘手的堆栈管理,与0和分支相比,支持分支表,类型转换,是更多复杂的Java特定指令的变体,加上浮点数据、64位整数(long)和16位字符的操作。
Java编译
由于Java源自C,Java具有与C相同的内置类型,所以赋值语句示例在Java中与C中相同。
Java版本的编译,虽然他们的循环是不同的。C的设计者留给程序员确保他们的代码不超过数组界限。Java的设计者想要捕捉数组绑定的bug,因此需要编译器检查这些违规行为。为了检查边界,编译器需要知道它们是什么。Java在每个数组中包含一个额外的双字,它包含上界。下界定义为0。
编译——Java中的循环示例
修改RISC-V代码虽然在循环内已经包含Java所需的数组边界检查。假设数组的长度刚好位于数组的第一个元素之前。
让我们假设Java数组在数据启动之前保留了数组的前两个单词。我们很快就会看到第一个双字的用法,但是第二个双字有数组长度。在进入循环之前,让我们把数组的长度加载到一个临时寄存器中: 数组保存长度在我们乘法之前,我们必须测试它是否小于或大于数组的最后一个元素。
由于数组从0开始,最后一个数组元素的索引小于数组的长度。因此,对上数组约束的测试是肯定的。因此,第二步是测试大于或等于等于分支的长度。
错误的RISC-V的下两行虽然循环与C版本没有变化,但我们需要解释在Java中保留的数组的前16个字节。我们通过将负载的地址字段从0变为16来实现这一点。RISC-V代码的其余部分虽然循环很好,但要用Java调用方法。
编译器根据对象的类型选择适当的方法。在少数情况下,它是明确的,并且可以在不超过C过程的开销的情况下调用该方法。
今天的介绍就到这里了,怎么样,是不是很长见识呢?喜欢就请留言吧。