language-agnostic - C语言语义规范

标签 language-agnostic programming-languages language-specifications

Wikipidea 说 Perl 有一个占主导地位的实现,用作其规范的引用,而 C 语言是由标准 ANSI ISO 指定的。

没看过一行标准就学会了C语言,这正常吗……?

我想知道标准(即自然语言文档)如何能够在不引用任何主要实现的情况下描述编程语言。

最佳答案

很难找到从规范中学习编程语言的人。该规范主要针对编译器作者(他们需要逐字遵守以保证正确性)并作为语言中合法内容的最终仲裁者。大多数语言规范都非常密集和技术性,并不是学习用语言编程的好方法。通常,只有非常高级的语言用户才能真正阅读规范。

此外,很少有语言是根据引用实现定义的。大多数语言是相对于某些抽象执行环境定义的。例如,C++ 规范说

The semantic descriptions in this International Standard define a parameterized nondeterministic abstract machine. This International Standard places no requirement on the structure of conforming implementations. In particular, they need not copy or emulate the structure of the abstract machine. Rather, conforming implementations are required to emulate (only) the observable behavior of the abstract machine as explained below.



换句话说,C++ 规范描述了 C++ 程序在纯理论意义上需要如何运行。这为规范作者如何定义语言提供了很大的回旋余地。例如,他们可以谈论“对象”和“指针”,而无需说明它们实际上必须如何实现。他们甚至不需要说明 C++ 在物理机器上是如何工作的,因为他们可以定义机器按照他们想要的方式运行,然后让实际的编译器编写者将抽象机器转换到物理机器上。

有些语言是针对虚拟机定义的(Java 就是一个很好的例子)。他们可以通过说明 Java 程序如何与虚拟机交互来讨论 Java 程序相对于该虚拟机的行为,然后将 VM 实现的细节留给 VM 实现者。

其他一些语言(例如 ML)具有纯粹的数学定义。该语言的语义被描述为状态之间的抽象数学转换,这意味着可以证明 ML 的属性,如果该语言是相对于引用编译器定义的,则无法轻易显示这些属性。

总而言之 - 语言规范是复杂的文档,很少有程序员真正去阅读。它们主要是针对编译器作者的,通常用一些不考虑机器的抽象术语来定义程序。这样,语言可以以可移植的方式定义,因为您只需将形式描述转换为机器操作即可在任何机器上进行一致的实现。

希望这可以帮助!

关于language-agnostic - C语言语义规范,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5203470/

相关文章:

algorithm - 给定一个数字,判断它是否辉煌

language-agnostic - 评估骰子滚动符号字符串

java - 编程偏好 - 将 else ifs 与多个 return 语句一起使用?

c# - 理解语言规范中描述的 C# 类型推断的问题

python - 你能在 Python 的语法中添加新的语句吗?

parameters - 多少个参数太多?

c# - 运算符中的交换性

c - 内存受限系统中的数组

php - 重命名 PHP 内部命令

java - 为什么添加 ".map(a -> a)"可以编译?