/
663.txt
332 lines (241 loc) · 18 KB
/
663.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
[1] [[Web]] 関連の[[仕様書]]では、[[プログラム]]の動作に関する要件の多くや[[文書]]の適合性に関する要件の一部は[DFN[[RUBYB[[[アルゴリズム]]]@en[algorithm]]]]として記述されています。
* 仕様書
[REFS[
- [5] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2014-09-19 23:39:59 +09:00]] 版) <https://html.spec.whatwg.org/#conformance-requirements>
]REFS]
* 呼称
[2] 一連の処理をまとめたものの呼称として、「[RUBYB[アルゴリズム]@en[algorithm]]」
の他に「[DFN[steps]]」も用いられています。両者間に明確な使い分けはないようです。
;; [35] 「アルゴリズム」も「steps」も、構成する各段階は「step」といいます。
* 記述
[3] [[仕様書]]上の[[アルゴリズム]]の記述方法は、
共通の規定はなく、各[[仕様書]]によって若干の違いがあります。
[4] 現在ほとんどの[[仕様書]]では、[[自然言語]] ([[英語]])
により規定を述べています。
* 適合性
[8] [[アルゴリズム]]として記述された[[要件]]は、必ずしもそのまま実装しなくても構いません。
外部から観測可能な結果が同じである限り、任意の方法で実装して構いません。 [SRC[>>5]]
;; [9] このことは明記されていない[[仕様書]]もありますが、
どの[[仕様書]]でもそうであると理解されています。
[[アルゴリズム]]の形での要件の記述は、それが最も正確な記述方法であるから採用されているだけで、
実装方法を制約する意図はありません。特に、わかりやすさのために性能を度外視していることがあります
[SRC[>>5]]。
[6] [[RFC 2119]] [[助動詞]]によって[[要件]]を明記するスタイルの[[仕様書]]
([[HTML Standard]] など) では、[[アルゴリズム]]内の動作は[[命令形]]で記述し、
[[アルゴリズム]]全体を説明する文の[[助動詞]]が[[命令形]]の各[[文]]に適用されることとしています
[SRC[>>5]]。
[EG[
[7] 例えば、
>
To eat an orange, the user [['''MUST''']]:
[FIG(steps)[
= Peel the orange.
= Separate each slice of the orange.
= Eat the orange slices.
]FIG]
... は、
>
To eat an orange:
[FIG(steps)[
= The user [['''MUST''']] peel the orange.
= The user [['''MUST''']] separate each slice of the orange.
= The user [['''MUST''']] eat the orange slices.
]FIG]
... と同じ[[要件]]を表しています [SRC[>>5]]。
]EG]
* フロー制御
[10] [[アルゴリズム]]の各段階は「step」と呼ばれます。 step
の粒度は仕様書の筆者や個々のアルゴリズムによって様々で一概には言えませんが、
[[プログラミング言語]]で一行で書ける単位 (一般的に「1ステップ」とされる粒度)
となっていることが多いようです。
[13] step は必要があれば連番によって参照されますが、ジャンプなどで参照される時は名前が付されていることがあります。
[EG[
>
= '''Rewind''': If there are no entries before [VAR[entry]] in the list of active formatting elements, then jump to the step labeled '''create'''.
]EG]
[11] step は入れ子になっていたり、条件分岐となっていたりすることもあります。
step の中の step は「substep」と呼ばれます。
[12] 一連の step は、記述の順に実行されます。すなわち、
[[連接]]は先のものから順に実行することを表しています。
ただし、分岐などにより飛ばされることもあります。
[14] ジャンプは「jump to」や「go to」、「return to」などの表現で飛び先の step
が指定されます。飛び先は「次のステップ」のような相対的な表現のこともあります。
[EG[
>
= If [VAR[node]] is [VAR[formatting element]], then go to the next step in the overall algorithm.
]EG]
[15] 条件分岐は「if」や「unless」などの文章で表現されたり、
変数などの値によって動作が指定されたり ([[switch]]) します。
[16] 反復は「for each」、「while」、「repeat」のような文章で表現されることがあります。
;; [17] [[Ian Hickson]] の仕様書では反復は「if」と「go to」などで表現されることが多いです。
[18] アルゴリズムの停止は、「abort these steps」などの表現により示されます。
ただしアルゴリズムの末端では自明に停止するため明記されないのが普通です。
[19] アルゴリズムは値を返す場合があり、「return」を使った文章で返す値が指定されます。
またアルゴリズムは[[例外]]を投げる場合があり、「throw」を使った文章で記述されます。
[[Ian Hickson]] の仕様書ではこれらの場合でも「abort these steps」
を明記するのが普通ですが (場合によっては更に処理が続くこともあります。)、
仕様書によっては暗示的にアルゴリズムが停止することにしている場合もあるので、
注意が必要です。
[22] アルゴリズムの返すものは常に同じ種類とは限りません。処理の内容によって違う種類 (型)
のものを返すことがあります。また値ではなく「失敗」のような概念を返すことがあります。
[32] [[継続]]については[[イベントループのスピン]]を参照。
* アルゴリズムの呼び出し
[20] アルゴリズムは他のアルゴリズムを呼び出すことがあります
(直接または間接に自身を呼び出すこともあります)。
その場合、元のアルゴリズムは一旦停止し、呼び出したアルゴリズムが返した結果を (あれば)
受け取ってから処理を継続します。呼び出したアルゴリズムが[[例外]]を投げた場合は、
明示的に[[捕獲]]していない限り元のアルゴリズムもそのまま停止すると解釈されています (このことは各[[仕様書]]には必ずしも明記されていませんので、注意が必要です)。
[27] 「[[即座に実行]]」と明記されることがありますが、普通は明記されなくても原則として[[アルゴリズム]]は規定された事象が発生した時点で[[即座]]に実行されます。
[21] 呼び出されたアルゴリズムは呼び出したアルゴリズムの変数にアクセスしないのが普通ですが、
中には呼び出したアルゴリズムの変数にアクセスするものもあります。その場合はその旨が明記されています。
** フック
[23] アルゴリズムの中では「フック」を呼び出すものがあります。これは[[仕様書]]の記述上の技法で、
他の仕様書または同じ仕様書の他の場所で定義されたアルゴリズム群の実行のタイミングを明確にしつつも、
それらを別々の箇所で規定するものです。
[EG[
[24] 例えば [[DOM Standard]] は[[要素]]の[[挿入]]のアルゴリズムの途中で [[insertion steps]]
を呼び出します。 [[HTML Standard]] はいくつかの [[HTML要素]]に関して [[insertion steps]]
を定義しています。これらにより、例えば [CODE(HTMLe)@en[[[script]]]] [[要素]]が
[CODE(DOMm)@en[[[appendChild]]]] されると[[スクリプト]]が実行される、
という動作が規定されています。
]EG]
[25] フックの実行方法は他の[[アルゴリズム]]と変わりません。
ただしフックは該当する[[アルゴリズム]]が複数存在することがあり、
その場合はいずれをも実行します。該当する[[アルゴリズム]]が存在しない時は何も実行しません。
;; [26] 複数存在しても、それらの実行順序が問題となることはないように規定されているはずです。
** 並列性
[28] [[アルゴリズム]]の一部または全部が[[並列]]に実行されることがあります。
その場合は[[並列]]に実行される部分を無視した続きを継続して処理するものと、
[[並列]]に実行される部分を処理するもので、複数の処理が同時に進行することになります。
;; 詳しくは[[並列実行]]を参照。
[29] また[[並列]]に実行した処理の後のいくつかの step が[[同期区間]]として記されていることがあります。
[[同期区間]]は[[安定状態]]を待って[[イベントループ]]内で実行されるものです。
;; 詳しくは[[安定状態]]を参照。
[41] [[並列に]]実行されている他の[[アルゴリズム]]を[RUBYB[停止]@en[abort]]させることがあります。
[EG[
[42] [[fetch]] 関係の[[アルゴリズム]]や[[バイブレーションを実施]]する[[アルゴリズム]]は、
自身が別途実行中なら、それを停止させることがあります。
[43] [[バイブレーションを実施]]する[[アルゴリズム]]は他の[[アルゴリズム]]により停止されることがあります。
]EG]
[30] [[I/O]] に関わる処理のほとんどは[[並列]]に実行されることになっています。
[44] [[並列]]でないことを[[即座]]に実行するといいます。通常[[アルゴリズム]]は別途指定がなければ各段階を[[即座]]に順に実行していきますが、
そのことを明確にするために敢えて[[即座]]に実行すると指示されることもあります。
[54] 他の処理や、何らかの条件が整うのを[[待って][wait]]、次の処理に進むよう指示されている場合もあります。
;; [[仕様書]]は[[仕様書]]としての正確性や理解の容易性を優先しているので、
そのままの形で実装できる場合もあれば、「待つ」を使わない形に読み替えて実装するのが現実的な場合もあります。
** 遅延実行
[31] [[アルゴリズム]]の一部または全部の実行は[[キュー]]に入れられて遅延されることがあります。
そのような[[キュー]]には次のものがあります。
[FIG(short list)[
- [[タスクキュー]]
- [[マイクロタスクキュー]]
- [[大域スクリプト片付けジョブリスト]]
- [[セッション履歴探索キュー]]
- [[pending application cache download process tasks]]
- [[animation frame task]]
]FIG]
;; [33] [[安定状態]]を待って[[同期区間]]を実行する手順は[[マイクロタスクキュー]]に入れられます。
* 歴史
[36] [[プロトコル]]の動作や[[マーク付け言語]]の処理の規定などを[[アルゴリズム]]の形で記述することは古くから部分的に行われてきましたが、どちらかといえば例外的なものとされることがほとんどでした。
[[アルゴリズム]]が提示される場合であっても、[[規定]]ではなく[[参考]]とされることも多々ありました。
[37] これは[[アルゴリズム]]の提示によって実装方法が必要以上に詳細に制限されてしまうのを避ける目的があったり、
[[アルゴリズム]]による[[手続き的]]な記述よりも[[宣言的]]な記述や[[構文記述言語]]等による[[形式的]]な記述がより理解しやすい、あるいは政治的に好ましいと考える人が多いことに由来しているようです。
関連する分野で歴史的に使われてきた記述方法を引き継ぐ (例えば同じ [[BNF]] の[[方言]]を用いる)
場合も多々ありました。
[38] しかし、少なくても [[Web]] においては、従来の仕様書が曖昧にしていたことが原因で[[相互運用性]]に著しい支障をもたらしたことがわかってきたこと、
理解にしやすさに難があったとしてもこれ以上に正確に記述する方法が他にないことなどから、
[[アルゴリズム]]による規定が一般的になってきました。
[40] [[Web]] 関連仕様の中では、 [[ECMAScript]] が[[プログラミング言語]]の仕様書ということもあり、早くから[[アルゴリズム]]による詳細な処理方法の規定を行っていました。
[39] 00年代の中期に [[Ian Hickson]] による [[Web Applications 1.0]] (現在の [[HTML Standard]])
が[[HTML構文解析器]]をはじめとする [[HTML]] の処理方法を[[アルゴリズム]]の形で正確に規定するようになり、
やがて [[Web IDL]]、 [[DOM]]、[[CSSOM]]、[[Fetch]]、[[CSP]] など他の仕様書でも同様の形で規定するようになりました。
[REFS[
- [34] [CITE@en[Add algorithms be implemented in any manner · f765c1a · whatwg/url]] ([TIME[2014-10-23 02:21:07 +09:00]] 版) <https://github.com/whatwg/url/commit/f765c1ad6bf6e339f5ccca0476ea6ef1c1ff51cf>
]REFS]
[FIG(quote)[
[FIGCAPTION[
[45] [CITE@en[Re: Writing spec algorithms in ES6?]]
([[Joshua Bell]] 著, [TIME[2015-06-12 06:25:20 +09:00]] 版)
<https://lists.w3.org/Archives/Public/public-webapps/2015AprJun/0865.html>
]FIGCAPTION]
> I just did a rework of the IDB "v2" editor's draft and probably 90% of the
> spec is basically an additional layer of "bindings" between
> WebIDL/ECMAScript and the the core concepts of the spec. That 90% was
> previously written as blocks of prose rather than imperative algorithms and
> behavior does differ among implementations. Fortunately, that mostly
> applies to edge cases (bad inputs, getters/setters). Maybe it's just IDB,
> but the remaining 10%of the spec is where all the fun
> implementation-specific optimizations happen and is 90% of the actual code,
> it's just short in the spec because it can be described in abstract terms.
]FIG]
[46] [CITE[IRC logs: freenode / #whatwg / 20150914]]
([TIME[2015-09-15 10:58:37 +09:00]] 版)
<http://krijnhoetmer.nl/irc-logs/whatwg/20150914>
[FIG(quote)[
[FIGCAPTION[
[47] [CITE@en[Deprecating old IDL]]
([[Marcos Caceres]] 著, [TIME[2015-09-20 00:55:21 +09:00]] 版)
<https://lists.w3.org/Archives/Public/public-script-coord/2015JulSep/0074.html>
]FIGCAPTION]
> specs should be imperative, not declarative. Imperative in that they should define the algorithms/behavior, and not be a collection of statements.
]FIG]
[48] [CITE@en[Use . instead of @ for internal slot access]]
( ([[domenic]]著, [TIME[2016-06-04 05:44:36 +09:00]]))
<https://github.com/whatwg/streams/commit/7791c58dbb8ebd470b6e5ecfeb0fa25107a0f638>
[49] [CITE@en[Editorial: refactor to depend on the Infra Standard]]
([[domenic]]著, [TIME[2016-11-17 07:29:00 +09:00]])
<https://github.com/whatwg/html/commit/4ac633e08c2c9430853fc8322943bc2438ed36a3>
[50] [CITE@en[Editorial: start using the Infra Standard]]
([[annevk]]著, [TIME[2016-11-18 20:21:54 +09:00]])
<https://github.com/whatwg/encoding/commit/a26f76889bf393999e9caad84a3647ab09c39e09>
[51] [CITE@en[Editorial: make use of the Infra Standard]]
([[annevk]]著, [TIME[2016-11-18 20:06:36 +09:00]])
<https://github.com/whatwg/dom/commit/bb2890beed2be14d2f7633ec89e2bbb88ec7fdcd>
[52] [CITE@en[Define 'continue' and 'break' statements]]
([[mikewest]]著, [TIME[2016-11-22 03:27:37 +09:00]])
<https://github.com/whatwg/infra/commit/8fbf990dcdb5f7ee80a85b569cba61a056fe1cc5>
[53] [CITE@en[Use INFRA.]]
([[mikewest]]著, [TIME[2016-11-30 20:25:40 +09:00]])
<https://github.com/w3c/webappsec-csp/commit/8a2b0ebd25ea8d0e793ab48a1c51a6d45834fab5>
[55] [CITE@en['''['''css-timing''']''' Add section on serialization]]
([[birtles]]著, [TIME[2017-01-19 11:33:26 +09:00]])
<https://github.com/w3c/csswg-drafts/commit/6165ee591e0d6eabf18fe7534cc77d81b93ac958>
[56] [CITE@en[Editorial: use the Infra Standard for URL's path]]
([[annevk]]著, [TIME[2017-02-10 02:32:12 +09:00]])
<https://github.com/whatwg/url/commit/2f99502dc12b781f5bf6a062257ba031c7129c1e>
[57] [CITE[Writing Procedural Specs]]
([TIME[2017-03-01 08:47:36 +09:00]])
<https://garykac.github.io/procspec/>
[58] [CITE@en[What was the motive in choosing algorithm description approach? · Issue #82 · whatwg/infra]]
([TIME[2017-03-22 19:27:09 +09:00]])
<https://github.com/whatwg/infra/issues/82>
[59] [CITE@en[Say a bit more about iteration]]
([[annevk]]著, [TIME[2017-03-23 11:31:47 +09:00]])
<https://github.com/whatwg/infra/commit/a21296bd10867f43a6d6b20747e1fb2a3dbb78ec>
[60] [CITE@en[Editorial: make Algorithms a top-level section]]
([[annevk]]著, [TIME[2017-03-23 20:04:05 +09:00]])
<https://github.com/whatwg/infra/commit/c17d8e3963ca78411208b9f0ff21d72553805a99>
[61] [CITE@en[Editorial: use Infra's return and continue concepts]]
([[annevk]]著, [TIME[2017-03-18 00:56:48 +09:00]])
<https://github.com/whatwg/dom/commit/16944b0faef3da894c825d7a154a7bf9a60ea8a4>
[62] [CITE@en[Define how "Assert:" works]]
([[annevk]]著, [TIME[2017-03-24 15:17:50 +09:00]])
<https://github.com/whatwg/infra/commit/6d7612602d60a5a3785a0841265d54550b71707f>
[63] [CITE@en[Add a note on performance]]
([[annevk]]著, [TIME[2017-03-24 18:50:16 +09:00]])
<https://github.com/whatwg/infra/commit/82d933cd1f33a7cb2db7a4801fc7bb4d6aded8a9>
[64] [CITE@en[Editorial: remove "rethrow any exception"]]
([[annevk]]著, [TIME[2017-03-24 20:27:29 +09:00]])
<https://github.com/whatwg/dom/commit/d298c5b7c690fb6a12bb487fd43549c5b46520bc>
[65] [CITE@en[Editorial: get rid of substeps]]
([[annevk]]著, [TIME[2017-03-24 20:54:32 +09:00]])
<https://github.com/whatwg/dom/commit/6253e53af2fbfaa6d25ad09fd54280d8083b2a97>
[66] [CITE@en[Add the ability to construct a callback function]]
([[domenic]]著, [TIME[2017-03-27 13:42:03 +09:00]])
<https://github.com/heycam/webidl/commit/36b3646ac02654626b575ac9891b6e9d75adbfe7>
[67] [CITE@en[Add "let" and "set for variables]]
([[annevk]]著, [TIME[2017-03-27 17:02:19 +09:00]])
<https://github.com/whatwg/infra/commit/f30d4d763df65b7b23781b371c851e258d42ed8f>
[68] [CITE@en[Editorial: reduce the amount of times we use "substep"]]
([[annevk]]著, [TIME[2017-03-27 23:29:59 +09:00]])
<https://github.com/whatwg/html/commit/ca5823dd551d47af0a95202e6c850fad74782b60>