这是我用python中的dis模块测试过的-
>>> def f():
... a = 1
... b = 2
... c = 3
... a = b + c * a
... return a + c
...
>>> dis.dis(f)
2 0 LOAD_CONST 1 (1)
2 STORE_FAST 0 (a)
3 4 LOAD_CONST 2 (2)
6 STORE_FAST 1 (b)
4 8 LOAD_CONST 3 (3)
10 STORE_FAST 2 (c)
5 12 LOAD_FAST 1 (b)
14 LOAD_FAST 2 (c)
16 LOAD_FAST 0 (a)
18 BINARY_MULTIPLY
20 BINARY_ADD
22 STORE_FAST 0 (a)
6 24 LOAD_FAST 0 (a)
26 LOAD_FAST 2 (c)
28 BINARY_ADD
30 RETURN_VALUE
这些是基于堆栈的虚拟机的说明。如果我可以访问无限数量的寄存器,有什么方法可以将上述基于堆栈的指令转换为基于寄存器的指令。
我只知道执行此操作的一种工具,我们知道JVM是基于堆栈的,而Dalvik VM是基于寄存器的。当我们用Java编写代码时,类文件包含基于堆栈的指令,并且dx工具将基于堆栈的指令转换为基于寄存器的指令,以便它可以在Dalvik VM中运行。因此,很可能我错过了某个地方的算法。
在堆栈可以动态增长和收缩(这将在运行时决定)的边缘上也可能存在,在这种情况下,不可能将基于堆栈的指令转换为基于寄存器的指令。但是,只有一种工具可以做到。
有人可以指出我正确的方向吗?或知道任何可以帮助解决此问题的算法。