Wikipidea 说 Perl 有一个占主导地位的实现,用作其规范的参考,而 C 语言由标准 ANSI ISO 指定。
没读过一行标准就学了C语言,这正常吗……?
我想知道标准(即自然语言文档)如何能够在不参考任何主要实现的情况下描述编程语言。
Wikipidea 说 Perl 有一个占主导地位的实现,用作其规范的参考,而 C 语言由标准 ANSI ISO 指定。
没读过一行标准就学了C语言,这正常吗……?
我想知道标准(即自然语言文档)如何能够在不参考任何主要实现的情况下描述编程语言。
很难找到从规范中学习编程语言的人。该规范主要针对编译器作者(他们需要逐字遵守以保证正确性),并作为语言合法性的最终仲裁者。大多数语言规范都非常密集和技术性很强,并且不是学习语言编程的好方法。通常,只有非常高级的语言用户才会真正阅读规范。
此外,很少有语言是根据参考实现来定义的。大多数语言是相对于一些抽象的执行环境定义的。例如,C++ 规范说
本国际标准中的语义描述定义了一个参数化的非确定性抽象机。本国际标准对一致性实现的结构没有要求。特别是,它们不需要复制或模仿抽象机器的结构。相反,需要符合要求的实现来模拟(仅)抽象机的可观察行为,如下所述。
换句话说,C++ 规范描述了 C++ 程序在纯理论意义上的行为方式。这给规范作者如何定义语言提供了很大的余地。例如,他们可以谈论“对象”和“指针”,而无需说明它们实际上必须如何实现。他们甚至不需要说明 C++ 在其上工作的物理机器是如何工作的,因为他们可以将机器定义为他们想要的行为,然后由实际的编译器编写者将抽象机器翻译到物理机器上。
有些语言是针对虚拟机定义的(Java 就是一个很好的例子)。他们可以通过说明 Java 程序如何与虚拟机交互来讨论 Java 程序相对于该虚拟机的行为,然后将 VM 实现的细节留给 VM 实现者。
其他一些语言,例如 ML,具有纯数学的定义。语言的语义被描述为状态之间的抽象数学转换,这意味着如果语言是相对于参考编译器定义的,则可以证明无法轻易显示的 ML 属性。
总而言之 - 语言规范是很少有程序员真正阅读的复杂文档。它们主要用于编译器作者,通常用一些不考虑机器的抽象术语来定义程序。这样,语言可以以可移植的方式定义,因为您可以通过将正式描述转换为机器操作在任何机器上进行一致的实现。
希望这可以帮助!
在不阅读标准的情况下学习 C(以及类似定义的语言,如 C++)是完全正常的。
标准文档的语言通常被描述为故意迂腐,针对编译器编写者而不是程序员,并且旨在具有权威性而不是可访问性。
从一步删除的资源中学习语言要容易得多,例如一本针对程序员的书。根据标准,作者当然应该检查他所描述的内容是否正确。
一些人声称拥有可用于解决某些问题的标准很有用。除了一些通常没有通过正式标准化系统的免费提供的“语言报告”文档之外,我还没有尝试过(因此可能更容易获得并且不那么迂腐)。
大多数情况下,如果您有与标准相关的问题,最好在此处搜索答案(如果失败,请询问)。
我想知道标准(即自然语言文档)如何能够在不参考任何主要实现的情况下描述编程语言。
这就是我学习 SQL 的方式。我学的是标准的。不好的一面是,每当我使用不同的 DBMS 时,我都必须了解其 SQL 风格的差异。幸运的是,SQL 最常见的部分似乎在任何地方都是相同的。
我想知道标准(即自然语言文档)如何能够在不参考任何主要实现的情况下描述编程语言。
一个好的标准实际上不仅仅是另一个自然语言文档——它是一个非常正式的文档。你会认为法律只是自然语言文件吗?
没读过一行标准就学了C语言,这正常吗……?
是的。嗯......是的,如果你真的想编码任何东西。