我对c/C++(不包含像C++中的模板参数)的(部分)编译时评估充满信心。让我们考虑下面的情况下(从[1]取):使用LLVM-gcc或gcc进行部分评估/专业化
double mypower(double x, int n) {
int i;
double ret = x;
for (i = 1; i < n; i++) {
ret *= x;
}
return ret;
}
然后调用此函数中的某处代码:
mypower(x,3); // y varies all the time,
然后,编译器可以优化该(例如循环展开)。我使用的一些经常使用的函数可以从该优化中受益(通过手动创建专用函数进行测试)。演示文稿[1]描述了一个过程,在该过程中函数被搜索并被函数的专用版本取代。这似乎工作。但它似乎并不普遍,代码需要写入应该替换的功能。
该演示文稿似乎是从2008年,我找不到比这个来源更多的信息。那么从那以后有什么改进?我更喜欢某种自动操作,对于可能由属性语法控制的所有功能(例如__attribute__(peval)
...),自动操作都是这样。进一步,我希望为面向对象的代码工作,为不同的对象创建专用类([2]似乎表明这是不可能的)。
另外,我想这个专业化不仅适用于在代码中找到的常量。我想编译成LLVM IR(字节码)的程序可以做到以下几点:
期间初始化阶段期间,在解释的初始化阶段运行PROGRAMM,该程序可以从文件中读取一些配置。初始化后解释器停止。
从那时起,一些变量(包括成员变量)被修复。提取这些变量(例如,在编译过程中用属性标记)。
创建专门的函数和类。将这些克隆到字节码中。
运行JIT以创建本机机器码。
这是我要求的很多,只有很少的计算密集型程序会从这样的优化中受益。但有些人必须在这方面努力。我可能只是不知道正确的搜索条件来提供谷歌。
注意:请不要使用非类型参数或手动专业化建议模板类,我已经这样做了。我只是喜欢编译器为我做的工作。
链接:
[1] Presentation how to partial evaluate in LLVM
[2] Forum message about partial evaluation
有点相关:http://stackoverflow.com/questions/2940367/what-is-more-efficient-using-pow-to-square-or-just-multiply-it-with-itself/2940800#2940800 – 2011-03-03 20:59:28