Java堆栈实现了什么类型的数据以及如何计算每种类型?

时间:2013-03-12 18:45:29

标签: java stack implementation

我指的是这里实际的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生成字节码?以及虚拟机如何使用这些不同的数据类型进行操作?

2 个答案:

答案 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编译器类型验证无论如何都不会起作用。