在算法上优化冗余代码到循环

时间:2014-05-28 18:11:38

标签: javascript loops optimization refactoring automated-refactoring

我正在为相当基本的脚本语言编写转换器,但它似乎缺乏使用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

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

1 个答案:

答案 0 :(得分:1)

我不知道&#34;更简单&#34;。

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

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

   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,那么这将为您提供核心参数克隆。然后,您可以执行您认为有用的其他优化。