【问题标题】:C language semantic specificationC语言语义规范
【发布时间】:2011-03-05 11:18:11
【问题描述】:

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

我学了C语言,没有读过一行标准,这正常吗...?

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

【问题讨论】:

  • 谢谢大家的回答!

标签: language-agnostic programming-languages language-specifications


【解决方案1】:

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

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

本国际标准中的语义描述定义了一个参数化的非确定性抽象机。本国际标准对一致性实现的结构没有要求。特别是,它们不需要复制或模仿抽象机器的结构。相反,需要符合要求的实现来模拟(仅)抽象机的可观察行为,如下所述。

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

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

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

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

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    大多数编程语言都是在不阅读标准或语言参考/设计文档(如果存在的话)的情况下学习的。

    标准可以是specified formally - 以一种非常严格的方式,可以在数学上证明是Turing complete

    【讨论】:

      【解决方案3】:

      在不阅读标准的情况下学习 C(以及类似定义的语言,如 C++)是完全正常的。

      标准文档的语言通常被描述为故意迂腐,针对编译器编写者而不是程序员,并且旨在具有权威性而不是易于访问。

      从一步删除的资源中学习该语言要容易得多,例如一本针对程序员的书。当然,作者应该按照标准检查他所描述的内容是否正确。

      有些人声称拥有可用于解决某些问题的标准很有用。除了一些通常没有通过正式标准化系统的免费提供的“语言报告”文档之外,我还没有尝试过(因此可能更易于访问且不那么迂腐)。

      大多数时候,如果您有与标准相关的问题,最好在此处搜索答案(如果失败,请询问)。

      【讨论】:

        【解决方案4】:

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

        这就是我学习 SQL 的方式。我学的是标准的。不好的一面是,每当我使用不同的 DBMS 时,我都必须了解其 SQL 风格的差异。幸运的是,SQL 中最常见的部分似乎到处都是一样的。

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

        一个好的标准并不是一个真正的自然语言文档——它是一个非常正式的文档。您会认为法律只是自然语言文件吗?

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

        是的。嗯...是的,如果你真的想编写任何代码。

        【讨论】: