【问题标题】:Meta language to code generate packed structs for ANSI-C and C# Structs元语言代码为 ANSI-C 和 C# 结构生成打包结构
【发布时间】:2016-04-22 04:30:32
【问题描述】:

我正在尝试寻找一种“元语言”,可用于定义结构并为成员获取/设置代码。问题是该结构已经存在于代码中,并且这种“元语言”将作为原始手动编码结构的逐位替换,以允许生成描述结构的标头。关键是这些结构被用作 C# 应用程序和嵌入式设备之间协议的一部分(不是基于 linux 的,认为像 PI​​C 或 CM0 一样更小,更受限制。) 元语言将充当

  • 结构成员的文档
  • 为 get/set 操作生成 C# 结构和实现
  • 生成打包的 ANSI-C 结构和获取/设置函数

元语言需要支持

  • 枚举定义(具有指定的大小 - 即 uint16_t、uint8_t 或更小的多位枚举)
  • 位数组(指定大小 - 即 48 位数组被打包成 6 个字节,)
  • 位结构/枚举数组(指定大小 - 即 48 个索引的 2 位结构为 12 个字节,)
  • 字节序和位序规范,
  • 生成的二进制结构可以直接被生成的 ANSI-C 代码或 C-sharp 代码读取,以便通过网络发送。

在收到数据时对数据进行一些有限的验证也很好。

到目前为止,我已经看过

  • BSON
  • 蚀刻
  • Hessian Avro
  • 消息包
  • 协议缓冲区
  • 节俭

所有这些都非常适合文档编制和构建新协议,但试图保持与现有协议的兼容性,但由于数据编组中固有的类型编码,这些都不足。

我还查看了 ASN.1 的 ECN 编码,但这似乎太难以理解,导致文档出现问题。

我查看了Generating C# structure from C structure,但那里没有一个好的选择。

有什么建议吗?

【问题讨论】:

    标签: c# data-structures protocols code-generation ansi-c


    【解决方案1】:

    你想要的是Program Transformation System

    这些工具可以读取任意计算机语言实例,然后将它们转换为其他有效的语言实例,有时使用相同的语言,有时转换为不同的语言。它们是通用的,因为您可以向它们提供您要操作的语言的描述,然后它们可以对这些语言进行操作。

    这个领域的好工具可以让您根据感兴趣的语言的(“表面”)语法编写代码转换,基本上是“如果你看到 this,请替换它那个”。

    对于 OP 的场景,基本的转换是“如果您在结构中看到 此插槽 将其替换为 相应的 getter 和 setter,以及目标的替换结构成员语言。

    在您的情况下,您需要在 3 个场景之间进行选择:

    • 定义用于指定数据结构的抽象语言,并构建从规范语言映射到 C# 和 C 的程序转换。
    • 确定C数据声明为引​​用,生成对应的C#代码。
    • 确定C#数据声明为引​​用,并生成对应的C代码。

    然后您必须坐下来,为工具定义语言(如果尚未定义),然后构建转换。

    (完全披露:我构建了这样一个工具。请参阅我的简历)。

    【讨论】:

    • 谢谢 - 这个概念似乎非常全面,不仅适用于数据结构,还适用于任何语言实现的算法。我快速浏览了一下 - ASF+SDF - CIL(用于 C)- Coccinelle(用于 C)- DMS(您最喜欢的?)- Fermat - Spoon(用于 Java)- Stratego/XT - TXL 看起来都很成熟,而且我认为从 C Source 标头开始并将其转换为 C# 将是一个很好的模型,但是我遇到了一些问题,因为每个人都很好地理解了跳转开始测试。
    • 关于成熟度,请查看我关于“LifeAfterParsing”的文章(请参阅我的简历以获取链接,或者只需搜索 Google)。有些是;大多数不是恕我直言。如果你要解析 C,你需要一个强大的 C 解析器;那些更难找到。以下是如何将一种表示法的表达式转换为另一种表示法的表达式的示例:softwarerecs.stackexchange.com/a/31379/101 你想将另一种数据结构定义中的表示法中的数据结构定义转换,所以有一个类比。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    • 1970-01-01
    • 2012-01-19
    相关资源
    最近更新 更多