Java:将代码拆分为其原子表示形式

Java:将代码拆分为其原子表示形式,java,atomicity,Java,Atomicity,在Java中,只有很少的东西被认为是原子的()。例如,i++包含3个不同的原子操作:将i加载到寄存器中,向该寄存器添加1,将寄存器的新值写回i。差不多吧 我的问题:是否有可能将Java代码“解析”为它的原子表示序列?所以,当输入为“i++”时,我不希望将i++作为输出,我希望“将i加载到寄存器”、“将1添加到该寄存器”、“将i从寄存器写回”。可能吗 谷歌搜索在这个问题上没有多大帮助。在Java中,您没有注册或汇编代码访问权限。实现上述功能的唯一方法是使用java.util.conrrent.At

在Java中,只有很少的东西被认为是原子的()。例如,i++包含3个不同的原子操作:将i加载到寄存器中,向该寄存器添加1,将寄存器的新值写回i。差不多吧

我的问题:是否有可能将Java代码“解析”为它的原子表示序列?所以,当输入为“i++”时,我不希望将i++作为输出,我希望“将i加载到寄存器”、“将1添加到该寄存器”、“将i从寄存器写回”。可能吗


谷歌搜索在这个问题上没有多大帮助。

在Java中,您没有注册或汇编代码访问权限。实现上述功能的唯一方法是使用java.util.conrrent.Atomic包中提供的原子类。但是,除非您是在多线程背景下执行此操作,否则这将比简单的i++成本更高。

是和否。简短回答:这将非常困难

代码在到达硬件之前将经过几个步骤,在那里您可以“解析”原子表示

它将首先被编译成字节码。这已经接近机器代码,但还不是您想要的。您可以通过在可以解析字节码的编辑器中打开类文件来读取它(EclipseIDE可以这样做)。 当您运行该程序时,Java虚拟机将执行您的字节码。根据具体情况,它可以将字节码作为脚本引擎执行,将其编译为机器码或更改字节码,然后执行以获得更好的性能。Java虚拟机的功能取决于系统、系统上的当前负载和字节码。因此,实际上不可能预测它将生成的实际机器代码


对于特定的代码运行,可以使用程序集调试器(反汇编程序),如IDA。它将允许您以汇编代码的形式查看在系统上执行的内容。您很可能会看到许多代码是Java虚拟机的一部分,而不是程序的一部分。这将使事情变得更加困难。

你可以反汇编字节码。@Thorbjørn Ravn Andersen:现在我想起来了。字节码不是实际源代码的1对1表示吗?实际上字节码应该是我需要的吗?@Thorbjørnravandersen一条字节码指令可能由多条汇编指令组成。然后你可以要求hotspot显示生成的机器码指令