【问题标题】:Any C compiler with C output? [closed]任何带有 C 输出的 C 编译器? [关闭]
【发布时间】:2011-09-18 04:53:51
【问题描述】:

我们都知道 C 编译器会输出汇编。

但是,我正在研究我的工具只接受 ANSI C 的一小部分。 是否有任何 C-to-C 翻译器可以内联函数或展平结构,但写出 C 代码?

任何其他可以简化 C 代码的工具,让我听听。

【问题讨论】:

  • 如果您希望输入和输出都是 C,那么您不需要编译器。
  • @Matt Ball:IMO,任何将代码从语言 A 转换为语言 B 的工具,即使 A == B 或者它们是同一语言的不同版本,都可以称为编译器(只要该工具执行一些转换,而不仅仅是回显其输入)。
  • “编译器”将源代码从一种语言翻译成另一种语言。最多,接受你的解释,编译器会吐出目标代码,这仍然不一定是汇编。
  • @Aasmund: indent 几乎是一个编译器 :) 尽管有 indent 的玩笑……我同意你的看法!
  • @pmg:呵呵——好点;在将其称为编译器之前,可能需要考虑转换的复杂程度:-)

标签: c code-translation program-transformation


【解决方案1】:

我们的DMS Software Reengineering Toolkit 及其C Front End 可以做到这一点。

DMS 提供用于解析、构建 AST、符号表、一般分析 AST 的通用机制,以及用于控制/数据流/指向/值范围的特定分析器,以及以程序或使用模式任意转换 AST,以及重新生成源文本,包括 cmets。 DMS 同时处理多个编译单元的能力允许同时影响多个编译单元的全局分析器和转换。

DMS 的 C 前端专门针对 C 的所有这些(它具有适用于各种其他语言的前端)。它处理各种方言,包括 ANSI、GCC 3/4、MS Visual C 和 Green Hills C;可以根据需要为其他方言定制。

DMS 已用于各种 C 分析/转换项目,包括分析 2600 万行的软件系统。

DMS 的一个有趣应用是检测 C 源代码以在指针错误发生时捕获它们(而不是遭受长时间延迟的崩溃);请参阅我们的CheckPointer 工具。这个工具读取源代码,插入额外的代码来检查每个指针的访问,然后写出结果。 在此过程中,它将 C 代码规范化为简化的子集,以消除许多特殊情况。这种标准化可能非常接近 OP 想要做的事情。

【讨论】:

    【解决方案2】:

    旧的 MIT 项目 C2C(在 FTP 上使用了一段时间)和较新的 Cilk 让您可以运行 C->AST->C 进程。

    Cilk 和 Cilk++ 得到积极维护。它们包括一个非常好的 ANSI C 解析器。

    【讨论】:

      【解决方案3】:

      【讨论】:

      【解决方案4】:

      据我所知,Clang 可以将其 AST 翻译回 C 来自 Internet 上的各种来源。

      【讨论】:

        【解决方案5】:

        如果您不要求生成的 C 代码特别可读,您可以使用常规编译器生成二进制可执行文件,然后使用反编译器从二进制生成 C 代码。反编译器很可能无法“内联”编译器内联的函数。虽然不确定结构,但如果您在没有调试符号的情况下进行编译并使用不太复杂的反编译器,它可能根本无法检测到结构。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-01
          • 2010-09-17
          相关资源
          最近更新 更多