重构C / C ++工具的原因非常有限

时间:2010-09-13 07:12:34

标签: c++ refactoring

没有创建用于C / C ++的工业级重构工具的问题是什么,我只需要一个“正常工作”的工具?

我所说的“工业级别”是由JetBrains产品(IntelliJ,ReSharper)或以上产品提供的质量。任何可用的解决方案(包括来自Tomato Software的Visual Assist或Eclipse CDT)都不够成熟。

以下是初创公司推动此类项目的优势。

  • 缓解C ++枯燥的语法(使开发更有趣);
  • C ++正在发展(0x版本即将到来,因此对于这样的工具实现者来说很多工作);
  • 营销利基比其他任何东西都要广泛(很多编写的C ++代码,很多活跃的C ++项目),甚至考虑到Web(HTML / JavaScript)项目;
  • C ++是针对系统问题而选择的,其中工具在编译时发现的每个bug都是生存(许多公司或政府应该感兴趣);
  • 这样的工具可以减少项目编译时间;

唯一的缺点是技术挑战......但是看看谷歌,微软,英特尔等正在做什么,应该没有无法解决的技术问题。

    让我们总结一下:
  1. 可以实施此类产品
  2. 非常有利可图
  3. 它不存在
  4. 没有人想赚钱?合谋;)?是什么原因?

4 个答案:

答案 0 :(得分:16)

我们只考虑一个基本的重构:重命名功能

实施看起来很简单。查找所有引用,并替换使用的标识符。

虚拟功能变得有点复杂。现在有必要找到基本声明(和实现,如果不是抽象),并且引用可以是类层次结构中的任何派生实现。更难,但仍然可行,因为要重命名的功能组是明确定义的。

这就是适用于C#和Java等语言的复杂性。现在是踢球者:C ++模板是鸭子类型。类层次结构中的实现集不再是明确定义的,因为它可能包含具有相同名称和可能兼容参数的ANY函数。你确实记得Koenig查找,对吗?

尝试分离必须具有相同名称的函数列表,因为它们从相同的重载分辨率集开始,从那些真正独立的函数开始,将是绝对的噩梦。此时你不妨进行文本搜索和替换。

所以,让我们列出你的要求/愿望清单:

  • “减轻无聊的语法”。这只是拖钓,在任何技术意义上都没有任何意义。如果该工具没有输入和输出C ++语法,那么它不是C ++重构工具。
  • “C ++正在发展”。这意味着需要以相当大的代价维持这样的工具才能跟上。这也意味着维护良好的工具很容易从旧的稳定工具中抢占市场份额。这意味着任何工具都需要大量的用户配置 - 毕竟你不想在C ++ 03代码库上生成C ++ 0x-isms,因此用户将不得不使用该工具。赢回配置时间。
  • “每个虫子都是生存”?不确定这个语法无意义的语句究竟是什么意思,但也许这意味着零容忍?但这最好通过保持稳定性(触及多个文件的自动重构的对立面),可靠的架构和文档(重构工具不会自动更新,或者您是否也想要这样做?),大量测试套件和静态分析来实现。实际上,重构使得大量测试套件变得更加重要,如果可能的话,以验证该工具没有破坏任何东西。请注意,自动静态分析面临着与重构相同的一些挑战,但由于它不会更改代码,因此可以对预处理后的代码和/或编译器AST起作用。
  • “减少编译时间”?这是一个不受支持的主张,需要一些证据或至少是坚实的推理。您是否期望使用重构工具来引入 pimpl 以进行编译防火墙? C#和Java风格的重构都不会减少C ++编译时间。
  • “这是可能的”不,实际上它似乎不是。如果您或我无法以理智的方式设计一个基本的重构,如重命名功能,请不要介意正确实现它,如何实现其中的几十个?如果可能,它也确实非常昂贵,这导致:
  • “这是非常有利可图的”。盈利能力不仅需要大量愿意为产品付费的用户,而且潜在的总销售额超过成本。我声称你已经严重低估了成本,所以在你提供一些关于成本和市场的真实研究之前,我会把这称为一个一厢情愿的想法。
  • “它不存在”。经过一段时间来解释为什么这样的工具不存在之后,我现在要告诉你它已经存在了吗?对。至少通过重构使得最终代码更好,例如在循环外提升常见的子表达式,展开循环,交换迭代次序,内联,缓存优化,向量化等,它们已经由优化编译器提供,这是C ++引领两者的领域C#和Java的利润率很高。 C ++根本不需要C#和Java中需要的许多源代码级调整才能获得良好的最终产品。只有对源代码进行操作才能让人们更容易访问它,并且现有的工具可以做到这一点,但也不例外。

答案 1 :(得分:8)

This link讨论了一些细节和复杂性

答案 2 :(得分:6)

原因是C ++不能通过大多数常见的解析技术(LALR,LL等)进行解析,并且实际上需要一些非常繁重的解析才能正确解析。像clang和gcc-xml这样的工具使得其他工具可以在不实现自己的C ++解析器的情况下处理C ++,尽管两者都相当新,即使使用这些解析工具,处理C ++仍然很复杂。我认为该行业最终将看到所有与Java相关的好东西移植/适应C ++ ...问题是什么时候。

答案 3 :(得分:4)

问题是C ++难以解析(它的语法不是上下文),并且在没有实际编译源的情况下很难理解。 Java工具可以工作,因为语言更简单,包括语法和语义。