是否有任何免费库让用户轻松构建C数学表达式,可以像任何其他函数一样使用?我的意思是c表达式/函数,它可以像'内联'数学表达式一样快,并且可以在程序中多次使用。 我想我可以用某种方式在C中完成,但是如果它必须是CUDA dveice函数,是否有人可以判断它是否真实?
答案 0 :(得分:2)
有几个选择。我假设你想要一些用户可以“多次”“调用”的东西,比如:
void *s = make_func("2 * x + 7");
...
printf("%lf\n", call_func(s, 3.0)); // prints 13
...
printf("%lf\n", call_func(s, 5.0)); // prints 17
...
free_func(s);
一种选择是将其实现为包含函数指针和常量的递归结构。类似的东西:
enum item_type { VAR, CONST, FUNC };
struct var {
enum item_type;
int id;
};
struct constant {
enum item_type;
double value;
};
struct func {
enum item_type;
double (*func)(double, double);
enum item_type *a, *b;
};
然后make_func
会将上面的字符串解析为:
(struct func *){ FUNC, &plus,
(struct func *){ FUNC, ×,
(struct constant *){ CONST, 2 },
(struct var *){ VAR, 'x' } }
(struct constant *){ CONST, 7 } }
如果您能理解 - enum type_item
中的struct func
用于指向树中的下一个节点(或者更确切地说,该节点的第一个元素,即{{1} }}),enum
是我们的代码用来找出项目类型的内容。然后,当我们使用enum
函数时,它计算有多少变量 - 这是call(void *, ...)
函数应传递多少额外参数 - 然后用我们调用的值替换变量它,然后进行计算。
另一个选项(可能会更快,更容易扩展)是使用libjit之类的东西为你完成大部分工作。我从来没有使用它,但JIT编译器为您提供了一些基本的构建块(如添加,乘法等“指令”),您可以根据需要将它们串在一起,并将它们编译成实际的汇编代码(所以没有经过构造的语法树调用函数指针,就像我们之前所说的那样)所以当你调用它时它尽可能快速和动态。
我不知道libjit的API,但它看起来很容易做你认为需要的东西。 call
和make_func
可能与上面几乎完全相同(您可能必须更改对free_func
的调用)并且基本上构造,使用和销毁JIT对象基于它如何解析用户的字符串。实际上,与上面相同,但您不需要自己定义语法树,数据类型等。
希望这有点帮助。
答案 1 :(得分:2)
libtcc
(来自TCC)可用作非常小且快速的JIT;有关样本用法,请参阅libtcc_test.cc
。