首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JVM / Java中变量的实现

JVM / Java中变量的实现
EN

Software Engineering用户
提问于 2023-01-14 20:22:38
回答 2查看 135关注 0票数 1

我知道,很多解释较高层次的语言喜欢抽象很多东西,因此不能直接与低级结构进行比较。

例如,在某些语言中,原语值被实现为对值对象的引用。最著名的是Python。

当我学习编程时,我被告知原语是具有特定预定义大小的简单值,直接存储在分配的内存地址中。我猜这就是在C/C++中发生的事情。

代码语言:javascript
复制
int a = 4; // put 4 directly at a memory location on the stack

阅读JVM的规范,它们似乎需要相同的行为。

https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.6.1

单个局部变量可以保存布尔值、字节值、char值、短值值、int值、浮点值、引用值或returnAddress类型的值。一对局部变量可以保存长或双类型的值。局部变量通过索引来解决。第一个局部变量的索引为零。整数被认为是局部变量数组的索引,当且仅当该整数比局部变量数组的大小小0到1。长类型或双类型类型的值占据两个连续的局部变量。这样的值只能使用较小的索引来处理。例如,存储在索引n处局部变量数组中的类型double的值实际上占用了索引n和n+1的局部变量;但是,无法从索引n+1处加载局部变量。它可以储存在。但是,这样做会使局部变量n的内容无效。

因此,这听起来非常具体,几乎没有实现另一种方式的空间(例如,作为对Java值对象的引用)。这是正确的,还是这还取决于针灸的实施?

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2023-01-15 10:45:36

你引用的那一章的第一句,第二章。Java虚拟机的结构说粗体斜体*重点雷:

此文档指定一台抽象机器。它没有描述Java虚拟机的任何具体实现。

下一段说:

要正确实现Java,只需能够读取class文件格式并正确执行其中指定的操作。不属于Java虚拟机规范一部分的实现细节将不必要地限制实现者的创造力。例如,运行时数据区域的内存布局、使用的垃圾收集算法以及Java虚拟机指令的任何内部优化(例如,将它们转换为机器代码)都由实现者自行决定。

过去,有两个项目在Ruby、鲁瓦拉瓦 [GitHub]中实现JVM。我可以100%肯定地说,这两个变量数组都没有将局部变量数组实现为原语值的连续内存区域,原因很简单,Ruby没有原语值,也不允许您访问内存。

一般来说,编程语言规范期望实现者遵循一条假设规则:只要结果看起来像--如果您逐字实现了规范的算法和数据结构,您就可以随心所欲地做任何事情。例如,ECMAScript语言规范包含许多用低级逐级伪代码编写的算法,这些算法可以直接转换成1:1的实现,但规范不需要甚至期望您这样做:

规范通常使用编号列表来指定算法中的步骤。这些算法用于精确地指定ECMAScript语言结构所需的语义。这些算法并不意味着要使用任何特定的实现技术。在实践中,可能有更有效的算法来实现给定的特性。

虽然乍一看,我没有在JVMS中找到类似的语句,但对于许多语言规范来说,这是一件常见的事情。在Java中,通过从Java兼容性工具包(JCK)传递测试套件来演示规范的遵从性,测试套件只测试外部可见的行为。

票数 6
EN

Software Engineering用户

发布于 2023-01-15 08:37:48

在Python这样的语言中,在如何实现诸如变量存储之类的东西方面有很大的自由度,因为没有人期望编译的Python代码可以使用不同Python实现的运行时环境来执行。这使得每个实现都有可能做出自己的选择。

对于JVM,情况完全不同。人们期望任何Java编译器或生成JVM字节码的编译器的输出都可以在任何JVM实现上执行。

为了做到这一点,JVM规范必须在许多方面相当严格,以确保编译器和JVM实现之间的互操作性。

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/443394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档