【问题标题】:How to generate programs with loops unrolled? [duplicate]如何生成展开循环的程序? [复制]
【发布时间】:2018-10-22 03:44:13
【问题描述】:

我正在尝试从一个给定的 C/C++ 程序生成多个程序,并展开循环。例如,我想转换如下内容:

i = 0;
while (i < 5) {
    printf("Hello");
    i++;
}

到这里:

i = 0;
printf("Hello");
i++;
while (i < 5) {
    printf("Hello");
    i++;
}

在上面的示例中,我想生成 5 个程序,每个程序都有不同数量的展开循环。到目前为止,我查看的编译器标志似乎并没有生成程序,而只是对其进行了优化。有没有直接的自动化方式来做到这一点?

编辑:我不明白为什么这被否决了。链接为重复的问题不相关。

【问题讨论】:

  • @NickyC 我的问题是关于生成 C 程序,我不明白你链接的问题是如何相关的。
  • 你为什么要这个?
  • @bolov 我正在尝试为我的研究创建一个合成程序数据集(它们执行相同的任务)。
  • @AmitRege 请注意“相同的东西”只能用as-if rule来定义
  • 我不知道有什么工具可以为你生成这种代码。只需编写一些简单的脚本(bash、python 等任何你喜欢的),它将使用你的 C 代码从一个提供的 C 源文件生成 n 个文件。

标签: c++ c


【解决方案1】:

是否有任何直接的自动化方法可以做到这一点?

这是一个不寻常的要求,因此我认为您将很难找到执行此操作的工具。

在不知道您要实现什么目标、您要解决什么问题的情况下,除了手动展开之外,我们无法为您提供解决方案:

printf("Hello");
printf("Hello");
printf("Hello");
printf("Hello");
printf("Hello");

【讨论】:

  • 我想你误会了。我想从给定的程序生成一个只展开循环的程序。
  • @AmitRege 我明白了。该示例是您展示的展开的循环。
  • 在这种情况下不应该是 printf("Hello");我++; 5 次?
  • @AmitRege no, i 用于循环逻辑。它与i &lt; 5 的方式相同。无论如何,这取决于你想用它做什么。
【解决方案2】:

如果你要改的程序都是你自己写的,而且你知道它们的结构很简单,你可能会用一点正则表达式的魔力。

为了可靠地修改任意程序,您必须使用适当的解析器,在抽象语法树中检测常量for循环,然后将修改后的语法树写回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-14
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    相关资源
    最近更新 更多