算法

アルゴリズム (Web)

[1] Web 関連の仕様書では、プログラムの動作に関する要件の多くや文書の適合性に関する要件の一部はアルゴリズム (algorithm) として記述されています。

仕様書

呼称

[2] 一連の処理をまとめたものの呼称として、「アルゴリズム (algorithm) 」 の他に「steps」も用いられています。両者間に明確な使い分けはないようです。

[35] 「アルゴリズム」も「steps」も、構成する各段階は「step」といいます。

記述

[3] 仕様書上のアルゴリズムの記述方法は、 共通の規定はなく、各仕様書によって若干の違いがあります。

[4] 現在ほとんどの仕様書では、自然言語 (英語) により規定を述べています。

適合性

[8] アルゴリズムとして記述された要件は、必ずしもそのまま実装しなくても構いません。 外部から観測可能な結果が同じである限り、任意の方法で実装して構いません。 >>5

[9] このことは明記されていない仕様書もありますが、 どの仕様書でもそうであると理解されています。 アルゴリズムの形での要件の記述は、それが最も正確な記述方法であるから採用されているだけで、 実装方法を制約する意図はありません。特に、わかりやすさのために性能を度外視していることがあります >>5

[6] RFC 2119 助動詞によって要件を明記するスタイルの仕様書 (HTML Standard など) では、アルゴリズム内の動作は命令形で記述し、 アルゴリズム全体を説明する文の助動詞命令形の各に適用されることとしています >>5

[7] 例えば、

To eat an orange, the user MUST:

  1. Peel the orange.
  2. Separate each slice of the orange.
  3. Eat the orange slices.

... は、

To eat an orange:

  1. The user MUST peel the orange.
  2. The user MUST separate each slice of the orange.
  3. The user MUST eat the orange slices.

... と同じ要件を表しています >>5

フロー制御

[10] アルゴリズムの各段階は「step」と呼ばれます。 step の粒度は仕様書の筆者や個々のアルゴリズムによって様々で一概には言えませんが、 プログラミング言語で一行で書ける単位 (一般的に「1ステップ」とされる粒度) となっていることが多いようです。

[13] step は必要があれば連番によって参照されますが、ジャンプなどで参照される時は名前が付されていることがあります。

  1. Rewind: If there are no entries before entry in the list of active formatting elements, then jump to the step labeled create.

[11] step は入れ子になっていたり、条件分岐となっていたりすることもあります。 step の中の step は「substep」と呼ばれます。

[12] 一連の step は、記述の順に実行されます。すなわち、 連接は先のものから順に実行することを表しています。 ただし、分岐などにより飛ばされることもあります。

[14] ジャンプは「jump to」や「go to」、「return to」などの表現で飛び先の step が指定されます。飛び先は「次のステップ」のような相対的な表現のこともあります。

  1. If node is formatting element, then go to the next step in the overall algorithm.

[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] アルゴリズムの中では「フック」を呼び出すものがあります。これは仕様書の記述上の技法で、 他の仕様書または同じ仕様書の他の場所で定義されたアルゴリズム群の実行のタイミングを明確にしつつも、 それらを別々の箇所で規定するものです。

[24] 例えば DOM Standard要素挿入のアルゴリズムの途中で insertion steps を呼び出します。 HTML Standard はいくつかの HTML要素に関して insertion steps を定義しています。これらにより、例えば script 要素appendChild されるとスクリプトが実行される、 という動作が規定されています。

[25] フックの実行方法は他のアルゴリズムと変わりません。 ただしフックは該当するアルゴリズムが複数存在することがあり、 その場合はいずれをも実行します。該当するアルゴリズムが存在しない時は何も実行しません。

[26] 複数存在しても、それらの実行順序が問題となることはないように規定されているはずです。

並列性

[28] アルゴリズムの一部または全部が並列に実行されることがあります。 その場合は並列に実行される部分を無視した続きを継続して処理するものと、 並列に実行される部分を処理するもので、複数の処理が同時に進行することになります。

