如何从Python生成C代码?

时间:2018-03-07 13:55:28

标签: python c jinja2 template-meta-programming mako

我正在编写嵌入式算法。目前我有硬编码的查找表:

static const int32_t sine[65536] = {
    ...
}

算法应该可以在不同平台上移植,但查找表长度会根据配置和目标平台而变化。

我目前的解决方案使用mako-render(Mako比Jinja2快得多)如下:

<%!
import os
import algo  # Local module that contains tools to generate coefs.
from numpy import sin, linspace, pi

a, b, c, d, e = algo.coefficients(os.environ['ALGO_MODE'])
%>

static inline float poly(float x)
{
    return x * ( x * ( x * ( x * ${a} + ${b}) + ${c}) + ${d}) + ${e};
}

float sine[] = {
% for y in sin(linspace(0, 2 * pi, 2 ** 16)):
    ${y},
% endfor
};

在我的Makefile中,我使用它:

in: $(IN)
$(IN): build/headers/%: src/%.in
    mkdir -p $(dir $@)
    PYTHONPATH=.:$$PYTHONPATH mako-render $< > $@ || true

我喜欢这个解决方案,因为我可以从Python结果中轻松生成C代码:

  • 过滤系数
  • 查找表
  • 动态类型
  • ...

主要缺点是:

  • 我找到的模板引擎都没有适用于C代码
    • Jinja的语法有很多花括号,在C
    • 中令人困惑
    • Mako有一个奇怪的混合语法mix xml(<% %>),shell(${}),mako(%)。
  • 对我的模板使用.in扩展名可能会造成混淆,因为autotools和CMake已经使用了此扩展程序。

元编程/代码生成变得非常流行,在我的工作领域,我几乎每天都需要使用这样的魔法。我很惊讶没有像[{1}}那样古老的其他原生解决方案(请不要提及M4 :))。

我可以使用哪种其他解决方案用外部脚本生成的数据填充C 模板?我在这里错过了真正的魔法吗?

0 个答案:

没有答案