【问题标题】:Customize Clang to convert C++ code to C自定义 Clang 以将 C++ 代码转换为 C
【发布时间】:2017-09-26 08:39:48
【问题描述】:

这是我的场景: 我正在开发一个嵌入式 linux 系统并获得一个用 C++ 编写的共享库。除了需要 libstdc++ 外,它运行良好,这意味着占用了额外的 1M 内存。我想把共享库转换成C,这样可以节省1M内存。

我知道如何手动将 C++ 代码转换为 C,但这真的很无聊。所以我搜索了解决方案并得到了一个类似的问题:Use Clang to convert C++ to C code。但是生成的代码不可读。我想获得可维护的 C 源代码以淘汰原始 C++ 代码。

我是 Clang 的新手。我了解到Clang can be used to build a tool that processes code。我的问题是:

  1. 是否可以使用 Clang 来实现我的目标?
  2. 如果可能,我该怎么做?具体来说,第一步如何使用 Clang 去除宏包裹的代码块?

【问题讨论】:

  • C 和 C++ 是两种不同的语言。在两种语言之间进行翻译并不容易,也不容易实现自动化。您是否曾尝试从 googletranslate 中获取可读的内容?
  • 您是否第一次尝试 1. 使用 -Os 编译 2. 重写 C++ 代码以摆脱尽可能多的模板(这里当然是空间/速度权衡) 3. 静态链接所有内容?如果没有,请先尝试,将代码自动转换为 C 将无法正常工作。
  • 其实你不需要libstdc++,因为它是C++。您可以使用gcc 而不是g++ 链接您的C++ 程序,而不是链接libstdc++。您必须删除对std、异常、RTTI 等的所有引用,但您已经愿意这样做...
  • @Paladin 我会试试的,非常感谢。
  • 我完全不确定删除模板是否会赢得空间(可能恰恰相反)。例如,标准容器实现的编写和调整都非常好。

标签: c++ c clang


【解决方案1】:

实践中将真正的 C++ 代码(半自动)转换为可维护的 C 代码不现实

我想获得可维护的 C 源代码以淘汰原始 C++ 代码。

您肯定不会得到可维护、可读和可移植的 C 代码(例如,只要在 C++ 中使用标准 containers;它们的模板扩展是可读的,并且可能不可移植到具有不同字长、对齐方式、字节顺序的东西......)。您可以将 LLVM IR 转换为 C 的一些不可移植和不可读的子集。

除了需要libstdc++外,效果很好,这意味着要占用额外的1M内存

也许你可以尝试静态地链接(一切);在您的特定应用程序中可能只使用了libstdc++ 的一部分。

顺便说一句,您可以从 GCC 获得 GIMPLE,并将该 GIMPLE 转换为 不可读 C 代码(也许通过使用插件或 GCC MELT 扩展自定义 GCC)。

您也可以尝试使用链接时间优化来编译和链接,例如使用-flto -Os(使用最近的 GCC 或 Clang)。

不要忘记,开发工作也有一些成本。一个由几个开发人员组成的团队花费一整年(或更长时间)的工作来赢得几百 KB 是否值得?在大多数情况下,将硬件升级到内存稍多的东西会花费更少。 YMMV

【讨论】:

  • FWIW,似乎有 -fdump-tree-gimple 应该将 gimple 打印为 C 代码。
  • 不完全是 C,但接近它。
  • 非常感谢您节省了我的时间 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
相关资源
最近更新 更多