【问题标题】:How to describe the semantics of a language?如何描述语言的语义?
【发布时间】:2016-05-08 09:42:10
【问题描述】:

语法有EBNF ISO 14977 标准。

对于运行时,我们有CLI ISO 23271 标准
另见Simple definition of "semantics" as it is commonly used in relation to programming languages/APIs?

但是如何以声明的方式描述从 EBNF 到 CLI 规范的转换? 即使用S-attributed grammar就足够了吗?哪个标准定义了这种语法的语法?

【问题讨论】:

    标签: semantics execution formal-semantics


    【解决方案1】:

    定义语言语义的方法有很多种。它们都必须以某种方式表达程序文本和“它计算的内容”之间的关系。

    一个简短但不完整的基本技术列表:

    • 定义解释器(“操作语义”)
    • 定义从源代码到丰富的 lambda 演算(“指称语义”)的映射
    • 定义从源代码到另一种定义明确的语言的映射(“转换语义”)

    本质上,这些是在程序实例的源文本上定义的计算。

    您可以以多种不同的方式实现这些计算。 一种实现它们的方法可能是“S-attributes”语法,尽管为什么您希望将自己限制为仅使用 S-attributes 而不是具有继承属性的标准属性语法是我无法理解的。

    鉴于有很多方法可以做到这一点,我怀疑你会找到一个标准。当然,编程语言委员会没有使用一个。哎呀,他们甚至不会使用 BNF 的标准。

    【讨论】:

    • 我想要一些应用于 CLI/CLR 的指称语义示例(而不是纯 lambda 演算)。是否有可能将其丰富到现代编程运行时的水平?
    • 我认为你没有抓住重点。指称语义 (DS) 转换语义,目标语言 lambda 演算(具有一些附加的便利操作,例如对数字、数组和结构的数学运算)。因此,用于 CLI/CLR 的 DS 将产生等效的 lambda 演算。你真的可以为像 CLI/CLR/C# 这样复杂的东西构建这样的映射吗?我认为声称你可以,但这是很多汗水,如果你有,你会用它做什么? ...
    • ...这是一种先有鸡还是先有蛋的问题;没有机器来处理它,产生这样的语义就没有什么意义,没有语义,就没有动力去建造可以处理它的机器。因此,该项目的规模是语义部分的两倍,并且该部分已经与构建编译器一样大(因为这就是您本质上正在做的事情)。多年来我一直很感兴趣,并且在源语言处理技术方面进行了大量工程投资(请参阅我的简历),但还没有精力走这条路。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 2022-08-09
    • 2013-06-23
    相关资源
    最近更新 更多