如何让用户创建一个功能? [ 图书馆 ? ]

时间:2011-03-10 00:11:45

标签: c cuda

是否有任何免费库让用户轻松构建C数学表达式,可以像任何其他函数一样使用?我的意思是c表达式/函数,它可以像'内联'数学表达式一样快,并且可以在程序中多次使用。 我想我可以用某种方式在C中完成,但是如果它必须是CUDA dveice函数,是否有人可以判断它是否真实?

2 个答案:

答案 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, &times,
    (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,但它看起来很容易做你认为需要的东西。 callmake_func可能与上面几乎完全相同(您可能必须更改对free_func的调用)并且基本上构造,使用和销毁JIT对象基于它如何解析用户的字符串。实际上,与上面相同,但您不需要自己定义语法树,数据类型等。

希望这有点帮助。

答案 1 :(得分:2)

libtcc(来自TCC)可用作非常小且快速的JIT;有关样本用法,请参阅libtcc_test.cc