我正在研究将大量(>10M 行)C++ 代码移植到 64 位的方法。我已经研究了静态代码分析器和编译器标志,现在正在研究可以进行常见的重复更改的宏或其他工具。
我写了一些正则表达式来看看它们在实践中的效果如何,正如预测的那样,它们非常有效。也就是说,首先构建表达式需要一段时间,所以我想看看是否有此类表达式的列表或可以自动执行更改的软件工具。
以下几行是要匹配和修复的代码的原型示例。 (澄清一下,这些行并不意味着代表单个代码块,而是从不同位置提取的行。)
int i = 0;
long objcount;
int count = channels.count(ch);
for (int k = 0; k < n; k++) { /*...*/ }
目标不是将代码彻底移植到 64 位,而是对代码执行第一次传递以减少需要手动检查的代码量。错过一些需要的更改是可以的,而且这是probably做出一些错误的改变是可以的,但应该尽量减少这些改变。
Visual Studio 是用于转换工作的 IDE,因此与 VS 配合良好的东西是一个优势。成本不是问题。
Rexexp 的误报率很高;根据定义,“正则表达式”无法解析上下文无关的语言,例如 C++。此外,正则表达式不能考虑
账户类型信息;是
fooT i=0;
好的,对于一些类型定义的脚?最后,正则表达式无法更改代码;您可能会考虑 Perl 或 SED(使用正则表达式来驱动更改),但由于正则表达式的误报,您会得到错误的更改。在 10M SLOC 下,这可不是什么有趣的事; 5% 的错误率意味着可能需要手动修复 50,000 行代码。
您可能会考虑程序改造 http://en.wikipedia.org/wiki/Program_transformation工具。这样的引擎在语言结构上运行,而不是文本,并且更复杂的版本知道符号的范围、类型和含义(例如, fooT 到底是什么?)。它们使您能够使用目标语言的表面语法编写特定于语言和上下文的模式,并提出结构正确的代码更改。这使得大规模代码更改的可靠应用成为可能。
Our DMS 软件再造工具包 http://www.semanticdesigns.com/Products/DMS/DMSToolkit.html以其C++ 前端 http://www.semanticdesigns.com/Products/FrontEnds/CppFrontEnd.html已用于以语法和类型准确的方式对大型 C++ 系统进行大规模更改。 (参见 Akers, R.、Baxter, I.、Mehlich, M.、Ellis, B.、Luecke, K.,案例研究:通过自动程序转换重新设计 C++ 组件模型、信息和软件技术 49(3): 275-291 2007。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)