4

我正在开发一个渲染迭代分形系统的程序。我想添加一个功能,让人们可以定义他们自己的迭代过程,并编译该代码,以便它能够高效运行。

我目前不知道如何做到这一点,并想了解如何阅读以了解如何做到这一点的提示。

主程序是用 C++ 编写的,我对 C++ 很熟悉。事实上,考虑到大多数情况,我知道如何将其转换为可以实现目标的汇编代码,但我不知道如何采取额外的步骤将其转换为机器代码。如果可能的话,我想动态编译代码,就像我相信许多游戏系统模拟器的工作方式一样。

如果不清楚我在问什么,请告诉我,以便我澄清。

谢谢!

4

8 回答 8

4

要动态编译的例程是否需要使用任何特定语言。如果该问题的答案是“是的,它必须是 C++”,那么您可能就不走运了。C++ 是在线重新编译的最糟糕的选择。

应用程序的动态部分(分形迭代器例程)是否是主要的 CPU 瓶颈?如果您负担得起使用未经编译的语言,您可能会为自己省去很多麻烦。Lua 和 JavaScript 都是经过高度优化的解释性语言,它们的运行速度只比本机编译代码慢几倍。

如果您确实需要将动态功能编译为机器代码,那么您最好的选择可能是使用clang/llvm。 clang 是 Apple(和其他一些公司)正在开发的 C/Objective-C 前端,用于使在线动态重新编译性能良好。llvm 是 clang 用于从可移植字节码转换为本机机器码的后端。请注意,clang 目前不支持大部分 C++,因为这是一种很难正确处理的语言。

于 2009-09-18T00:13:45.633 回答
3

一些 CPU 仿真器将机器代码视为字节码,并且它们执行 JIT 编译,几乎就像它是 Java 一样。这是非常有效的,但这意味着开发人员需要为每个运行他们的模拟器的 CPU 和每个模拟的 CPU 编写一个编译器版本。

这通常意味着它只适用于 x86,并且对于任何想要使用不同东西的人来说都很烦人。

他们还可以将其转换为 LLVM 或 Java 字节码或 .Net CIL,然后对其进行编译,这也可以。

在你的情况下,我不确定这种事情是最好的方法。我认为我会通过使用动态库来做到这一点。创建一个应该包含“插件”的目录并让用户自己编译。让您的程序扫描目录并加载它找到的每个 DLL 或 .so。

这样做意味着您花费更少的时间编写代码编译器,而将更多的时间用于实际完成工作。

于 2009-09-18T00:06:50.357 回答
3

如果您可以用 C(而不是 C++)编写动态扩展,您可能会发现Tiny C 编译器很有用。它在 LGPL 下可用,与 Windows 和 Linux 兼容,它是一个小型可执行文件(或库),大小约为 100kb,用于预处理器、编译器、链接器和汇编器,所有这些都非常快。当然,这样做的缺点是它无法与 GCC 获得的优化相提并论。另一个潜在的缺点是它仅适用于 X86 AFAIK。

如果您确实决定编写程序集,TCC 可以处理——文档说它支持类似气体的语法,并且确实支持 X86 操作码。

TCC 还完全支持 ANSI C,并且几乎完全符合 C99。

话虽如此,您可以将 TCC 作为可执行文件包含在您的应用程序中,也可以使用 libtcc(网上没有太多关于 libtcc 的文档,但它在源代码包中提供)。无论哪种方式,您都可以使用 tcc 生成动态或共享库或可执行文件。如果你走动态库路线,你只需在其中放入一个Render(或其他)函数,然后调用它,dlopen最终运行用户设计的渲染。或者,您可以制作一个独立的可执行文件和它,并通过独立的和.LoadLibraryRenderpopenstdinstdout

于 2009-09-18T02:04:14.270 回答
3

由于您正在生成要在屏幕上显示的像素,您是否考虑过将 HLSL 与动态着色器编译一起使用?这将使您能够访问专为此类事情设计的 SIMD 硬件,以及直接内置于 DirectX 中的动态编译器。

于 2009-09-18T02:17:42.437 回答
2

LLVM应该能够做你想做的事情。它允许您以面向对象的方式形成您想要编译的程序的描述,然后它可以在运行时将该程序描述编译成本机机器代码。

于 2009-09-18T00:03:25.243 回答
1

Nanojit是您想要的一个很好的例子。它从中间语言生成机器代码。它是 C++,体积小且跨平台。我没有很广泛地使用它,但我喜欢只是为了演示而玩弄。

于 2009-09-18T02:08:12.500 回答
0

将代码吐出到一个文件中,编译为动态加载的库,然后加载并调用它。

于 2009-09-18T07:50:27.090 回答
0

您是否有理由不能使用基于 GPU 的解决方案?这似乎是在为一个人尖叫。

于 2009-09-18T08:06:09.523 回答