语义分析的语言?
Posted
技术标签:
【中文标题】语义分析的语言?【英文标题】:a language for semantic analysis? 【发布时间】:2010-11-27 21:02:00 【问题描述】:背景: - 有用于表达编程语言有效词典和语法的正式语言 - 此类表示(例如正则表达式和上下文无关语法)可以使用某些工具(例如 LEX 和 YACC)自动编译到某些编程语言的词典/语法分析器中
问题: - 是否有用于定义编程语言语义的正式语言? - 是否有编译器可以根据这些形式语言自动生成语义分析器的代码? - 任何有关源代码语义分析的资源可供阅读?
注意事项: - 你可能会觉得我的问题不切实际,没关系……我是编译器的新手? - 通过语义分析,我的意思是从源代码中收集必要的信息,用于下一步的代码优化和生成……这应该包括类型/边界检查……等等
我希望我说清楚了 非常感谢提前
【问题讨论】:
【参考方案1】:有许多用于编程语言语义的正式语言 - 查看wikipedia entry 以获取更多关于 google 的术语。在我早期的职业生涯中,我做了少量的Z(指向正式方法 wiki 的链接是另一个可能开始探索的地方)。我建议在lambda the ultimate 论坛上询问,因为那里的人使用其中的一些,并且可以针对您想到的任何用例建议使用什么; this paper 似乎与您在生成编译器方面的要求有些相关 - 您需要语言的语义和目标机器的描述来创建编译器。
【讨论】:
【参考方案2】:定义编程语言语义的方案有很多: 指称语义(将语法映射到计算程序状态的函数); 操作语义(相当于为您的语言构建解释器), 转换语义(相当于将您的语言翻译成另一种语言 已经存在一些其他语义的语言)等。
目前它们中很少有可用于真正编程语言的系统。这里的其他答案之一表明 Centaur 作为一个试图做到这一点的系统。 Action semantics by Peter Mosses 是最近比较严肃的尝试之一。
对于实际系统,目前最有效的方法是使用更多的 ad hoc 方法。 这些包括词汇和语法句法可以有效地发挥作用的系统 定义(作为 LEX 和 YACC 的变体),并自动构建树。 属性文法允许对树的计算进行规范, 它允许定义某些类型的分析,例如符号表 构造或指标(从技术上讲,你可以 以这种方式进行指称语义)。大多数传统语言(C、Java、C#、 COBOL, ...) 在控制流和控制流方面都有相对相似的结构 数据流,因此可以构建通用流分析例程 让人们对这些标准语言进行推理。
最后,您需要一个语义分析的目的:哪些事实 你到底要提取吗?可用的静态分析 系统具有混合模式驱动/程序代码方法 收集感兴趣的语法、符号表和流事实 计算特定问题的特定答案。
有些系统可以使用这种语义信息来携带 源代码修改。
遵循上述更特别方法的一个系统是我们的 DMS Software Reengineering Toolkit,也有通用语义定义 (语法、符号表、数据流分析)真实完成 Java、C、C++ 和 COBOL 等语言。 DMS 可以申请 对 AST 的源到源转换 通过各种事实收集程序,这使得大众 以可靠的方式转换代码。
【讨论】:
【参考方案3】:具体做静态分析,看http://rw4.cs.uni-sb.de/~martin/pag/
【讨论】:
我会在这里说“数据流分析”。静态分析范围更广,包含许多其他内容,例如类型检查。 @Paul:PAG 是一个抽象解释框架,当然,(来自di.ens.fr/~cousot/researchthemes.shtml)“类型规范和推理是动态类型的静态近似,因此可以理解为抽象解释程序语义”。但我是在开玩笑,你是对的。【参考方案4】:您所描述的正是 Centaur 项目的内容:
http://www-sop.inria.fr/croap/centaur/centaur.html
事实上,您可以在很大程度上描述您的语言的语义,直到系统能够为您提供该语言的解释器(那时您已经完全描述了语义)。但你不必一路走下去。你可以做更少的描述工作,并且仍然为你的努力获得一个结构化的编辑器和类型检查器。
尽管项目的工作已经停止(据我所知), 您可以在链接中找到有趣的文章和下载。
【讨论】:
以上是关于语义分析的语言?的主要内容,如果未能解决你的问题,请参考以下文章