詳しくは並列実行を参照。

[29] また並列に実行した処理の後のいくつかの step が同期区間として記されていることがあります。 同期区間安定状態を待ってイベントループ内で実行されるものです。

詳しくは安定状態を参照。

[41] 並列に実行されている他のアルゴリズム停止 (abort) させることがあります。

[42] fetch 関係のアルゴリズムバイブレーションを実施するアルゴリズムは、 自身が別途実行中なら、それを停止させることがあります。

[43] バイブレーションを実施するアルゴリズムは他のアルゴリズムにより停止されることがあります。

[30] I/O に関わる処理のほとんどは並列に実行されることになっています。

[44] 並列でないことを即座に実行するといいます。通常アルゴリズムは別途指定がなければ各段階を即座に順に実行していきますが、 そのことを明確にするために敢えて即座に実行すると指示されることもあります。

[54] 他の処理や、何らかの条件が整うのを待って、次の処理に進むよう指示されている場合もあります。

仕様書仕様書としての正確性や理解の容易性を優先しているので、 そのままの形で実装できる場合もあれば、「待つ」を使わない形に読み替えて実装するのが現実的な場合もあります。

遅延実行

[31] アルゴリズムの一部または全部の実行はキューに入れられて遅延されることがあります。 そのようなキューには次のものがあります。

[33] 安定状態を待って同期区間を実行する手順はマイクロタスクキューに入れられます。

歴史

[36] プロトコルの動作やマーク付け言語の処理の規定などをアルゴリズムの形で記述することは古くから部分的に行われてきましたが、どちらかといえば例外的なものとされることがほとんどでした。 アルゴリズムが提示される場合であっても、規定ではなく参考とされることも多々ありました。

[37] これはアルゴリズムの提示によって実装方法が必要以上に詳細に制限されてしまうのを避ける目的があったり、 アルゴリズムによる手続き的な記述よりも宣言的な記述や構文記述言語等による形式的な記述がより理解しやすい、あるいは政治的に好ましいと考える人が多いことに由来しているようです。 関連する分野で歴史的に使われてきた記述方法を引き継ぐ (例えば同じ BNF方言を用いる) 場合も多々ありました。

[38] しかし、少なくても Web においては、従来の仕様書が曖昧にしていたことが原因で相互運用性に著しい支障をもたらしたことがわかってきたこと、 理解にしやすさに難があったとしてもこれ以上に正確に記述する方法が他にないことなどから、 アルゴリズムによる規定が一般的になってきました。

[40] Web 関連仕様の中では、 ECMAScriptプログラミング言語の仕様書ということもあり、早くからアルゴリズムによる詳細な処理方法の規定を行っていました。

[39] 00年代の中期に Ian Hickson による Web Applications 1.0 (現在の HTML Standard) がHTML構文解析器をはじめとする HTML の処理方法をアルゴリズムの形で正確に規定するようになり、 やがて Web IDLDOMCSSOMFetchCSP など他の仕様書でも同様の形で規定するようになりました。

[45] Re: Writing spec algorithms in ES6? (Joshua Bell 著, 版) <https://lists.w3.org/Archives/Public/public-webapps/2015AprJun/0865.html>

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.

[46] IRC logs: freenode / #whatwg / 20150914 ( 版) <http://krijnhoetmer.nl/irc-logs/whatwg/20150914>

[47] Deprecating old IDL (Marcos Caceres 著, 版) <https://lists.w3.org/Archives/Public/public-script-coord/2015JulSep/0074.html>

specs should be imperative, not declarative. Imperative in that they should define the algorithms/behavior, and not be a collection of statements.

[48] Use . instead of @ for internal slot access ( (domenic著, )) <https://github.com/whatwg/streams/commit/7791c58dbb8ebd470b6e5ecfeb0fa25107a0f638>

