规范到底是什么?

2022-09-01 11:50:42

我阅读或听到以下句子:

Java Persistence API (JPA) 是一个 Java 应用程序编程接口规范...

JavaServer Faces (JSF) 是一个 Java 规范...

但我不确定我是否理解规范到底是什么。

假设我创建了一个新的规范JMA,Java Math API,它是一个Java数学规范。

我定义我的规范如下就足够了吗:

JMA 必须提供一个将两个整数相加的方法吗?

或者,我是否必须创建一个文档,如下所示:

JMA 必须提供以下方法:int jmaAdd(int x,int y)?

或者,我是否必须创建接口并分发源代码?

public interface JMA{
    int jmaAdd(int x,int y);
}

还是我必须编译接口并将其发布为jar?

另外,规范可以包含抽象类或类吗?还是它必须只由接口组成?

是什么造就了一个规范,一个规范?


答案 1

我定义我的规范如下就足够了吗:

JMA 必须提供一个将两个整数相加的方法吗?

这是一个规范。

它不是一个非常有用的,因为它没有为用户提供该规范的实现的很多保证。如果我想写一个添加两个整数的程序,我不能仅仅通过阅读规范来做到这一点。

不过,它确实给了实现者很大的自由度。通常,您希望您的规范在对用户重要的点上是精确的,但在对实现者重要的点上是模糊的。这样,用户就可以获得编写程序所需的保证,但它也使实现者可以自由地根据自己的特定利基定制他的实现。

例如,Java语言规范没有说任何关于垃圾回收的内容。它仅定义对象何时可访问和何时不可访问,并定义您可以创建新对象。内存分配如何工作,垃圾回收器如何工作,无论是引用计数,跟踪还是基于区域的收集器等,所有这些都被省略了,因此不同利基的不同实现可以使用不同的垃圾回收器实现,并且同一利基的不同实现可以相互竞争。

或者,我是否必须创建一个文档,如下所示:

JMA 必须提供以下方法:int jmaAdd(int x,int y)?

这也是一个规范。它甚至不如上面的有用。它确实定义了方法的名称,但它没有定义它的作用。

int jmaAdd(int x, int y) { return x - y; }

是该规范的完全有效的实现,就像

int jmaAdd(int x, int y) { return 0; }

同样,对用户没有保证,对实现者有太多的回旋余地(或者更确切地说:在错误区域的回旋余地)。

或者,我是否必须创建接口并分发源代码?

public interface JMA{
    int jmaAdd(int x,int y);
}

我不一定会称之为规范。这就是代码,因此是一个实现。

注意:当然,在Java中,s提供了行为规范,然后实现。但这不是术语规范的含义,就像您在问题中使用它的方式一样。interfaceclass

还是我必须编译接口并将其发布为jar?

同样,这是一个实现。

另外,规范可以包含抽象类或类吗?还是它必须只由接口组成?

规范不包含任何内容。这是一张纸。

通常,规范是用英文编写的。好吧,实际上,它们是用专门的规范书写语言编写的,这种语言通常是具有特定语义的高度程式化的英语形式子集。例如,BCP14/RFC2119:在 RFC 中使用的用于指示要求级别的关键字定义了与 IETF 标准文档相关的一些常见英语单词的确切含义。(有趣的是,它也是一个规范,因此使其成为编写规范的规范。

有时也使用形式逻辑,特别是在编程语言规范中描述类型规则。有时,甚至使用专用的形式规范语言,如Z表示法

是什么造就了一个规范,一个规范?

简单而不太令人满意的答案是,如果规范被关心规范的人称为规范,那么它就是规范。(或者更一般地说:作为一个规范来考虑

不同的社区对规范有不同的看法。以及它们的不同名称。

例如,编程语言的原始规范只是简单地发表在科学报告中。然后,经过几轮改进和新报告,他们发布了“算法语言方案修订报告”。之后,“关于算法语言方案的修订报告”。随之而来的开始了一种玩笑,而当前版本的语言是在“关于算法语言方案的修订报告”中定义的,通常写成“关于算法语言方案的修订7修订报告”或简称为“R7RS”。

这些报告都没有被称为“规范”,但每一个都是规范。在Scheme之前,ALGOL也使用“报告”一词,其他几种语言也是如此。

互联网RFC也是一个很好的例子。从技术上讲,RFC的全部内容都是“征求意见”。这些 RFC 中只有极少数实际上被提升到“标准”状态。有些也是“当前最佳实践”。它们都不被称为“规范”,但其中许多都是以这种方式处理的。例如,HTTP不是一个标准,但它既被视为标准又被视为规范,我们新世界经济的重要部分都建立在它之上。

如果你想了解一下规格,最好只是阅读一些:


答案 2

我认为这里的关键思想是“规范不包括实现”。

当 Sun 是 Java 的管理者时,他们会为 Java EE 和 JPA 等功能编写规范,让其他供应商能够按照自己的意愿自由实现。Sun通常会有自己的实现来与之竞争,但他们的目标是销售硬件。鼓励其他供应商提供相互竞争的实现只会进一步实现这一目标。

Sun的规范既不附带代码,也不附带JAR;它们是对代码如何工作的散文描述。


推荐