-1

我希望为代码分析开发独立于语言的工具。为了做到这一点,我需要找到一种方法来概括编程语言的语法。我想在源代码和分析器之间开发一个层,以便它可以独立于语言理解源代码。我需要知道这个问题是否有专门的研究领域?有什么建议么?

4

3 回答 3

1

这实际上取决于您要进行的分析类型。如果您想以在源语言上下文中可解释的方式分析代码的“意图”,那么问题可能是不可能的,除非您将自己限制在特定的语言家族(例如 Java、C# 和 C++,但是即使是有限的)。如果您只对基本分析感兴趣,例如构建定义类型和方法/函数的模型,您可以获得更大的灵活性。

如果您对分析低级行为感兴趣,最好的选择可能是分析编译器早期阶段的输出。例如,有许多有用的分析类型,例如数据流分析,可以在 Java 字节码上完成,而与生成它的语言无关。可以对 LLVM 中间代码或 GCC 的中间语言进行类似的分析(事实上,这些编译器都在中间代码或汇编代码级别进行了很多优化,因此无论使用哪种语言都可以进行很多相同的优化正在编译)。

于 2013-04-19T18:02:08.763 回答
0

对于静态分析,您需要“通用”操作语义,这与语法完全无关。你很幸运——它确实存在,因为每一种实用的语言最终都会被翻译成实际硬件的语义。

因此,您的 CPU 的汇编程序正是您的“广义语义”。CPU 的操作语义是一个很好的研究课题,如果你深入研究,你会发现大量的论文。

LLVM 的级别足够低,可以涵盖大多数此类语义,同时比真实硬件更紧凑且更易于分析,因此您可以考虑使用类似的中间表示。SSA 表格可以显着简化分析。

但是不要太兴奋——在如此低的级别上进行任何有用的全局分析是非常困难的——通用内存模型将需要太多资源,从而使任何分析在现代硬件上都不现实。

如果您准备严格限制对源语言的选择,您可以更上一层楼,并采用更多可分析的语义。如果你想走这条路,你可能会发现K 框架很有趣。

于 2013-04-22T08:39:32.543 回答
0

在我的研究小组中,人们一直在开发一个名为Moose的软件分析平台。因此,他们开发了Famix模型来抽象特定语言的语法。从特定语言到语言无关模型有各种导入器。

在许多具有不同语法的面向对象编程语言中,您可以找到一些常见的结构,例如继承等。然而,不可能有一个独特的模型来捕捉所有语言的所有结构的语义——该模型捕捉到的语义许多语言共享的通用结构。

于 2013-04-22T07:22:18.900 回答