[49] Editorial: refactor to depend on the Infra Standard (domenic著, ) <https://github.com/whatwg/html/commit/4ac633e08c2c9430853fc8322943bc2438ed36a3>

[50] Editorial: start using the Infra Standard (annevk著, ) <https://github.com/whatwg/encoding/commit/a26f76889bf393999e9caad84a3647ab09c39e09>

[51] Editorial: make use of the Infra Standard (annevk著, ) <https://github.com/whatwg/dom/commit/bb2890beed2be14d2f7633ec89e2bbb88ec7fdcd>

[52] Define 'continue' and 'break' statements (mikewest著, ) <https://github.com/whatwg/infra/commit/8fbf990dcdb5f7ee80a85b569cba61a056fe1cc5>

[53] Use INFRA. (mikewest著, ) <https://github.com/w3c/webappsec-csp/commit/8a2b0ebd25ea8d0e793ab48a1c51a6d45834fab5>

[55] [css-timing] Add section on serialization (birtles著, ) <https://github.com/w3c/csswg-drafts/commit/6165ee591e0d6eabf18fe7534cc77d81b93ac958>

[56] Editorial: use the Infra Standard for URL's path (annevk著, ) <https://github.com/whatwg/url/commit/2f99502dc12b781f5bf6a062257ba031c7129c1e>

[57] Writing Procedural Specs () <https://garykac.github.io/procspec/>

[58] What was the motive in choosing algorithm description approach? · Issue #82 · whatwg/infra () <https://github.com/whatwg/infra/issues/82>

[59] Say a bit more about iteration (annevk著, ) <https://github.com/whatwg/infra/commit/a21296bd10867f43a6d6b20747e1fb2a3dbb78ec>

[60] Editorial: make Algorithms a top-level section (annevk著, ) <https://github.com/whatwg/infra/commit/c17d8e3963ca78411208b9f0ff21d72553805a99>

[61] Editorial: use Infra's return and continue concepts (annevk著, ) <https://github.com/whatwg/dom/commit/16944b0faef3da894c825d7a154a7bf9a60ea8a4>

[62] Define how "Assert:" works (annevk著, ) <https://github.com/whatwg/infra/commit/6d7612602d60a5a3785a0841265d54550b71707f>

[63] Add a note on performance (annevk著, ) <https://github.com/whatwg/infra/commit/82d933cd1f33a7cb2db7a4801fc7bb4d6aded8a9>

[64] Editorial: remove "rethrow any exception" (annevk著, ) <https://github.com/whatwg/dom/commit/d298c5b7c690fb6a12bb487fd43549c5b46520bc>

[65] Editorial: get rid of substeps (annevk著, ) <https://github.com/whatwg/dom/commit/6253e53af2fbfaa6d25ad09fd54280d8083b2a97>

[66] Add the ability to construct a callback function (domenic著, ) <https://github.com/heycam/webidl/commit/36b3646ac02654626b575ac9891b6e9d75adbfe7>

[67] Add "let" and "set for variables (annevk著, ) <https://github.com/whatwg/infra/commit/f30d4d763df65b7b23781b371c851e258d42ed8f>

[68] Editorial: reduce the amount of times we use "substep" (annevk著, ) <https://github.com/whatwg/html/commit/ca5823dd551d47af0a95202e6c850fad74782b60>

[69] Editorial: format bytes and code points per Infra (annevk著, ) <https://github.com/whatwg/url/commit/91cb2aa532bc2b217e6237d23649aed0d2c566bb>

[70] Editorial: replace usage of repeat with for each (annevk著, ) <https://github.com/whatwg/url/commit/2f4b7f74533398c41f4316157f027a33a627caf9>

[71] Rethrow more exceptions clearly by annevk · Pull Request #422 · whatwg/dom () <https://github.com/whatwg/dom/pull/422>

[72] Editorial: refactor two algorithms to not use labels (annevk著, ) <https://github.com/whatwg/html/commit/aafb92e3d7c588ff968b03a5d726e9704829357a>

