【问题标题】:Optimizing redundant code into loops algorithmically通过算法将冗余代码优化为循环
【发布时间】:2025-11-27 14:20:03
【问题描述】:

我正在为相当基本的脚本语言编写转换器,但它似乎缺乏使用 for 循环的能力。这使得代码非常混乱和冗余,例如,而不是:

for(int i = 0; i < 5; i++) {
    ECHO Hello World!
    SLEEP 500
}

用这种语言编写的脚本最终看起来像这样:

ECHO Hello World!
SLEEP 500
ECHO Hello World!
SLEEP 500
ECHO Hello World!
SLEEP 500
ECHO Hello World!
SLEEP 500
ECHO Hello World!
SLEEP 500

等等。所以基本上,我正在将此脚本转换为 c++,是否可以减少所有这些重复调用?我曾想过循环并寻找重复的代码,但问题是我无法处理这样的代码:

ECHO 1
SLEEP 500
ECHO 2
SLEEP 500
ECHO 3
SLEEP 500
ECHO 4

是否有更简单的方法来识别这些模式,还是我需要深入研究更复杂的东西,例如神经网络?

【问题讨论】:

  • 转换器应该怎么做,执行它们?还是真的需要输出可读的代码?
  • 需要输出执行的代码。
  • 好吧,那我就不关心优化它了。让 c++ 编译器关心它。或者你对展开循环的代码大小有什么问题吗?
  • 这将是主要问题,在这种情况下我的代码大小非常有限。

标签: javascript loops optimization refactoring automated-refactoring


【解决方案1】:

我不知道“更简单”。

您需要的是检测参数克隆的克隆检测器。这会找到重复的克隆序列,以便可以实例化具有参数的克隆以生成确切的代码实例。

您的示例循环包含的是参数化克隆的重复实例:

   ECHO n
   SLEEP 500

所以你的序列的第一个抽象是:

   for n in {1,2,3,4}
      ECHO n
      SLEEP 500

序列上的 for 循环很容易转换为:

  for n=1,4 step 1
      ECHO n
      SLEEP 500

这是我认为你想要生成的代码。

所以你的问题是得到一个参数克隆检测器。

看到这个technical paper on how to implement a parametric cloned detector over abstract syntax trees。这些不是容易构建的工具。但是,如果您构建了一个,那么如果您可以将您的脚本语言解析为 AST,那么这将为您提供核心参数克隆。然后您可以执行您认为有帮助的其他优化。

【讨论】: