编程语言有助于重构的属性?

non*_*one 7 refactoring language-features language-design automated-refactoring

编程语言的常见特征/属性有哪些促进(简化)广泛自动化源代码分析和重新设计(转换)工具的开发?

我主要考虑编程语言特性,这使得开发静态分析和重构工具变得更容易(即比较Java与C++,前者对重构有更好的支持).

换句话说,一种编程语言,它将明确地设计为从一开始就为自动静态分析和重构提供支持,它最好具有哪些特征?

例如,对于Ada,有ASIS:

Ada语义接口规范(ASIS)是一种分层的开放式体系结构,提供对Ada库环境的独立于供应商的访问.它允许对Ada程序和库进行静态分析.ASA是Ada语义接口规范,它是一个库,可以让应用程序访问Ada编译单元的完整语法和语义结构.该库通常由需要在Ada程序上执行某种静态分析的工具使用.

ASIS信息: ASIS为工具提供了一种标准方法,用于提取Ada编译器或其他源代码分析器最佳收集的数据.使用ASIS的工具本身是用Ada编写的,可以很容易地在支持ASIS的Ada编译器之间移植.使用ASIS,开发人员可以生成具有高度可移植性的强大代码分析工具.它们还可以节省实施从源程序中提取语义信息的算法的相当大的费用.例如,已经存在ASIS工具,它们生成源代码度量,检查程序是否符合编码样式或限制,进行交叉引用,以及全局分析程序以进行验证和验证.

另见ASIS FAQ

你能想到其他编程语言提供类似的全面和完整的界面来处理专门用于分析/转换目的的源代码吗?

我正在考虑提供低级钩子的特定实现技术,例如核心库函数,它提供了一种在运行时检查AST或ASG的方法.

Bil*_*l K 7

最大的必须是静态打字.这使工具可以更深入地了解代码的作用.没有它,重构变得困难多了许多倍.

  • 如果可以进行流量分析,通常可以确定动态变量的实际类型; 大多数优秀的程序员不会将23种不同的东西放入同一个变量中.因此,支持动态语言重构的真正需求是非常好的流分析. (2认同)

Ree*_*sey 1

反射内置于语言/类型系统中。这使得静态分析和重构变得不那么痛苦。

这就是 Java 和 .NET 工具如此普遍和优秀的部分原因。这为工具提供了更好的功能,可以快速可靠地理解源代码的依赖性,这有助于对源代码进行静态分析。

此外,您还可以对编译后的代码进行分析。

  • 也许我误解了这个问题或这个答案——但我认为“反射”使重构变得更加困难。为了进行反射而提供的信息非常有帮助,但是代码内的实际反射调用往往会让大多数工具完全失败。要查找类的实例,您现在必须扫描文本字符串(不稳定)或从静态分析切换到运行时分析,这也是不稳定的,因为它取决于所命中的特定代码段。 (8认同)
  • 大多数语言中实现的反射对于严肃的代码分析来说非常糟糕。通常,您所获得的只是查询与另一个符号(例如,类)相关的符号列表(例如,方法)的能力。为了进行认真的分析,您希望能够“反映”(实际上是询问)程序任何细节的最佳结构/细节。为此,您需要直接访问源文本,或更容易操作的等效项,例如带有符号表、控制和数据流信息的抽象语法树。这反过来又需要严谨的分析基础设施。 (2认同)
  • 继续...同意之前的评论,即反射使语言变得更难推理,因为如果一个程序正在进行分析,并且想要推理自身,它现在还必须推理它如何推理自己。停止问题的阴影本身就是如此。更好的 IHMO 将分析机制置于程序之外,这样分析器就不必对分析器进行推理。 (2认同)