我指的是这里实际的java编译器实现:
我想堆栈是作为 C 结构实现的,但我的意思是:
java如何用这种结构计算?例如,如果一个局部变量的类型为字符串或指针,而另一个局部变量是double或int,并且java需要对这些变量进行操作,比如添加两者,是否首先将两者都转换为相同的类型然后添加,并返回值?
它或多或少会像这样:
struct var {
dataType type;
union{
char c;
int i;
double d;
void *p;
} value;
}
其中dataType是一些数据类型的枚举。
例如:假设变量A是double,变量B是int,C又是double。
如何为C = A + B生成字节码?以及虚拟机如何使用这些不同的数据类型进行操作?
答案 0 :(得分:1)
浮点(双精度)和整数是完全不同的数据类型,所有现代处理器都有特殊的操作来处理这些数据类型。 Java字节码还有一个用于添加浮点(dadd)的加法操作数和一个用于添加整数的加法操作数(iadd)。
现在回答你的问题:
double A = 1;
int B = 1;
double C = B + A;
由于结果C是double,Java编译器只会将B转换为double。字节码看起来像这样:
dload_1 // load double A
iload_3 // load int B
i2d // convert int to double
dadd // add doubles
dstore 4 // store result to C
答案 1 :(得分:1)
Java并不像C一样自由地强制类型,因此永远不会“以这样的方式转换字符串和int”。
Java类型系统通常通过字符串比较来管理(但是,在一个概念级别,这些项目通常会被优化掉,而这个级别是一个粗略的简化)。
所以方法有一个签名,它在'.class'对象中表示为字符串。
public static void main(String[] args) {
...
}
会有签名
main([Ljava.lang.String)V
意思是一个名称'main',它接受一个对象'L'的数组'['',它可以强制转换为String'java.lang.String'并且不返回任何内容(void)'V'。
因此,要查看是否可以在运行时将一组参数传递给此对象,请检查对象的类型以查看它是否“可赋予”String数组。可分配是一种奇特的说法,将类型作为超类共享,或者将类型作为接口,或者其中一个超类具有类型作为接口。
由于这种类型的检查,JVM实际上不使用C样式类型检查JVM中的元素;但是,它确实对实现此环境的元素执行C样式类型检查(如果这对您有意义的话)。
如果您非常好奇,可以阅读virtual machine specification,甚至download the JVM source code。您会发现Java(由于多态性)在许多实例中不能依赖静态类型检查,因此C编译器类型验证无论如何都不会起作用。