将脚本预编译到C ++应用程序

时间:2015-05-11 13:32:08

标签: c++ scripting compilation

我需要为我的用户提供将数学计算写入程序的能力。我计划有一个带有几个按钮的简单文本界面,包括验证脚本语法,保存等的按钮。

这里有趣的地方。用户编写的这些功能需要在通信应用程序中以兆兆字节的速度执行。所以我需要编译语言的速度,但需要使用脚本。完全解释的语言不会削减它。

我的想法是在C ++应用程序初始化时将保存的用户模块预编译为对象。然后,我可以在调用时使用这些对象来执行代码。以下是我的工作流程:

1)脚本的测试(初始编写):在编辑器中编写代码,保存,编译成对象(测试语法),使用测试I / O运行,编辑代码

2)代码的使用(应用程序的正常运行):从文件加载脚本,将脚本编译为对象,运行目标代码,运行目标代码,运行目标代码等。

我已经调查了几个现成的口译员,但找不到我想要的东西。我考虑过JAVA,因为它非常快,但是我需要加载JAVA虚拟机,这意味着在C和虚拟机之间传递对象......接口是这里的瓶颈。我真的需要创建一个运行C ++代码的本机C ++对象。我还需要能够以受控方式有效地在多个处理器上运行代码。

我不是在寻找关于如何解决这个问题的全部解释,因为我可以做自己的研究。我现在已经在这里待了几天,但是,我真的需要一个地方开始寻找。

作为最后的手段,我将创建自己的脚本语言以满足需求,但这对所有优秀的口译员来说都是浪费。我还考虑过使用现有的开源编译器并将其切换为我需要的功能...只是不将编译结果保存到磁盘......我不知道。如果可能的话,我更愿意使用主线语言......但这不是必需的。

任何帮助将不胜感激。我知道这不是你在这里的磨坊想法,但有人必须先做过。

谢谢!

P.S。 在我写这篇文章时我想到的一个想法是:使用真正的C编译器创建目标代码,将其作为dll库保存到磁盘,然后在“我的”代码中重新加载并运行它?你能用MS Visual Studio做到吗?我需要查看编译器的许可...如何在主应用程序继续运行时动态重新加载库...嗯,我可以将用户创建的“函数”分组到库组中。好吧,这个特定的大脑转储就够了......

2 个答案:

答案 0 :(得分:0)

一个可能的解决方案是使用gcc(MingW,因为你在Windows上)并使用用户定义的代码构建DLL。 DLL应该只导出一个函数。您可以使用win32 API来处理DLL(LoadLibrary / GetProcAddress等)。在此作业结束时,您有一个C样式函数指针。现在的问题是争论。如果您的计算只有一个参数,则可以转换为double (*funct)(double),但如果您有许多参数,则需要匹配它们。

答案 1 :(得分:0)

我想我已经找到了一种使用标准C的方法。

1)需要使用标准C,因为当它被编译成dll时,生成的接口与多个编译器交叉兼容。我打算用MS Visual Studio进行主要开发,并使用gcc(windows version)

在我的应用程序中编译对象

2)我将向用户公开某些变量(输入和输出)并在单位之间标准化它们。这允许使用相同的界面开发多个单元。

3)用户只能使用标准C语法和语法创建函数内部。然后我将用文本包装该函数以完全定义函数及其环境(记住我打算公开的那些变量吗?)我还可以使用名称参数在单个可执行单元(dll)下组合多个函数。

4)当用户希望测试它们的功能时,我从内存中转储dll,用gcc中的包装器编译它们的代码,然后将dll重新加载到内存中并运行它。我会让他们定义用于测试的输入和输出。

5)测试/创建步骤完成后,我创建了一个编译库,可以在运行时加载并通过指针处理。输入和输出将是标准化的,因此我总是知道我的I / O是什么。

6)标准化I / O的唯一问题是可能不会使用某些输入和输出。我需要看看我是否可以输入默认值。

所以,总结一下:

想想一个带有文本框和几个按钮的应用程序。您被告知您的输入名为A,B和C,并且您的输出是指定类型的X,Y和Z.然后使用标准C代码和指定库中的函数编写函数(我正在考虑数学等)。

所以现在你完成了......你会看到下面的几个框来定义你的输入。你填写它们并点击TEST按钮。这会将您的代码包装在函数上下文中,从内存中转储现有的dll(如果存在)并将代码与同一组中的任何其他函数一起编译(您可以定义的另一个参数,基本上只是用户的名称。)然后,它使用功能指针运行该功能,使用UI中定义的输入。输出将发送给用户,以便他们确定其功能是否有效。如果有任何编译错误,那么也会输出给用户。

现在是时候竞争真实了。当然我跟踪了哪些函数在哪里,所以我动态打开dll,并用函数指针将所有函数加载到内存中。我开始把数据推到一边,功能给了我需要的答案。跟踪I / O并确保以正确的顺序调用函数会有一些开销,但执行将是编译的机器代码速度......这是我的主要要求。

现在......我已经用两种不同的方式解释了我的想法。你能想到任何可以阻止它工作的东西,或者任何可以帮助我的建议/陷阱/经验教训吗?从接口类型到以这种方式动态加载dll的提示,以这种方式使用gcc编译器......等等都是最有帮助的。

谢谢!