代码抽取成函数(Method Extract)

这是一个研究性项目。 以往的研究生已经基于Clang 和LLVM 研发了CCodeExtractor。 它通过指定提取条件,在保证程序语义一致的前提下, 将符合条件的代码片段自动分离成单独的函数并存放到新的程序文件中,而原代码片段被替换成一段包含对新函数调用的代码序列。

原有的原型系统结合Clang预处理器收集的宏定义、条件编译以及文件包含等信息,在Clang生成的抽象 语法树(AST) 上重点分析和处理代码段被提取成独立的外部函数时所面临的各种符号(变量、类型、宏、跳转目标等) 的作用域破坏和控制流破坏等情况,然后能自动产生外提代码后的新 C 程序文件以及修改后的原C 程序文件。 重构的源代码能保持原有宏定义和条件编译等的设 置,并能直接编译得到与原有程序语义一致的可执行程序。

局限性:由于是基于预处理后的代码进行分析的,故原有系统仅能对用户指定的宏设置下有效的代码进行提取工作。

进一步的研究点包括:

  • 研究条件编译和宏等对代码重构的影响,研制在任意宏设置下的代码提取
  • 支持对C++程序的代码提取
  • 代码提取的应用场景挖掘,以及相应的工具研制

动机与难点

Visual Studio 和Eclipse 中已集成有函数提取(Extract-Method)功能, 但是它们的提取方法存在一些局限性:

  • 一方面只能处理简单的代码片段(如无法处理包含跳转语句的代码片段)
  • 另一方面在程序变换过程中需要人工参与,即不能自动地变换得到语义一致的代码。

代码自动化提取和变换的难点

  • 预处理directives对重构的影响
  • 被提取的代码段中使用的各种标识符(全局变量、局部变量、参数、宏等)的正确变换与访问
  • 控制流的影响:goto、continue、return、break

已有的原型系统

最初的版本是由张其良、周坤(2013级硕士研究生)在LLVM 3.5上,基于Clang 和LLVM 研发的。宁宇(2016级硕士研究生)已经将其移植到LLVM3.9上。

文章:CCodeExtractor: 一种针对C程序自动化的函数提取方法

应用

基于CCodeExtractor,我们已经研制一个简单的循环分割工具,它将C 程序中满足条件的循环分割成单独的函数,并自动重构程序,保证重构前后的程序具有一致的语义。 利用CCodeExtractor,还可以帮助程序员快速地定位代码、查看和理解程序; 此外,还有一些其他潜在的应用:例如作为一个组件用于并行优化、异构平台的代码部署等等。

results matching ""

    No results matching ""