C语言语义规范

时间:2011-03-05 11:18:12

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

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

我学会了C语言而没有阅读单行标准,这是正常的吗?

我想知道标准(即自然语言文档)如何能够描述编程语言而不涉及任何主导实现。

4 个答案:

答案 0 :(得分:7)

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

此外,根据参考实现定义的语言非常少。大多数语言都是相对于某些抽象执行环境定义的。例如,C ++规范说明

  

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

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

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

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

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

希望这有帮助!

答案 1 :(得分:5)

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

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

答案 2 :(得分:3)

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

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

通过一步删除的来源(例如针对程序员的书籍)学习语言要容易得多。当然,作者应该根据标准检查他所描述的内容是否正确。

有些人声称让标准可用来解决一些问题是有用的。我没有尝试过,除了一些免费提供的“语言报告”文档,这些文档通常没有通过正式的标准化系统(因此可能更容易获得,也不那么迂腐)。

大多数情况下,如果你有一个与标准相关的问题,最好在这里搜索答案(如果失败,请问)。

答案 3 :(得分:1)

  

我想知道标准(即自然语言文档)如何能够描述编程语言而不涉及任何主导实现。

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

  

我想知道标准(即自然语言文档)如何能够描述编程语言而不涉及任何主导实现。

一个好的标准并不仅仅是另一种自然语言文件 - 它是一个非常正式的文件。你会认为法律只是一种自然语言文件吗?

  

我学会了C语言而没有读一行标准,这是正常的吗?

是。嗯...是的,如果你真的想要编码任何东西。

相关问题