[73] Editorial: modernize perform a microtask checkpoint (annevk著, ) <https://github.com/whatwg/html/commit/eb31d93fdf569da9b8529a79c3060868a15fa328>

[74] Editorial: remove substeps as a concept (annevk著, ) <https://github.com/whatwg/encoding/commit/717d435179d6420b66a7e000d5737af1aa460504>

[75] Editorial: check non-null before null (annevk著, ) <https://github.com/whatwg/encoding/commit/4e53e160b9e0ade6e33a25d21580106a0db2c47f>

[76] Editorial: update variable name in removing steps (foolip著, ) <https://github.com/whatwg/fullscreen/commit/c8164afaa1a04b77c9b45f013144c603f3e201bd>

[77] Editorial: use Infra's continue to clarify requestFullscreen() (foolip著, ) <https://github.com/whatwg/fullscreen/commit/946d3ec0b8bb607c2ad4dfb67f17e444f9dc42de>

[78] Editorial: cleanup close a browsing context and prompt to unload (annevk著, ) <https://github.com/whatwg/html/commit/b714a7bc124bf0e8828b2adc2aa0b672d96a1dbd>

[79] Assertions are non-normative (annevk著, ) <https://github.com/whatwg/infra/commit/e88a63efc4663eedc6cb3081002c26935014c25d>

[80] "specification-level data structures and values ..." · Issue #2799 · whatwg/html () <https://github.com/whatwg/html/issues/2799>

[81] Clarify exception catching language (domenic著, ) <https://github.com/whatwg/html/commit/5a2087f95d9be0a3bea2ac2c6a35c70c63782f9a>

[82] Clarify the behavour if the custom element reaction throws any exception · Issue #2842 · whatwg/html () <https://github.com/whatwg/html/issues/2842>

[83] Clarify exception catching language by domenic · Pull Request #2843 · whatwg/html () <https://github.com/whatwg/html/pull/2843>

[84] Allow decimals with no leading 0 as the time in refresh <meta> (domenic著, ) <https://github.com/whatwg/html/commit/b8a34e302cdf0289f5403a02905629bb358519a6>

[85] Editorial: remove "rethrow" per Infra (annevk著, ) <https://github.com/whatwg/fetch/commit/829e56dd47534b8e6725ce0c56c5bdea6e23d222>

[86] Editorial: remove "rethrow" per Infra by annevk · Pull Request #595 · whatwg/fetch () <https://github.com/whatwg/fetch/pull/595>

[87] Clarify some of the ECMAScript conventions applied (domenic著, ) <https://github.com/whatwg/streams/commit/89d32e228eb9428ae6f82793c875b1123febfc92>

[88] Aborting fetch by jakearchibald · Pull Request #523 · whatwg/fetch () <https://github.com/whatwg/fetch/pull/523>

[89] Editorial: refactor classic and module scripts to be more alike (domenic著, ) <https://github.com/whatwg/html/commit/dce999aac4d9deeefa3b338dd2aeb30c17669bc8>

[90] RFC 7692 - Compression Extensions for WebSocket () <https://tools.ietf.org/html/rfc7692#section-2>

[91] Make shared worker creation deterministic (jakearchibald著, ) <https://github.com/whatwg/html/commit/9fda90f44c7c9223de6e3755a043f67ea7c92bf5>

[92] Editorial: reduce "abort these steps" usage (sam0410著, ) <https://github.com/whatwg/html/commit/7ebc44ad58924f1872091c8f8b6fdba1533cfa37>

[93] replace repetitions by sam0410 · Pull Request #3185 · whatwg/html () <https://github.com/whatwg/html/pull/3185>

[94] Remove "abort these steps" wording · Issue #2878 · whatwg/html () <https://github.com/whatwg/html/issues/2878>

[95] Add an example of declaring a variable using a ternary construct (annevk著, ) <https://github.com/whatwg/infra/commit/ad786aed0d5d40af705041fabb35e9901ca7555c>

