c++程序遵循用户定义脚本的最佳方式

Best way for a c++ program to follow a user-defined script?

本文关键字:脚本 最佳 方式 定义 用户 程序 c++      更新时间:2023-10-16

我有一个模拟程序,它以特定的顺序多次重复一组函数,然后输出基于这些函数的一些计算结果。每个函数都会以某种方式对Simulator对象进行变异,并采用不同类型的可变数量的参数。例如:

 class Simulator
{
    Simulator();
    void A(int x, double y, string z);
    void B(int x, int y);
    void C(double x);
};

我希望用户能够指定调用这些函数的顺序以及参数,并且我需要能够将这些信息存储在某种脚本中,以便程序遵循。例如,一个脚本最终可能被转换为程序的以下操作:

Simulator mySim;
mySim.A(5, 6.0, "a string");
mySim.B(1, 1);
mySim.A(3, 4.0, "another string");
mySim.C(10.0);

有有效的方法吗?我最初的想法是有一个对象的链接列表,每个对象都存储函数的名称和参数。然后,程序将遍历列表,依次调用每个函数。然而,这带来了几个问题:

(a) 如何在列表中存储参数,每个函数的参数都不同(数量和类型都不同)。

(b) 这似乎效率很低,因为我的程序在每次运行模拟时都必须执行一系列if语句,以确定要调用哪些函数。

有人有什么建议吗?

我的建议是:不要发明自己的脚本语言/解释器。

如果您想在一天内快速开始支持用户定义的脚本,请查看Lua。它可以说是最容易嵌入到C/C++程序中的语言之一。有了luabind,它就更容易了:

module(L)
[
    class<Simulator>("Simulator")
        .def("A", &Simulator::A)
        .def("B", &Simulator::B)
        .def("C", &Simulator::C)
];

完成!现在,我可以运行lua脚本,这些脚本可以创建Simulator并在其上调用函数,并获得完整lua语言及其基本库的所有功能,每次调用都计算数学表达式,创建用户定义的函数、闭包、lambdas等。在脚本语言方面,lua是一个速度恶魔。

事实上,我在一天内就成功地将一个相当大规模的商业C++程序变成了一个完全可以用Lua编写脚本的程序。它很容易嵌入,因为这就是它的设计初衷

还有Python,如果我们使用Boost.Python,它与luabind非常相似。虽然使用C API会更痛苦,而且开始时会更乏味(我们不能只构建一个静态链接的库就走,而且我们必须处理很多环境变量,如sys.path,并确保我们在调试/发布版本中使用正确的Python实现)。

您也可以在其他语言中进行选择,但据我所知,这两种最流行的语言提供了C++库,使绑定更加容易。

您也可以使用SWIG并开箱即用地支持多种脚本语言,但SWIG需要相当长的时间来学习,因为它有大量的文档,其中有很多细节需要注意,因为它适用于许多不同的语言。

如果您想在C++应用程序中添加脚本语言,可以嵌入LUA:http://www.lua.org/home.html