规范到底是什么?
What exactly is a Specification?
我读到或听到这样的句子:
The Java Persistence API (JPA) is a Java application programming
interface specification...
或
JavaServer Faces (JSF) is a Java specification...
但我不确定我是否理解规范到底是什么..
假设我创建了一个新规范 JMA,Java 数学 API,这是一个 Java 数学规范..
我定义我的规格如下:
JMA must provide a method that adds two integers?
或者,我是否必须创建类似以下内容的文档:
JMA must provide the method: int jmaAdd(int x,int y)?
或者,我是否必须创建接口并分发源代码?
public interface JMA{
int jmaAdd(int x,int y);
}
还是我必须编译接口并将其发布为 jar?
此外,规范是否可以包含摘要 类 或 类?或者它必须只包含接口?
什么是规范,规范?
在 Java-land 这些规范开始于 Java 规范请求 (JSR)。
定义在这里:
https://jcp.org/en/jsr/overview
一旦被接受,这些就是规范。
我认为这里的关键思想是 "specification doesn't include an implementation."
当 Sun 担任 Java 的管家时,他们会为 Java EE 和 JPA 等功能编写规范,让其他供应商可以自由实施。 Sun 通常会有自己的实现来与之竞争,但他们的目标是销售硬件。鼓励其他供应商提供竞争性实施只会进一步实现这一目标。
Sun 的规范既没有代码也没有 JAR;它们是对代码如何工作的散文描述。
如果一个人做 Google search,一个人得到:
spec·i·fi·ca·tion ˌspesəfəˈkāSH(ə)n/ noun noun: specification; plural
noun: specifications
an act of describing or identifying something precisely or of stating a precise requirement.
example: "give a full specification of the job advertised"
(...)
因此这意味着您 描述 某事应该如何工作,而不是为了让它工作必须做什么(这是 实现 )
有形式语言可以指定方法的 pre- 和 postconditions。然后可以使用工具(半)自动验证这些条件的一个子集。
其他形式语言使您能够进行自动化约束编程(例如我的规范解决)。
另一个例子是 CSS:您 指定 您的网页应该是什么样子,关于如何使按钮变成绿色的说明不属于 CSS.
Is it enough that I define my specification as follows:
JMA must provide a method that adds two integers?
这是规格。
它不是很有用,因为它没有为该规范的实现用户提供很多保证。如果我想编写一个将两个整数相加的程序,光靠阅读规范是做不到的。
它 给了 实现者 很大的自由度。通常,您希望您的规范在 用户 重要的点上 精确 ,但 模糊 在对 实现者 重要的点上。这样,用户就可以获得编写程序所需的保证,但它也使实现者可以自由地根据自己的特定利基调整其实现。
例如,Java 语言规范没有提及任何有关垃圾收集的内容。它仅定义对象何时可达和不可达,并且定义您可以创建新对象。内存分配如何工作,垃圾收集器如何工作,无论是引用计数、跟踪还是基于区域的收集器等等,所有这些都被忽略了,因此不同的利基市场的不同实现可以使用不同的垃圾收集器实现, 并且同一细分市场的不同实现可以相互竞争。
or, do I have to create a document something like:
JMA must provide the method: int jmaAdd(int x,int y)?
这也是一种规范。它甚至不如上面那个有用。它确实定义了方法的名称,但没有定义它的作用。
int jmaAdd(int x, int y) { return x - y; }
是该规范的完全有效实现,
int jmaAdd(int x, int y) { return 0; }
同样,对用户没有任何保证,对实施者来说有太多回旋余地(或者更准确地说:在错误领域的回旋余地)。
or, do I have to create the interfaces and distrubute the source code?
public interface JMA{
int jmaAdd(int x,int y);
}
我不一定将其称为规范。那是代码,因此是实现。
注意:当然,在 Java 中,interface
提供 规范 class
然后 的行为实施。但这 不是 术语 规范 您在问题中使用它的方式的含义。
or do I have to compile the interfaces and publish it as jar?
同样,这是一个实现。
Also, can a specification contain abstract classes or classes at all? Or must it consist only of interfaces?
规范不包含任何内容。就是一张纸
通常,规范是用英文编写的。好吧,实际上,它们是用一种专门的规范编写语言编写的,这种语言通常是具有特定语义的高度程式化的英语正式子集。例如,BCP14/RFC2119: Key words for use in RFCs to Indicate Requirement Levels 定义了一些与 IETF 标准文档相关的常用英语单词的精确含义。 (有趣的是,它也是一种规范,从而使它成为编写规范的规范。)
形式逻辑有时也被使用,特别是在编程语言规范中描述类型规则。有时,甚至会使用专门的形式化规范语言,例如 Z Notation.
What makes a specification, a specification?
一个简单但不太令人满意的答案是,如果关心规范的人将规范称为规范,那么规范就是规范。 (或更一般地说:考虑作为规范。)
不同的社区对规范有不同的看法。以及不同的名字。
例如原规范为scheme programming language was simply published in a scientific report. Then after a few rounds of improvements and new reports, they published the "Revised Report on the Algorithmic Language Scheme". And after that the "Revised Revised Report on the Algorithmic Language Scheme". With that began a kind of in-joke, and the current version of the language is defined in the "Revised Revised Revised Revised Revised Revised Revised Report on the Algorithmic Language Scheme", commonly written the "Revised7 Report on the Algorithmic Language Scheme" or just "R7RS".
None 个报告称为 "specification",但每一个报告都是规范。在 Scheme 之前,ALGOL 也使用术语 "Report",其他几种语言也是如此。
Internet RFC 也是一个很好的例子。从技术上讲,所有 RFC 都是 "Request for Comments"。这些 RFC 中只有极少数实际上提升到 "Standards" 状态。有的也是"Best Current Practices"。 None 他们被称为 "Specification",但他们中的许多人被这样对待。例如,HTTP 不是标准,但它既被视为标准又被视为规范,我们新世界经济的重要部分都建立在它之上。
如果您想了解规格,最好阅读一些内容:
- Haskell 2010 Language Report(又如名字"Report")
- Scala Language Specification Version 2.11
- ECMA-262 6th Edition, The ECMAScript 2015 Language Specification
- The Java Language Specification, Java SE 8 Edition
- The Java Virtual Machine Specification, Java SE 8 Edition
- HTTP Specifications,包括但不限于
- The HTML Living Standard (aka HTML5)
我读到或听到这样的句子:
The Java Persistence API (JPA) is a Java application programming interface specification...
或
JavaServer Faces (JSF) is a Java specification...
但我不确定我是否理解规范到底是什么..
假设我创建了一个新规范 JMA,Java 数学 API,这是一个 Java 数学规范..
我定义我的规格如下:
JMA must provide a method that adds two integers?
或者,我是否必须创建类似以下内容的文档:
JMA must provide the method: int jmaAdd(int x,int y)?
或者,我是否必须创建接口并分发源代码?
public interface JMA{
int jmaAdd(int x,int y);
}
还是我必须编译接口并将其发布为 jar?
此外,规范是否可以包含摘要 类 或 类?或者它必须只包含接口?
什么是规范,规范?
在 Java-land 这些规范开始于 Java 规范请求 (JSR)。
定义在这里:
https://jcp.org/en/jsr/overview
一旦被接受,这些就是规范。
我认为这里的关键思想是 "specification doesn't include an implementation."
当 Sun 担任 Java 的管家时,他们会为 Java EE 和 JPA 等功能编写规范,让其他供应商可以自由实施。 Sun 通常会有自己的实现来与之竞争,但他们的目标是销售硬件。鼓励其他供应商提供竞争性实施只会进一步实现这一目标。
Sun 的规范既没有代码也没有 JAR;它们是对代码如何工作的散文描述。
如果一个人做 Google search,一个人得到:
spec·i·fi·ca·tion ˌspesəfəˈkāSH(ə)n/ noun noun: specification; plural noun: specifications
an act of describing or identifying something precisely or of stating a precise requirement.
example: "give a full specification of the job advertised"
(...)
因此这意味着您 描述 某事应该如何工作,而不是为了让它工作必须做什么(这是 实现 )
有形式语言可以指定方法的 pre- 和 postconditions。然后可以使用工具(半)自动验证这些条件的一个子集。
其他形式语言使您能够进行自动化约束编程(例如我的规范解决
另一个例子是 CSS:您 指定 您的网页应该是什么样子,关于如何使按钮变成绿色的说明不属于 CSS.
Is it enough that I define my specification as follows:
JMA must provide a method that adds two integers?
这是规格。
它不是很有用,因为它没有为该规范的实现用户提供很多保证。如果我想编写一个将两个整数相加的程序,光靠阅读规范是做不到的。
它 给了 实现者 很大的自由度。通常,您希望您的规范在 用户 重要的点上 精确 ,但 模糊 在对 实现者 重要的点上。这样,用户就可以获得编写程序所需的保证,但它也使实现者可以自由地根据自己的特定利基调整其实现。
例如,Java 语言规范没有提及任何有关垃圾收集的内容。它仅定义对象何时可达和不可达,并且定义您可以创建新对象。内存分配如何工作,垃圾收集器如何工作,无论是引用计数、跟踪还是基于区域的收集器等等,所有这些都被忽略了,因此不同的利基市场的不同实现可以使用不同的垃圾收集器实现, 并且同一细分市场的不同实现可以相互竞争。
or, do I have to create a document something like:
JMA must provide the method: int jmaAdd(int x,int y)?
这也是一种规范。它甚至不如上面那个有用。它确实定义了方法的名称,但没有定义它的作用。
int jmaAdd(int x, int y) { return x - y; }
是该规范的完全有效实现,
int jmaAdd(int x, int y) { return 0; }
同样,对用户没有任何保证,对实施者来说有太多回旋余地(或者更准确地说:在错误领域的回旋余地)。
or, do I have to create the interfaces and distrubute the source code?
public interface JMA{ int jmaAdd(int x,int y); }
我不一定将其称为规范。那是代码,因此是实现。
注意:当然,在 Java 中,interface
提供 规范 class
然后 的行为实施。但这 不是 术语 规范 您在问题中使用它的方式的含义。
or do I have to compile the interfaces and publish it as jar?
同样,这是一个实现。
Also, can a specification contain abstract classes or classes at all? Or must it consist only of interfaces?
规范不包含任何内容。就是一张纸
通常,规范是用英文编写的。好吧,实际上,它们是用一种专门的规范编写语言编写的,这种语言通常是具有特定语义的高度程式化的英语正式子集。例如,BCP14/RFC2119: Key words for use in RFCs to Indicate Requirement Levels 定义了一些与 IETF 标准文档相关的常用英语单词的精确含义。 (有趣的是,它也是一种规范,从而使它成为编写规范的规范。)
形式逻辑有时也被使用,特别是在编程语言规范中描述类型规则。有时,甚至会使用专门的形式化规范语言,例如 Z Notation.
What makes a specification, a specification?
一个简单但不太令人满意的答案是,如果关心规范的人将规范称为规范,那么规范就是规范。 (或更一般地说:考虑作为规范。)
不同的社区对规范有不同的看法。以及不同的名字。
例如原规范为scheme programming language was simply published in a scientific report. Then after a few rounds of improvements and new reports, they published the "Revised Report on the Algorithmic Language Scheme". And after that the "Revised Revised Report on the Algorithmic Language Scheme". With that began a kind of in-joke, and the current version of the language is defined in the "Revised Revised Revised Revised Revised Revised Revised Report on the Algorithmic Language Scheme", commonly written the "Revised7 Report on the Algorithmic Language Scheme" or just "R7RS".
None 个报告称为 "specification",但每一个报告都是规范。在 Scheme 之前,ALGOL 也使用术语 "Report",其他几种语言也是如此。
Internet RFC 也是一个很好的例子。从技术上讲,所有 RFC 都是 "Request for Comments"。这些 RFC 中只有极少数实际上提升到 "Standards" 状态。有的也是"Best Current Practices"。 None 他们被称为 "Specification",但他们中的许多人被这样对待。例如,HTTP 不是标准,但它既被视为标准又被视为规范,我们新世界经济的重要部分都建立在它之上。
如果您想了解规格,最好阅读一些内容:
- Haskell 2010 Language Report(又如名字"Report")
- Scala Language Specification Version 2.11
- ECMA-262 6th Edition, The ECMAScript 2015 Language Specification
- The Java Language Specification, Java SE 8 Edition
- The Java Virtual Machine Specification, Java SE 8 Edition
- HTTP Specifications,包括但不限于
- The HTML Living Standard (aka HTML5)