gpt4 book ai didi

c++ - C++ 代码生成的优雅方式

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:19:48 26 4
gpt4 key购买 nike

我目前正在从事一个与数据库相关的项目,在该项目中我生成了大量 C++ 代码。然后编译此代码并将其加载为动态库。我使用这种技术为数据库架构和查询构建高效代码。

目前,我正在使用简单的文件写入来生成代码(这对于概念验证实现来说是可行的)。现在,我正在寻找一种更优雅但相当灵活的解决方案来生成 C++ 代码。

我搜索了很多,但到目前为止我找到的所有解决方案都相当复杂/广泛,效率不够高,或者不够灵活。

您在 C++ 项目中使用哪些库来生成代码?

最好的,莫里茨

最佳答案

您可以使用 program transformation system (PTS)以可靠的方式定义和编写代码模板。

大多数 PTS 使人能够定义语法,然后使用该语法将源代码解析为 AST。更重要的是,它们接受模式:源代码片段(通常是非终结符或非终结符列表)带有对应于格式良好的子片段(非终结符代表子树)的占位符。这些模式通常坚持命名占位符完全匹配(请参见下面的示例)。此类模式可用于匹配已解析的 AST,作为使用表面语法查找代码片段的一种方式。

因此,人们可能会使用一种模式:

   pattern x_squared(t: term): product
= " \t * \t ";

寻找由相同子树的乘积组成的子表达式。这将匹配

   (p + q[17])*(p+q[17)

但不是

    2 * (x-3)

但同样有趣的是,通过使用变量的绑定(bind)值(树)实例化模式,此类模式可以用作代码生成器。所以,“实例化 x_squared(2^x)”产生

     (2^x)*(2^x)

就其本身而言,这只是一种奇特的宏方案。它要好得多,因为它可以“在编译时”(对于模式)告诉您您正在编写的内容是否有意义。因此,您可以对代码片段的组成进行类型检查。例如,您可能不小心编写了“实例化 x_squared(int q)”,但好的 PTS 会反对“int q”不是“术语”;您在构建代码生成器时发现了错误。

真正有趣的是,人们可以从许多不同的模式构建许多不同的代码片段,并用更多模式组合这些片段。这允许人们构建非常复杂的代码。所有这些都是一种(语法类型)安全的方式;结果树是有效的语法。 (你仍然可以 bollix 语义;没有什么是完美的)。随着您生成的代码的复杂性增加,进行这种额外检查有助于避免生成错误代码。

PTS 还有一个额外的优势:在组合代码片段之后,它可以应用源到源的转换来优化生成的代码。因此,您可以根据您编写匹配转换的能力并利用您在代码生成过程中掌握的知识来生成优化的代码。假设您为矩阵乘法生成代码:

 ... P * Q ...

并且您的代码生成器不知何故知道 Q 是单位矩阵。然后以下优化可以删除昂贵的矩阵乘法:

  rule optimize_matrix_times_unit(m: term, n: term): product -> product
" \m * \q "
-> " \m "
if is_identity_matrix(q)

此转换利用了生成代码中的模式匹配(找到矩阵乘积)、模式实例化(为匹配乘积生成替换)以及代码生成可以执行的额外知识或分析 (is_identity_matrix)。

您需要一个能够处理 C++ 解析的 PTS;那些有点难找。我设计的那个(DMS Software Reengineering Toolkit)恰好就是干这个的。此答案中的示例是 DMS 样式。

这是 a technical paper描述了 DMS 在 C++ 代码上完成的大规模再工程任务。论文中的许多示例实际上是用于实例化代码的相当复杂的模式;重新设计任务必须为现有代码块生成一组新的 API。

关于c++ - C++ 代码生成的优雅方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28103268/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com