动态代码编译(dynamic code compilation)

2019-08-07 11:37发布

我正在呈现迭代分形系统的程序。 我想补充哪里有人可以定义自己的迭代过程的功能,并且编译代码,以便它会有效地运行。

我目前不知道如何做到这一点,并想在读什么书来学习如何做到这一点的提示。

主程序是用C ++编写,我熟悉C ++。 在给定的大多数场景其实我知道如何将它转换为汇编代码,将实现的目标,但我不知道如何采取额外的步骤,将其转换成机器代码。 如果可能的话,我想动态编译像我如何相信很多游戏系统模拟器工作的代码。

如果不清楚我在问什么,告诉我,这样我就可以澄清。

谢谢!

Answer 1:

有些CPU仿真器把机器代码,如果它是一个字节的代码,他们做了JIT编译,仿佛它是Java的。 这是非常有效的,但它意味着开发者需要编写一个版本的编译器为他们的仿真器上和模拟每个CPU运行的每个CPU。

这通常意味着它仅适用于x86和恼人的是任何人想用不同的东西谁。

他们还可以把它翻译成LLVM或Java字节代码或.Net CIL,然后编译它,这也将工作。

在你的情况我不知道,诸如此类的事情是最好的一段路要走。 我认为我会用动态库做到这一点。 作出这样是为了遏制“插件”,并让用户自己编译的目录。 使你的程序扫描目录,并加载每个DLL或.so发现。

这样做,这样意味着你花更少的时间编写代码的编译器和更多的时间实际上得到的东西做。



Answer 2:

请问例程动态编译需要在任何特定的语言。 如果这个问题的答案是“是的,它必须是C ++”你可能是出于运气。 C ++是关于网上重新编译最坏的选择。

是您的应用程序(分形迭代程序)的一大瓶颈,CPU的动态部分? 如果你能负担得起使用未编译语言,你也许可以救自己非常多的麻烦。 Lua和JavaScript的都是高度优化的解释型语言,只有跑的比本地人,编译的代码慢了几十倍。

如果你真的需要动态功能被编译成机器代码,你最好的选择可能是将要使用铿锵/ LLVM。 铛是苹果(和其他一些)正在开发的C / Objective-C的前端进行网上,动态重新编译表现良好。 LLVM是后端铛用来从便携式字节码机代码转换。 注意,铛目前不支持多C ++的,因为这是这样一个很难用语言来得到正确的。



Answer 3:

如果你可以写在C(不是C ++)动态扩展,您可能会发现微小的C编译器要使用的。 它的问世在LGPL下,它是Windows和Linux兼容,它在〜100KB一个小的可执行文件(或库)为预处理器,编译器,链接器和汇编,所有这一切确实非常快。 这种方法的不利之处,当然,是它无法比拟的,你可以用GCC得到优化。 另一个潜在的缺点是,它仅适用于x86 AFAIK。

如果你没有决定编写汇编,TCC可以搞定- 该文件说,它支持气体的语法,而且它支持X86操作码。

TCC还完全支持ANSI C,它是用C99几乎完全兼容。

话虽这么说,你既可以包括TCC与您的应用程序的可执行文件或使用libtcc(有没有libtcc太多在线文档,但它的源代码包的可用)。 无论哪种方式,你可以使用TCC生成动态或共享库 ,或可执行文件。 如果你去的动态库的路线,你只想把一个Render它(或其他)功能,并dlopenLoadLibrary就可以了,并调用Render到最后运行的用户设计的渲染。 或者,你可以做一个独立的可执行文件和popen它,然后通过独立的所有通信stdinstdout



Answer 4:

既然你产生像素的屏幕上显示,你有没有考虑过使用HLSL动态着色器编译? 这会给你SIMD硬件设计正是这样的事情,以及内置到DirectX的动态编译器访问。



Answer 5:

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



Answer 6:

Nanojit是你想要的一个很好的例子。 它从中间的langauge生成机器代码。 这是C ++,和它的小和跨平台。 我没有用它很广泛,但我很喜欢玩弄周围只是为了演示。



Answer 7:

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



Answer 8:

是有原因,你不能使用基于GPU的解决方案? 这似乎是尖叫之一。



文章来源: dynamic code compilation