3

背景: - 有用于表达编程语言有效词典和语法的正式语言 - 这种表示(例如正则表达式和上下文无关语法)可以使用某些工具(例如 LEX 和 YACC)自动编译到某些编程语言的词典/语法分析器中

问题: - 是否有用于定义编程语言语义的正式语言?- 是否有编译器可以根据这些形式语言自动生成语义分析器的代码?- 任何有关源代码语义分析的资源可供阅读?

笔记:-您可能会发现我的问题不切实际,没关系……我是编译器的新手?- 通过语义分析,我的意思是从源代码中收集必要的信息,用于下一步的代码优化和生成……这应该包括类型/边界检查……等等

我希望我提前说清楚了非常感谢

4

4 回答 4

3

有许多用于编程语言语义的正式语言 - 查看wikipedia 条目以了解更多关于 google 的术语。在我早期的职业生涯中,我做了少量的Z(到正式方法 wiki 的链接是另一个可能开始探索的地方)。我建议在lambda 上询问终极论坛,因为那里的人会使用其中的一些,并且可以针对您想到的任何用例建议使用什么;这篇论文似乎与您在生成编译器方面的要求有些相关——您需要语言的语义和目标机器的描述来创建编译器。

于 2009-09-13T08:17:45.793 回答
2

有许多定义编程语言语义的方案:指称语义(将语法映射到计算程序状态的函数);操作语义(相当于为您的语言构建解释器)、转换语义(相当于将您的语言翻译成另一种已经存在其他语义的语言)等。

目前,它们中很少有人会导致可用于真正的编程语言的系统。这里的其他答案之一表明 Centaur 作为一个试图做到这一点的系统。 Peter Mosses 的动作语义是最近比较严肃的尝试之一。

对于实际系统,目前最有效的方法是更多的 ad hoc 方法。这些包括可以有效定义词汇和语法语法的系统(作为 LEX 和 YACC 的变体),并自动构建树。属性文法允许对树的计算进行规范,这允许人们定义某些类型的分析,例如符号表构造或度量(从技术上讲,您可以通过这种方式进行指称语义)。大多数传统语言(C、Java、C#、COBOL 等)在控制流和数据流方面都具有相对相似的结构,因此可以构建通用流分析例程以允许对此类标准语言进行推理。

最后,你需要一个语义分析的目的:你到底想提取什么事实?可用的静态分析系统具有混合模式驱动/过程代码方法,用于收集感兴趣的语法、符号表和流事实,以计算特定问题的特定答案。

一些系统使人们能够使用这种语义信息来进行源代码修改。

遵循上述更特别方法的一个系统是我们的 DMS Software Reengineering Toolkit,它还具有为 Java、C、C++ 和 COBOL 等真实语言完成的通用语义定义(语法、符号表、数据流分析)。DMS 可以对受各种事实收集程序制约的 AST 应用源到源的转换,从而以可靠的方式实现代码的大规模转换。

于 2009-09-14T00:15:00.207 回答
1

具体静态分析,看http://rw4.cs.uni-sb.de/~martin/pag/

于 2009-09-13T19:49:46.527 回答
0

您所描述的正是 Centaur 项目的内容:

http://www-sop.inria.fr/croap/centaur/centaur.html

事实上,你可以很远地描述你的语言的语义,直到系统能够为你提供该语言的解释器(那时你已经完全描述了语义)。但你不必一路走下去。你可以做更少的描述工作,并且仍然为你的努力获得一个结构化的编辑器和类型检查器。

尽管该项目的工作已经停止(据我所知),但您可能会在链接中找到有趣的文章和下载。

于 2009-09-13T19:33:44.413 回答