我很想知道如何实施inline expansion。
我正在编写自己的编译器,仅仅是为了娱乐和教育。
我通过示例学到了很多东西,所以如果有人可以为我提供一个内联算法,这对我有很大帮助。
我更喜欢C ++,但语言并不重要。
我正在尝试编写内联的目标语言是JavaScript。
编辑: 只是为了澄清,我正在寻找改善ShrinkSafe的方法 GWT内联javascript函数,因此它是可能的。 GWT在代码运行之前进行内联。
答案 0 :(得分:2)
常见的实现是在优化阶段,作为重写规则。您可以用被调用的指令替换实际的函数调用指令(当然,减去return语句)。
接下来,确保窥孔优化器可以消除调用指令之前的堆栈设置和现在内联的被调用者的序言。同样,您应该确保窥孔优化器可以优化被调用者结尾和调用者处理返回值。
这样做的最大好处是它使指令序列在内存中连续,并且窥孔优化器通常会为您节省大量的堆栈推送/弹出。
答案 1 :(得分:1)
在将代码解析为树之后完成内嵌。
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创建树的副本所需的函数。然后通过树解析a将函数调用中使用的参数的所有引用替换为变量(在本例中为循环)。一旦完成。用您刚刚创建的新树替换上面树中的“Call”节点。