我正在开发一个呈现迭代分形系统的程序。我想添加一些人可以定义自己的迭代过程的功能,并编译该代码以便它能够高效运行。
我目前不知道该怎么做,并希望了解如何阅读以了解如何执行此操作。
主程序是用C ++编写的,我熟悉C ++。事实上,鉴于大多数场景,我知道如何将其转换为可实现目标的汇编代码,但我不知道如何采取额外步骤将其转换为机器代码。如果可能的话,我想动态编译代码,就像我相信很多游戏系统模拟器一样。
如果不清楚我在问什么,请告诉我,我可以澄清一下。
谢谢!
答案 0 :(得分:4)
动态编译的例程是否需要使用任何特定语言。如果对这个问题的回答是“是的,那一定是C ++”你可能运气不好。 C ++是在线重新编译的最糟糕的选择。
应用程序的动态部分(分形迭代器例程)是否是一个主要的CPU瓶颈?如果你能负担得起使用未编译的语言,你可能会给自己省去很多麻烦。 Lua和JavaScript都是经过大量优化的解释语言,其运行速度比本机编译代码慢几倍。
如果您确实需要将动态功能编译为机器代码,那么最好的选择可能是使用clang/llvm. clang是由Apple开发的C / Objective-C前端(和其他一些人) )使在线,动态重新编译表现良好。 llvm是后端clang用于从便携式字节码转换为本机机器码的后端。请注意,clang目前不支持C ++的大部分内容,因为这是一种难以理解的语言。
答案 1 :(得分:3)
某些CPU仿真器将机器代码视为字节代码,并且它们执行JIT编译,几乎就像Java一样。这非常有效,但这意味着开发人员需要为运行模拟器的每个CPU以及模拟的每个CPU编写一个版本的编译器。
这通常意味着它只适用于x86,并且对于想要使用不同内容的人来说很烦人。
他们也可以将它转换为LLVM或Java字节代码或.Net CIL,然后编译它,这也可以。
在你的情况下,我不确定那种事情是最好的方法。我想我会通过使用动态库来实现这一点。创建一个应该包含“插件”的目录,让用户自己编译。让您的程序扫描目录并加载每个DLL或.so它找到。
这样做意味着您花费更少的时间编写代码编译器,并花更多的时间来完成工作。
答案 2 :(得分:3)
如果您可以用C(而不是C ++)编写动态扩展,您可能会发现Tiny C Compiler是有用的。它可以在LGPL下使用,它兼容Windows和Linux,它是一个小型的可执行文件(或库),大约100kb,用于预处理器,编译器,链接器和汇编器,所有这些都非常快。当然,它的缺点是它无法与GCC可以获得的优化相提并论。另一个潜在的缺点是它只是X86的AFAIK。
如果 决定编写程序集,TCC可以处理 - the documentation表示它支持类似气体的语法,并且它支持X86操作码。
TCC也完全支持ANSI C,它几乎完全符合C99。
话虽这么说,您可以将TCC作为可执行文件包含在您的应用程序中,也可以使用libtcc(没有太多的libtcc在线文档,但它可以在源代码包中找到)。无论哪种方式,您都可以use tcc to generate dynamic or shared libraries或可执行文件。如果您使用了动态库路径,则只需在其中添加Render
(或其他)函数,并在其上dlopen
或LoadLibrary
,然后调用Render
最后运行用户设计的渲染。或者,您可以创建独立的可执行文件并popen
,并通过独立的stdin
和stdout
进行所有通信。
答案 3 :(得分:3)
由于您要生成要在屏幕上显示的像素,您是否考虑过使用HLSL和动态着色器编译?这将使您能够访问专为此类设计而设计的SIMD硬件,以及内置于DirectX中的动态编译器。
答案 4 :(得分:2)
LLVM应该可以做你想做的事。它允许您以面向对象的方式形成您想要编译的程序的描述,然后它可以在运行时将该程序描述编译为本机机器代码。
答案 5 :(得分:1)
Nanojit是你想要的一个很好的例子。它从中间语言生成机器代码。它是C ++,它是小型和跨平台的。我没有广泛使用它,但我喜欢玩游戏只是为了演示。
答案 6 :(得分:0)
将代码吐出到文件中并将其编译为动态加载的库,然后加载并调用它。
答案 7 :(得分:0)
您是否有理由不能使用基于GPU的解决方案?这似乎是一个人的尖叫。