动态编译算术运算序列

时间:2012-07-04 23:41:24

标签: c math compiler-construction

我在C中编写了一个使用公式生成分形的程序,但速度非常慢。基本上你传递渲染函数一堆无符号的字符数字,它们指示将值推送到堆栈或将它们弹出并执行算术运算并将结果推回到堆栈上的函数(类似反向抛光表示法)。问题是,程序正在读取这些函数数字,通过if ... else if ... else if ... else if ... elseif ...找到正确的操作执行,推送和弹出每个像素中每次迭代的一堆值。通常会有一个公式(比如Mandelbrot)硬编码到渲染函数中,但是这个程序是一个DLL,我写的是一个通用的分形渲染器。有没有什么方法可以编写一个小的编译器,在渲染开始之前读取公式并动态编译一个函数然后可以被渲染例程有效地重用?毕竟,Von Neumann架构的重点毕竟是计算机可以修改自己的代码。

提前致谢!

2 个答案:

答案 0 :(得分:3)

如果使用C ++是一个选项,我建议你尝试使用LLVM - 使用他们的IRBuilder将函数转换为LLVM IR,运行优化传递,然后使用LLVM JIT在运行时编译函数

http://llvm.org/docs/tutorial/LangImpl4.html

答案 1 :(得分:1)

C中没有自修改代码的概念。任何将控制传递给“数据”存储器中的数据块的尝试,例如通过将数据指针转换为函数指针,都是未定义的行为。这个模型可以让你用C语言编写非vov-neuman计算机。

这就是说,你可以通过用函数指针或switch语句替换if-then-else语句的序列来优化你的RPN代码以更快地运行。您还可以将目标函数编程到动态库中,在运行时读取它,并在渲染中使用它。