[96] Ternary-like construct for creating variables · Issue #157 · whatwg/infra () <https://github.com/whatwg/infra/issues/157>

[97] Declare a variable using a ternary construct by annevk · Pull Request #175 · whatwg/infra () <https://github.com/whatwg/infra/pull/175>

[98] Define the term "Assert" for linkability (domenic著, ) <https://github.com/whatwg/infra/commit/5790c85b39264360f37002b6a9ca13401eefa609>

[99] Link asserts? · Issue #163 · whatwg/infra () <https://github.com/whatwg/infra/issues/163>

[100] Define the term "Assert" for linkability by domenic · Pull Request #176 · whatwg/infra () <https://github.com/whatwg/infra/pull/176>

[101] Restrict variables to be declared once per algorithm (annevk著, ) <https://github.com/whatwg/infra/commit/2649c4f308c12fecb5489d636311b462b774d560>

[102] Should we allow variable shadowing? · Issue #141 · whatwg/infra () <https://github.com/whatwg/infra/issues/141>

[103] Restrict variables to be declared once per algorithm by annevk · Pull Request #173 · whatwg/infra () <https://github.com/whatwg/infra/pull/173>

[104] Prohibit using "for each" with stacks and queues (domenic著, ) <https://github.com/whatwg/infra/commit/7d898d01390c7f88ad55f6e91a039f69c3f6a055>

[105] Correct branching in estimate() (annevk著, ) <https://github.com/whatwg/storage/commit/22bc13d4b1d7dbca32155a2a53a24cd8eab59acb>

