代码之家  ›  专栏  ›  技术社区  ›  Eamon Nerbonne

简单实用的C代码生成(与2008年或2010年相比)

  •  2
  • Eamon Nerbonne  · 技术社区  · 15 年前

    我推迟了将生成的代码用作构建过程的一部分,因为担心它引入构建过程中的复杂性。

    有没有一种简单的方法可以将构建时生成的代码集成到应用程序中?

    我想到的代码是 类似于资源和设置文件 Visual Studio执行的代码生成:

    • 在这里拥有智能感知是有价值的
    • 有很多属性和属性之间的链接,这些属性很容易描述,但不可能在C中简洁地实现。
    • 底层资源是可修改的,代码自动重新生成,不需要任何用户交互,也不需要了解生成器的内部。

    例如(非真实世界) 考虑一个预编译程序,它通过类似的C属性(或方法)生成对regex的命名捕获组的访问器。这是我想要生成的典型类型:样板包装器的长片段,其主要功能是启用编译时错误检查(在上面;访问非现有捕获组或写入和无效regex),而且更重要的是,这些属性的intellisense。最后, 这个设置对于团队中的其他人来说应该是非常有用的。 只有最低限度的学习曲线。也就是说,要求手动干预来重新生成代码是绝对不可接受的,也不允许将生成的代码提交到源代码控制中。最坏的情况下,每个人都只需要安装一些扩展;理想情况下,扩展应该可以安装到源代码树中,这样任何签出该树的人都可以在不进行任何介绍的情况下构建项目。

    要使其工作良好,IDE集成非常重要: 更新基础的“资源”定义文件应触发重新生成 不需要任何用户交互的代码,理想情况下,生成器本身很容易为以后的其他开发人员维护(也就是说,一些生成器调试能力是一个优点)。

    最后,一种类似于XSLT的方法 同一模板可应用于各种输入资源 是理想的;这两者都是因为这意味着您甚至不需要查看实际的生成器代码,如果您只想更新资源,并且因为它使模板重用变得微不足道。

    我看过t4,但是 从我所看到的情况来看,这是一种不太方便的类似ASP的方法,模板和资源不会被清晰地分割(即,生成器负责查找资源,这使得模板重用变得不那么容易)。

    是否有更好的(更干净的)解决方案或运行t4的某种方式,以便相同的模板可以被琐碎地重用(与.NET设置文件非常相似),资源的任何更新都会自动触发已实现代码的重新生成?

    总结: 我正在寻找一种可以

    1. 当底层 资源 (不是模板!)变化。
    2. 维护起来有点简单
    3. 能够在多个资源之间共享相同的生成器模板(使用点1可能意味着资源应该引用生成器,而不是相反)。
    2 回复  |  直到 15 年前
        1
  •  6
  •   Oleg Sych    15 年前

    您可以使用来自的t4scriptfilegenerator T4 Toolbox . 将“resource”文件的“custom tool”属性更改为t4scriptfilegenerator并保存更改。自定义工具将生成一个新的空t4脚本(.tt文件)。将代码生成逻辑放在这个.tt文件中。每当修改(和保存)资源文件时,t4scriptfilegenerator将使用.tt文件生成输出代码。有关如何工作的示例,请参见t4工具箱中的“Linq to SQL Model”生成器,它使用.dbml文件作为“资源”。在这个生成器创建的.tt文件中,您将看到所有代码生成逻辑都驻留在单独的.tt文件中,并在 include 指令。

        2
  •  0
  •   Rui Curado    15 年前

    你可能想留意一下ABSE( http://www.abse.info )。ABSE是一种代码生成和模型驱动的软件开发方法论,在平台和语言方面完全不可知,因此您可以轻松创建自己的C生成器以及您希望的任何其他生成器。最大的好处是你可以按照你想要的方式生成代码。缺点是,在构建模板之前,您可能需要做更多的工作。

    ABSE允许你将你的领域知识捕获到“原子”中,这基本上是你可以建立的更大模型的碎片。abse是声明性的和可执行的。模型能够根据您的规范生成代码,并在模型级别合并自定义代码。

    不幸的是,ABSE仍在进行中,集成开发环境(称为AtomWeaver)仍在开发中。无论如何,CTP发布的发电机定于2010年1月,所以我们已经接近它。