Programming languages 有没有一种方法可以概括编程语言语法

Programming languages 有没有一种方法可以概括编程语言语法,programming-languages,Programming Languages,我希望为代码分析开发独立于语言的工具。为了做到这一点,我需要找到一种方法来概括编程语言的语法。我考虑在源代码和分析器之间开发一个层,以便它能够独立于语言理解源代码。 我需要知道这个问题有没有专门的研究领域?有什么建议吗 这取决于你将要做的分析类型。如果你想用源语言的上下文来解释代码的“意图”,那么除非你限制自己的语言(例如java、C语言和C++,但即使是有限的),否则问题很可能是不可能的。如果您只对基本分析感兴趣,例如构建定义类型和方法/函数的模型,则可以获得更大的灵活性 如果您对分析低级行为

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

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


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

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


在许多具有不同语法的面向对象编程语言中,存在一些常见的结构,例如继承等。但是,不可能有一个唯一的模型来捕获所有语言的所有结构的语义——该模型捕获许多语言共享的常见结构的语义

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

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

LLVM的低级别足以覆盖大部分语义,同时比实际硬件更紧凑,更易于分析,因此您可以考虑使用类似的中间表示。SSA形式可以显著简化分析

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


如果您已经准备好严格限制您对源语言的选择,那么您可以提高一个级别,使用更多可分析的语义。如果你想这样做,你可能会觉得很有趣。

既然没有伪代码的标准,问题是编程语言与强语言(函数式、面向对象等)不同,这使得创建一种能够表示所有扩展的Backus-Naur形式的伪语言几乎是不可能的。语法的泛化很容易,这叫做语法识别/生成。概括语言语义非常困难(可能不可能)。如果没有语义,语法就没有意义。