[106] Editorial: remove the remaining subscript notation for argument lists (… (tobie著, ) <https://github.com/heycam/webidl/commit/5f2b156ff8a2f6e8917b07a3e63d59a8fcacb5ce>

[107] Editorial: remove the remaining subscript notation for argument lists by tobie · Pull Request #508 · heycam/webidl () <https://github.com/heycam/webidl/pull/508>

[108] Editorial: further cleanup "abort these steps" (shreyateeza著, ) <https://github.com/whatwg/html/commit/99e2cdfc484c2ff14cbf5c38b859f4d6da17e64c>

[109] Remove "abort these steps" wording · Issue #2878 · whatwg/html () <https://github.com/whatwg/html/issues/2878>

[110] Replace 'abort these steps' with 'return' by shreyateeza · Pull Request #3303 · whatwg/html () <https://github.com/whatwg/html/pull/3303>

[111] Editorial: less continue after returning (annevk著, ) <https://github.com/whatwg/html/commit/0d097af1acbeabe56a1b0d0c2e2f521eca4defa8>

[112] "Return the new EventSource object, but continue..." · Issue #692 · whatwg/html () <https://github.com/whatwg/html/issues/692>

[113] Editorial: less continue after returning by annevk · Pull Request #3385 · whatwg/html () <https://github.com/whatwg/html/pull/3385>

[114] Editorial: no more "return, but continue" for <input type=file> (annevk著, ) <https://github.com/whatwg/html/commit/b2fc1c1d49ad5701b4bdcf80dcee115c3167005e>

[115] Editorial: no more "return, but continue" for <input type=file> by annevk · Pull Request #3388 · whatwg/html () <https://github.com/whatwg/html/pull/3388>

[116] Editorial: rewrite createImageBitmap() (annevk著, ) <https://github.com/whatwg/html/commit/5b40420b83dad83e5e566de9581dc51e4e4ee6cd>

[117] Editorial: rewrite createImageBitmap() by annevk · Pull Request #3389 · whatwg/html () <https://github.com/whatwg/html/pull/3389>

[118] Editorial: "return, but continue" cleanup for downloads and Worker (annevk著, ) <https://github.com/whatwg/html/commit/0217e1d4cb1ace836f6ef72a402b643aa879fbed>

[119] Editorial: "return, but continue" cleanup for downloads and Worker by annevk · Pull Request #3397 · whatwg/html () <https://github.com/whatwg/html/pull/3397>

[120] [cssom-1] Editorial: Remove or replace "terminate ...". (upsuper著, ) <https://github.com/w3c/csswg-drafts/commit/416b2d025594ac649953a990e32c14ad87b1d488>

[121] [cssom-1] Remove or replace "terminate ..." by upsuper · Pull Request #2299 · w3c/csswg-drafts () <https://github.com/w3c/csswg-drafts/pull/2299>

[122] Editorial: adopt more Infra terminology (annevk著, ) <https://github.com/whatwg/notifications/commit/daf4b50d05209709578b43584a9597b16e3f2c3f>

[123] Editorial: adopt more Infra terminology by annevk · Pull Request #123 · whatwg/notifications () <https://github.com/whatwg/notifications/pull/123>

[124] Definition of propagating exceptions, ? and ! · Issue #164 · whatwg/infra () <https://github.com/whatwg/infra/issues/164>

[125] add recusiveFlag argument to unload by gterzian · Pull Request #3632 · whatwg/html () <https://github.com/whatwg/html/pull/3632>

[126] Add "abort when"/"if aborted" construct for Fetch and elsewhere (annevk著, ) <https://github.com/whatwg/infra/commit/23ce6ea50c541c8ac7edf53ccc908bc4a3f81fef>

[127] Running a set of steps, breaking if a condition is met · Issue #143 · whatwg/infra () <https://github.com/whatwg/infra/issues/143>

[128] Add "Abort when" construct for Fetch and elsewhere by annevk · Pull Request #172 · whatwg/infra () <https://github.com/whatwg/infra/pull/172>

[129] Editorial: remove most substep usage (annevk著, ) <https://github.com/whatwg/fetch/commit/509856c126d739aecf014ba039d98c3fa6dbbd8a>

[130] Editorial: remove most substep usage by annevk · Pull Request #709 · whatwg/fetch () <https://github.com/whatwg/fetch/pull/709>

[131] Use Infra's abort when (annevk著, ) <https://github.com/whatwg/fetch/commit/9f944e1bc90ffb38bd297ebceb9081c5e9c74efa>

[132] Use Infra's abort when by annevk · Pull Request #702 · whatwg/fetch () <https://github.com/whatwg/fetch/pull/702>

[133] Editorial: modernize the style of various document-accepting algorithms (musgravejw著, ) <https://github.com/whatwg/html/commit/8bd6fb3972aab1debd2c562b31617e7d3da2377b>

[134] Various algorithms should take an explicit document argument · Issue #3638 · whatwg/html () <https://github.com/whatwg/html/issues/3638>

[135] Specify that "throw" aborts processing (alvestrand著, ) <https://github.com/w3c/webrtc-pc/commit/1d4b4658e17c6ae622766c9c2775e0ba8f0279cb>

[136] Editorial: Does throwing an error imply aborting the steps? · Issue #1856 · w3c/webrtc-pc () <https://github.com/w3c/webrtc-pc/issues/1856>

[137] Specify that "throw" aborts processing by alvestrand · Pull Request #1880 · w3c/webrtc-pc () <https://github.com/w3c/webrtc-pc/pull/1880>

[138] For-of rather than for-in (jakearchibald著, ) <https://github.com/whatwg/infra/commit/33275d6a68d4bd719192b5adf7dfe1cd52fbecee>

[139] For-of rather than for-in by jakearchibald · Pull Request #205 · whatwg/infra () <https://github.com/whatwg/infra/pull/205>

[140] Add some missing exclamation marks by ricea · Pull Request #935 · whatwg/streams () <https://github.com/whatwg/streams/pull/935>

[141] Don't create { value, done } objects with Object.prototype for intern… (ricea著, ) <https://github.com/whatwg/streams/commit/a27a1fd0f8640d6054e0cbc8b6d7f5464dd096ab>