我很想知道如何实现内联扩展。
我编写自己的编译器只是为了好玩和教育。
我通过示例学到了很多东西,所以如果有人可以为我提供一个内联算法,那将对我有很大帮助。
我更喜欢 C++,但语言并不重要。
我试图为其编写内联的目标语言是 JavaScript。
编辑:澄清一下,我正在寻找改进ShrinkSafe的方法。
GWT 内联 javascript 函数,因此它是可能的。GWT 在代码运行之前进行内联。
我很想知道如何实现内联扩展。
我编写自己的编译器只是为了好玩和教育。
我通过示例学到了很多东西,所以如果有人可以为我提供一个内联算法,那将对我有很大帮助。
我更喜欢 C++,但语言并不重要。
我试图为其编写内联的目标语言是 JavaScript。
编辑:澄清一下,我正在寻找改进ShrinkSafe的方法。
GWT 内联 javascript 函数,因此它是可能的。GWT 在代码运行之前进行内联。
一个常见的实现是在优化阶段执行它,作为重写规则。您用被调用的指令替换实际的函数调用指令(当然减去 return 语句)。
接下来,确保窥视孔优化器可以消除调用指令之前的堆栈设置和现在内联的被调用者的序言。同样,您应该确保窥视孔优化器可以优化被调用者的结尾和调用者对返回值的处理。
这样做的最大好处是它使指令序列在内存中是连续的,并且窥孔优化器通常会为您节省一堆堆栈推送/弹出。
内联是在代码被解析成树之后完成的。
for(int loop=1;loop <= 10;++loop)
{
f(loop);
}
for-|
--- (Init Code)---Assign--|
| --- loop
| |
| --- 1
--- (Condition)--- <= |
| --- loop
| |
| --- 10
--- (Post) --- ++ |
| --- loop
|
--- (Body) Call |
--- (Function Name) f
|
--- (Parameter List)---Node1 -- loop
|
NULL
您还将拥有函数 f 的解析树。
要内联函数,您需要为函数 f 创建树的副本。然后解析树,将函数调用中使用的参数的所有引用替换为变量(在本例中为循环)。一旦完成。用您刚刚创建的新树替换上面树中的“调用”节点。