Design: call_indirectず抜象化

䜜成日 2020幎05月07日  Â·  36コメント  Â·  ゜ヌス: WebAssembly/design

call_indirectは、WebAssemblyにずっお非垞に䟿利な機胜です。 ただし、呜什の効率ず優れた動䜜は、wasmの型システムの単玔さに暗黙のうちに䟝存しおいたす。 特に、すべおのwasm倀には、それが属する静的タむプが1぀だけありたす。 このプロパティは、型付き蚀語での型なし関数呌び出しに関する倚くの既知の問題を䟿利に回避したす。 しかし、wasmが数倀型を超えお拡匵されおいる今、これらの問題を理解し、それらを念頭に眮く必芁があるずころたで来おいたす。

call_indirect基本的に、呌び出し元の予想される眲名を呌び出し先の定矩枈みの眲名ず比范するこずによっお機胜したす。 数倀型だけの堎合、WebAssemblyには、察応するfuncrefによっお参照される関数ぞの盎接呌び出しで型チェックが行われる堎合にのみ、これらのシグネチャが等しいずいうプロパティがありたした。 しかし、すぐに真実ではなくなる2぀の理由がありたす。

  1. サブタむピングでは、実際の関数の定矩されたシグニチャが期埅されるシグニチャの「サブシグニチャ」である限り、盎接呌び出しは機胜したす。぀たり、すべおの入力タむプは関数のパラメヌタタむプのサブタむプであり、すべおの出力タむプは関数のスヌパヌタむプです。結果タむプ。 これは、間接呌び出しの予想される眲名ず関数の定矩された眲名の間の同等性チェックが、完党に安党な倚くの状況でトラップされるこずを意味したす。これは、サブタむプず間接呌び出しを倚甚する蚀語をサポヌトする堎合に問題になる可胜性がありたすサブタむピングの延期。 たた、モゞュヌルが関数の定矩よりも匱い眲名を持぀関数を意図的に゚クスポヌトする堎合、 call_indirectを䜿甚しお、匱いパブリック眲名だけでなく、プラむベヌト定矩の眲名を持぀関数にアクセスできるこずも意味したす発芋されたばかりで、ただ議論されおいない問題。
  2. 型のむンポヌトを䜿甚するず、モゞュヌルはその型の定矩を゚クスポヌトせずに型を゚クスポヌトでき、WASIのようなシステムが倧きく䟝存するこずを蚈画しおいる抜象化を提䟛したす。 この抜象化により、他のモゞュヌルがコンパむル時に特定の定矩に䟝存するのを防ぎたす。 ただし、実行時に、゚クスポヌトされた抜象型は単にその定矩に眮き換えられたす。 これは、たずえば、゚クスポヌトされたシグネチャがその゚クスポヌトされたタむプを参照する゚クスポヌトされた関数でcall_indirectが正しく機胜するようにするために重芁です。 悪意のあるモゞュヌルが知っおいる堎合は、その゚クスポヌトされたタむプの定矩が䜕であるか、圌らが䜿甚するこずができたすcall_indirect理由に゚クスポヌトタむプずその意図ツヌなる秘密の定矩の間で前埌に倉換するために、 call_indirectを䜿甚しお、゚クスポヌトされたタむプによっお抜象化されるこずを意図したシヌクレットにアクセスでき、 call_indirectを䜿甚しお、でキャプチャされおいないセキュリティクリティカルな䞍倉条件に違反する可胜性のある゚クスポヌトされたタむプの倀を停造できたす。タむプ自䜓の定矩。

䞊蚘の䞡方の状況で、 call_indirectを䜿甚しお、モゞュヌルの゚クスポヌトされた眲名の抜象化をバむパスできたす。 私が述べたように、wasmには数倀型しかないため、これたでのずころこれは問題ではありたせんでした。 そしお圓初、サブタむピングを延期するこずで、 call_indirectに関するすべおの懞念も効果的に延期されたず思いたした。 しかし、私が最近気付いたのは、サブタむプを削陀するこずで、「新しい」タむプhttps://github.com/WebAssembly/reference-types/pull/87でexternrefずいう名前が事実䞊代甚であるずいうこずです。抜象型むンポヌトの堎合。 それが実際に人々が望んでいるこずである堎合、残念ながら、 call_indirectず型のむンポヌトの間の䞊蚘の盞互䜜甚を考慮する必芁がありたす。

call_indirectしお䞊蚘の問題に察凊する方法はたくさんありたすが、それぞれにトレヌドオフがあり、蚭蚈スペヌスが倧きすぎおすぐに決定を䞋すこずができたせん。 ですから、私はこの問題を今ここで解決するこずを提案しおいるのではありたせん。 むしろ、珟時点で䞋される決定は、 externrefに関しお問題を適切に解決するための時間を賌入するかどうかです。 特に、今のずころcall_indirectずfunc.refを、関連付けられた眲名が完党に数倀である堎合のタむプチェックのみに制限しおいる堎合は、間接呌び出しのすべおのコアワズナヌスケヌスに察応したす。同時に、䞊蚘の問題に察するすべおの朜圚的な解決策の䜙地を残したす。 ただし、この制限が実甚的であるかどうかは、実装䜜業の芳点からも、人々が埅っおいるexternrefのアプリケヌションを劚げるかどうかの芳点からもわかりたせん。 別の方法は、 call_indirectずfunc.refをそのたたにしおおくこずです。 これは、到達した゜リュヌションによっおは、 externrefがTrue Typeむンポヌトのようにむンスタンス化できない堎合や、 externrefが皮肉なこずにそうでない堎合があるこずを意味しおいる可胜性がありたす。任意のスヌパヌタむプを持぀こずができたすたずえば、最終的にanyrefを远加するこずにした堎合、 anyrefサブタむプになるこずができない可胜性がありたす。

私は、私自身のために蚀えば、䞡方のオプションを管理しやすいず考えおいたす。 私には奜みはありたすが、どちらか䞀方に進むずいう決定を匷く抌し付けおいるわけではありたせん。十分な情報に基づいた決定を䞋すために必芁な情報に、すべおの人がアクセスしやすいず思いたす。 決定が䞋されるこずを党員に知っおもらいたいず同時に、 call_indirect包括的な問題の認識を確立したかったのです。 䞊蚘の芁玄が提䟛するものよりもその問題のより完党な説明が必芁な堎合は、以䞋をお読みください。

call_indirect察抜象化、詳现

call_indirect[ti*->to*](func, args)ずいう衚蚘を䜿甚したす。ここで、 [ti*] -> [to*]は関数の予想される眲名であり、 funcは単なるfuncreffuncrefテヌブルずむンデックスではなくであり、 argsは、関数に枡すto*倀です。 同様に、匕数argsを枡すむンデックス$fooを䜿甚しお関数を盎接呌び出すには、 call($foo, args)を䜿甚したす。

ここで、 $fooが、宣蚀された入力タむプti*ず出力タむプto*を持぀関数のむンデックスであるず仮定したす。 call_indirect[ti*->to*](ref.func($foo), args)はcall($foo, args)ず同等であるず思われるかもしれたせん。 確かに、それは今の堎合です。 しかし、その振る舞いを維持できるかどうかは明らかではありたせん。

call_indirectずサブタむピング

サブタむピングの議論で、朜圚的な問題の1぀の䟋が浮かび䞊がりたした。 次のように仮定したす。

  • tsubはtsuperサブタむプです
  • モゞュヌルむンスタンスIAは、タむプ[] -> [tsub]定矩された関数$fsubを゚クスポヌトしたす。
  • モゞュヌルMBは、タむプ[] -> [tsuper]関数$fsuperをむンポヌトしたす
  • モゞュヌルむンスタンスIBは、IAの$fsubを$fsuperずしおむンスタンス化されたモゞュヌルMBですこれは適切です。珟圚は䞍可胜ですが、この問題は今埌発生する可胜性

ここで、IBがcall_indirect[ -> tsuper](ref.func($fsuper))実行した堎合にどうなるかを考えおみたしょう。 最も劥圓ず思われる2぀の結果は次のずおりです。

  1. 予期されたシグニチャず定矩されたシグニチャに互換性があるため、呌び出しは成功したす。
  2. 2぀のシグニチャが異なるため、コヌルはトラップされたす。

結果1を遞択する堎合、これを可胜にするために2぀の手法のいずれかを採甚する必芁がある可胜性があるこずを認識しおください。

  1. むンポヌトされた関数の堎合、定矩シグニチャではなくむンポヌトシグニチャずcall_indirect比范したす。
  2. 期埅されるシグニチャず定矩シグニチャのサブタむプの互換性に぀いお、少なくずも線圢時間の実行時チェックを実行したす。

テクニック1を奜む堎合は、型付き関数参照バリアントサブタむプを䜿甚を远加するず機胜しないこずに泚意しおください。 ぀たり、 func.ref($fsub)はref ([] -> [tsub])であり、 ref ([] -> [tsuper])でもありたすが、テクニック1ではcall_indirect[ -> super](ref.func($fsub))がトラップされないようにするのに十分ではありたせん。 これは、結果1には、パフォヌマンスぞの圱響に関する手法2が必芁になる可胜性が高いこずを意味したす。

それでは、結果2に぀いおもう少し考えおみたしょう。 ここでの実装手法は、IBのcall_indirectの予想される眲名が、IAの$fsubの定矩の眲名ず等しいかどうかを確認するこずです。 最初、この手法の䞻な欠点は、安党に実行できる倚数の呌び出しをトラップするこずであるように思われるかもしれたせん。 ただし、もう1぀の欠点は、IAのセキュリティリヌクが発生する可胜性があるこずです。

方法を確認するために、䟋を少し切り替えお、むンスタンスIAが内郚で$fsubをタむプ[] -> [tsub]を持぀ように定矩しおいるが、むンスタンスIAはタむプ[] -> [tsuper]のみ゚クスポヌトするずしたす。 結果2の手法を䜿甚するず、むンスタンスIBは悪意を持っお call_indirect[ -> tsub]($fsuper)を実行でき、呌び出しは成功したす。 ぀たり、IBはcall_indirectを䜿甚しお、IAがその関数のシグネチャに察しお行ったナロヌむングを回避できたす。 せいぜい、それはIBがIAの眲名によっお保蚌されおいないIAの偎面に䟝存しおいるこずを意味したす。 最悪の堎合、IBはこれを䜿甚しお、IAが意図的に隠蔜しおいた可胜性のある内郚状態にアクセスできたす。

call_indirectずタむプのむンポヌト

次に、サブタむプを脇に眮いお、型のむンポヌトに぀いお考えおみたしょう。 䟿宜䞊、参照型のむンポヌトだけでなく、型のむンポヌトに぀いおも説明したすが、その詳现は重芁ではありたせん。 ここで実行しおいる䟋では、次のように想定したす。

  • モゞュヌルむンスタンスICはタむプcapabilityを定矩し、タむプを゚クスポヌトしたす$handleずしお゚クスポヌトしたせん。
  • モゞュヌルむンスタンスICは、タむプ[capability] -> []定矩されおいるが、タむプ[$handle] -> []゚クスポヌトされた関数$do_stuffを゚クスポヌトしたす。
  • モゞュヌルMDは、タむプ$externず関数$runをタむプ[$extern] -> []むンポヌトしたす。
  • モゞュヌルむンスタンスIDは、IAの゚クスポヌトされた$handleを$extern 、IAの゚クスポヌトされた$do_stuffを$runずしおむンスタンス化されたモゞュヌルMDです。

この䟋で蚭定されおいるのは2぀のモゞュヌルで、䞀方のモゞュヌルが他方のモゞュヌルの倀を知らない、たたは知るこずを蚱可されおいない状態で凊理を行いたす。 たずえば、このパタヌンは、WASIず察話するための蚈画された基瀎です。

ここで、むンスタンスIDがタむプ$extern倀eを取埗し、 call_indirect[$extern -> ](ref.func($run), e)を実行したずしたす。 最も劥圓ず思われる2぀の結果は次のずおりです。

  1. 予期されたシグニチャず定矩されたシグニチャに互換性があるため、呌び出しは成功したす。
  2. 2぀のシグニチャが異なるため、コヌルはトラップされたす。

結果2は、むンポヌトされたタむプではcall_indirectほずんど圹に立たないものにしたす。 したがっお、結果1の堎合、入力タむプ$externは$do_stuffの定矩枈み入力タむプではないこずに泚意しおください代わりにcapability 。したがっお、次のいずれかを䜿甚する必芁がありたす。このギャップを埋めるための2぀のテクニック

  1. むンポヌトされた関数の堎合、定矩シグニチャではなくむンポヌトシグニチャずcall_indirect比范したす。
  2. 実行時に、むンスタンスIDのタむプ$externがcapability衚すこずを認識しおください。

テクニック1を奜む堎合は、型付き関数参照を远加するず、再び機胜しないこずに泚意しおください。 基本的な理由はサブタむプの堎合ず同じですが、ここでアナログを説明するにはさらに倚くのテキストが必芁になりたす。

それは私たちにテクニック2を残したす。残念ながら、これもたた朜圚的なセキュリティ問題を提瀺したす。 理由を理解するために、IDが悪意があり、ICが秘密にしおいた$handleの内容を取埗したいずしたす。 さらに、IDが$handle実際に䜕を衚しおいるか、぀たりcapabilityに぀いお適切な掚枬をしおいるず仮定したす。 IDは、タむプ[capability] -> [capability]の恒等関数$id_capabilityを定矩できたす。 タむプ$extern倀eが䞎えられるず、IDはcall_indirect[$extern -> capability](ref.func($id_capability), e)実行できたす。 手法2を䜿甚するず、 $externは実行時にcapabilityを衚し、IDはe衚す生のcapabilityを取埗するため、この間接呌び出しは成功したす。 同様に、タむプcapability倀cが䞎えられるず、IDはcall_indirect[capability -> $extern](ref.func($id_capability), c)を実行しお、 cを$externに停造できたす。

結論

うたくいけば、 call_indirectは、パフォヌマンス、セマンティック、セキュリティ/抜象化の重芁な問題がいく぀かあるこずを明らかにしたした。これは、WebAssemblyがこれたで回避できた幞運な問題です。 残念ながら、 call_indirectはコアWebAssemblyの䞀郚であるため、これらの問題は進行䞭の倚くの提案を暪断したす。 珟時点では、私はそれは我々が制限するかどうかを決定する必芁が喫緊のような提案、参照型、に焊点を圓おるのがベストだず思うcall_indirectずをfunc.refのための唯䞀now — call_indirect包括的な問題を最終的に解決する方法によっおは、緩和できる可胜性のある制限。

長い投皿で申し蚳ありたせん。モゞュヌル間のコンパむル時のタむピングず実行時のタむピング機胜の耇雑な盞互䜜甚を説明し、それらの盞互䜜甚の重芁性をできるだけ簡朔に瀺すために最善を尜くしたした。

最も参考になるコメント

䞀方、キャスタブルanyrefを䜿甚しお静的抜象化メカニズムを回避できるこずを瀺したした。

静的型の抜象化は、動的型キャストを䜿甚する蚀語では䞍十分です。 静的抜象化はパラメトリシティに䟝存しおおり、キャストはそれを砎るからです。 それに぀いお新しいこずは䜕もありたせん、それに぀いおの論文が曞かれおいたす。 このような状況では、他の抜象化メカニズムが必芁です。

抜象型の䜿甚を制限するこずによっおそれを回避しようずするず、その目的が無効になりたす。 WASIのナヌスケヌスを考えおみたしょう。 WASIモゞュヌルずそれが゚クスポヌトするタむプがホストによっお実装されおいるかWasmに実装されおいるかは関係ありたせん。 ナヌザヌ定矩の抜象型を任意に制限するず、Wasm実装は䞀般にホスト実装ず互換性がなくなりたす。

  1. call_indirectがサブタむピングを尊重するのに圹立ちたせんすでに明瀺的に蚀っおいるず思いたす

は これはサブタむピングルヌルの䞀郚であるため、定矩䞊も同様です。

  1. call_indirectを䜿甚しお、゚クスポヌトされたシグニチャではなく、定矩されたシグニチャで゚クスポヌトされた関数を䜿甚するこずを劚げたせん。

私はそうは蚀わなかった。 これはcall_indirect自䜓の問題ではなく、キャストのある蚀語に適した型抜象化メカニズムを遞択するこずの問題だず蚀いたした。

䜙談ですが、OCamlたたは同様の蚀語をコンパむルするためにバリアントタむプの導入が必芁になる理由はありたせん。 理論的にはそれがわずかに速い可胜性があるずしおも珟圚の䞖代の゚ンゞンの堎合はそうではない可胜性が高いですが、逆の可胜性が高いです、バリアントタむプは重倧な問題であり、MVPには必芁ありたせん。 時期尚早の耇雑さに察するあなたの欲求を完党には共有しおいたせん。 ;

関数の平等性HaskellやSMLなど、それをサポヌトしおいない蚀語があるため、関数参照から盎接恩恵を受ける可胜性がありたす。 OCamlは構造的な同等性をスロヌし、物理的なものに察しお実装定矩の動䜜を明瀺的に持っおいたす。 それが垞にfalseを返すこずを蚱可するか、関数をスロヌするこずを蚱可するかどうかは開いたたたですが、実際にはどちらでも十分であり、コストのかかる䜙分なラッピングを行う前に調査する䟡倀がありたす。

[メタコメントずしお、講矩を控えめにしお、おそらくこれは有胜な人々のセットがシングルトンではなく、脳の痕跡が以前に時々適甚された䞖界であるずいう考えを怜蚎しおいただければ幞いです。]

党おのコメント36件

この詳现な蚘事をありがずう、ロス 小さな質問がありたす。「 call_indirectずタむプのむンポヌト」セクションに、次のように蚘述したす。

テクニック1を奜む堎合は、型付き関数参照を远加するず、再び機胜しないこずに泚意しおください。

これは、型付き関数参照にバリアントサブタむプを远加した堎合にのみ問題が発生するずいう、前のセクションの譊告の察象にもなりたすか

そうではない。 サブタむプセクションのすべおの問題はタむプむンポヌトから独立しおおり、タむプむンポヌトセクションのすべおの問題はサブタむプから独立しおいたす。 あなたが尋ねおいる特定の問題に関しお、タむプref ([] -> [capability])の倀は、゚クスポヌトされた関数によっおタむプref ([] -> [$handle])倀ずしお返される可胜性があり、それを次のように倉換できるこずを考慮しおください。 funcrefおよび間接的に呌び出されたす。 ゚クスポヌトされた関数ずは異なり、この倀の芖点の倉曎はリンク時ではなく実行時に発生したす。したがっお、関数参照自䜓がむンポヌトされたこずがないため、むンポヌトシグネチャず比范しお解決するこずはできたせん。

module instance IC defines a type capability and exports the type but not its definition as $handle
これはどのように機胜したすか ICがそれを凊理する方法を知るこずができるように、 capabilityず$handleを接続する䜕かが必芁ですか
たた、 https//github.com/WebAssembly/proposal-type-imports/blob/master/proposals/type-imports/Overview.md#exportsに基づいお、むンポヌトされた型は完党に抜象的です。 したがっお、 $capabilityが゚クスポヌトされたずしおも、それは抜象的です。 おそらく私は䜕かを誀解しおいたす。

module instance IC exports a function $do_stuff that was defined with type [capability] -> [] but exported with type [$handle] -> []の゚クスポヌトに関する同様の質問。

これに䜿甚されるある皮のサブタむプ関係を想像するこずができたす。たずえば、 $capability <: $handle堎合、 export $capability as $handleです。 しかし、このセクションの冒頭では、サブタむピングを脇に眮くこずが蚀及されおいたので、私はそれを脇に眮いおいたす...しかし、私はそれに぀いおもう少し考えたした
$capability <: $handle堎合、 export $capability as $handleは可胜ですが、関数は匕数で反倉であるため、 export ([$capability] -> []) as ([$handle] -> [])は「倱敗」するはずです。

タむプ゚クスポヌトでは、モゞュヌルはtype $handle; func $do_stuff_export : [$handle] -> []ように眲名を指定し、次にtype $handle := capability; func $do_stuff_export := $do_stuffように眲名をむンスタンス化したす。 特定の構文は完党に無芖しおください。次に、タむプチェッカヌは「 $handle capabilityがこのモゞュヌルのfunc $do_stuff_export := $do_stuffはこのモゞュヌルで有効ですか」をチェックしたす。 $do_stuffのタむプは[capability] -> []であるため、 $handleをcapabilityでむンスタンス化した埌、その眲名は$do_stuff_export眲名ず正確に䞀臎したす。チェックは成功したす。 ここではサブタむプは含たれず、倉数眮換のみが含たれたす。

ただし、眲名自䜓は$handleに぀いおは䜕も述べおいないこずに泚意しおください。 これは、他のすべおの人が$handleを抜象型ずしお扱うこずになっおいるこずを意味したす。 ぀たり、眲名はモゞュヌルの実装の詳现を意図的に抜象化し、他のすべおの人はその抜象化を尊重するこずになっおいたす。 この問題の目的は、 call_indirectを䜿甚しおその抜象化を回避できるこずを説明するこずです。

うたくいけば、それは問題を少し明確にしたす

おかげで、それは物事を明確にしたす。 サブタむピングセクションに぀いお質問がありたすゞャンプしお申し蚳ありたせん

call_indirect 「定矩眲名ではなくむンポヌト眲名ず比范する」こずにより、IBがcall_indirect[ -> tsuper](ref.func($fsuper))を実行しお成功させるシナリオに埓いたす。

そしお、あなたはそれを远加したした型付き関数参照のために私たちも必芁です

  1. 期埅されるシグニチャず定矩シグニチャのサブタむプの互換性に぀いお、少なくずも線圢時間の実行時チェックを実行したす。

これは「期埅される眲名ずむンポヌト眲名」の間の互換性である必芁がありたすか call_indirectを䜜成したず想定しおいるため、むンポヌト眲名ず期埅される眲名を比范したす。

期埅されるものずむンポヌトされるものの間で互換性がチェックされた堎合、埌でcall_indirect[ -> tsub]($fsuper)は倱敗するはずです。

テクニック1ず2は、その間接的な呌び出しを機胜させるための2぀の盎亀する方法ずしお提䟛されおいたす。 残念ながら、テクニック1は型付き関数参照ず互換性がなく、テクニック2は高すぎる可胜性がありたす。 したがっお、これらはどちらもうたくいかないようです。 したがっお、このセクションの残りの郚分では、これらのどちらも䜿甚せず、期埅される眲名ず定矩された眲名の単玔な同等性の比范に固執した堎合に䜕が起こるかを怜蚎したす。 混乱させお申し蚳ありたせん; 蚈画されたセマンティクスがないずいうこずは、3぀の朜圚的なセマンティクスに぀いお議論する必芁があるこずを意味したす。

あたりにも倚くの結論にゞャンプしないように泚意しおください。 ;

私の仮定では、 call_indirectは今日ず同じ速さを維持する必芁があるため、蚀語にサブタむプをいくら远加しおも、型の同等性テストのみが必芁になりたす。 同時に、ランタむムチェックは静的型システムず䞀貫しおいる必芁がありたす。぀たり、サブタむプの関係を尊重する必芁がありたす。

call_indirect䜿甚できる型が垞にサブタむプ階局のリヌフにあるこずを確認する限り、これらの䞀芋矛盟する芁件は実際にはかなり簡単に調敎できたす。

それを実斜するための確立された方法の1぀は、型システムに_exact_型の抂念を導入するこずです。 正確な型にはサブタむプはなく、スヌパヌタむプのみがあり、 (exact T) <: Tたす。

これにより、 call_indirectのタヌゲットタむプを正確なタむプにする必芁がありたす。 さらに、関数自䜓のタむプは圓然、その関数の正確なタむプです。

モゞュヌルは、意図されたランタむムチェックに成功する関数でのみむンスタンス化できるこずを確認したい堎合は、関数のむンポヌトで正確な型を芁求するこずもできたす。

正芏化された関数型での単玔なポむンタヌ比范の珟圚の実装手法が匕き続き有効であるこずを確認するために必芁なのは、これだけです。 これは、他にどのようなサブタむピングがあるか、たたは関数のサブタむピングをどれほど凝ったものにするかずは無関係です。 FWIW、私はしばらく前にルヌクずこれに぀いお話し合い、PRを䜜成するこずを蚈画したしたが、サブタむピングストヌリヌぞの保留䞭の倉曎、および珟圚どの提案に移行するかでブロックされたした。

1぀の欠点は、関数定矩をサブタむプに絞り蟌むこずは、少なくずもその正確なタむプがどこかで䜿甚されおいる堎合は、䞀般的に䞋䜍互換性のある倉曎ではなくなるこずです。しかし、その欠点は、どのように正確に適甚するかに関係なく、制玄の䞋では避けられたせん。圌ら。

いく぀かの偎面

別の方法は、call_indirectずfunc.refをそのたたにしおおくこずです。

AFAICS、参照型を含む関数でref.funcを犁止するこずは珟実的ではありたせん。 これは、倚くのナヌスケヌス、぀たりexternref動䜜するファヌストクラスの関数コヌルバック、フックなどに関連するすべおのものをひどく損なうこずになりたす。

これは、到達した゜リュヌションによっおは、externrefがTrue Typeむンポヌトのようにむンスタンス化できない堎合や、externrefが皮肉なこずにスヌパヌタむプを持぀こずができない堎合があるこずを意味する可胜性がありたすたずえば、最終的にanyrefを远加するこずにした堎合は、anyrefのサブタむプになるこずができたす。

詳现を教えおいただけたすか 接続が衚瀺されたせん。

あたりにも倚くの結論にゞャンプしないように泚意しおください。 ;

あなたがどのような結論を指しおいるのかわかりたせん。 私が述べた結論は、 call_indirect 、認識しおおく必芁があり、蚈画を開始する必芁のある問題がいく぀かあるずいうこずです。 あなたは解決策を考えおいるので、これらの問題は重芁ではないず瀺唆しおいるようです。 しかし、その解決策はCGによっおレビュヌたたは承認されおいないため、承認されるたで蚈画を立おるべきではありたせん。 解決策の評䟡ず比范には時間がかかり、それらの評䟡ず比范を適切に行う前に決定を䞋す必芁があるため、特に解決策に぀いお話し合わないように芁求したした。 しかし、この問題が解決されたずいう認識を人々が圢成するのを防ぎ、その結果、差し迫った決定を回避するために、私はあなたの解決策に぀いお迅速に議論するために少し時間がかかりたす。

それを実斜するための確立された方法の1぀は、型システムに正確な型の抂念を導入するこずです。

正確なタむプは、確立された゜リュヌションではありたせん。 どちらかずいえば、正確なタむプは、その支持者がただ察凊しようずしおいる問題を確立しおいたす。 興味深いこずに、ここにあなたがしおいる提案は、いく぀かの問題を解決するこずができるか、正確なフォヌムの皮類掻字チヌムもずもずのこぎりスレッドですが、その埌、圌らは最終的に[実珟https://github.com/microsoft/TypeScript/issues/12936 issuecomment-284590083正確なタむプは、解決したよりも倚くの問題を匕き起こしたした。 コンテキストに関する泚意その議論は、実際には理論的な意味で正確なタむプの圢匏ではなく、プレフィックスサブタむプのオブゞェクトアナログを単に蚱可しないFlowの正確なオブゞェクトタむプによっお促されたした。私たちはそのスレッドを再生するこずを想像できたしたここ。

これらの皮類の問題がWebAssemblyでどのように発生するかを瀺す䟋ずしお、サブタむピングを延期しなかったずしたす。 ref.nullタむプexact nullref 、正確なタむプを䜿甚するずexact nullrefはexact anyrefサブタむプではありたせん。 実際、正確な型の通垞のセマンティクスによれば、倀の実行時型が正確にanyrefある可胜性が䜎いため、 exact anyref属する倀はない可胜性がcall_indirectはanyrefの間完党に䜿甚できなくなりたす。

正確なタむプのいく぀かの異なるバヌゞョンを念頭に眮いおいるかもしれたせんが、この異なるバヌゞョンが正確なタむプに関する倚くの未解決の問題に䜕らかの圢で察凊しおいるこずを確認するには時間がかかりたす。 この゜リュヌションを投げるために、それは、これが解決策であるこずは明らかではないこずを認識し、その期埅しお意思決定をしないこずではない、ここで私のポむントはそう。

詳现を教えおいただけたすか 接続が衚瀺されたせん。

あなたは長い文を参照しおいたす。 そのどの郚分に぀いお詳しく説明しおほしいですか 1぀の掚枬では、 call_indirectずタむプのむンポヌトに関する党䜓的な問題を芋逃しおいる可胜性がありたす。 あなたの正確なタむプの提案はサブタむプの問題にのみ察凊したすが、 call_indirectはサブタむプがなくおも問題があるこずを䞊蚘で確立したした。

これは、倚くのナヌスケヌス、぀たりexternref動䜜するファヌストクラスの関数コヌルバック、フックなどに関連するすべおのものをひどく損なうこずになりたす。

ええ、これは私がもっず情報を埗たいず思っおいたものです。 私の理解では、 call_indirectの䞻な䜿甚䟋は、C / C ++関数ポむンタヌずC ++仮想メ゜ッドをサポヌトするこずです。 私の理解では、このナヌスケヌスは珟圚、数倀眲名に制限されおいたす。 call_indirectのより倚くの朜圚的な䜿甚法を知っおいたすが、私が述べたように、䞀時的な制限を提案しおいたので、重芁なのはcall_indirectの珟圚の䜿甚法です。 call_indirectは、単なるfuncrefではなく、テヌブルずむンデックスが必芁であるこずを考えるず、コヌルバックをサポヌトするために特に適切に蚭蚈されおいるようには芋えたせん。 珟圚この目的で䜿甚されおいないためかどうかはわかりたせんでした。

この機胜を察象ずするコヌドベヌスは私よりもはるかによく知っおいるので、この機胜を必芁ずする実際のプログラムを知っおいる堎合は、ここで必芁な䜿甚パタヌンの䟋をいく぀か提䟛するず非垞に圹立ちたす。 この機胜を今すぐサポヌトする必芁があるかどうかを刀断するのに圹立぀だけでなく、機胜が今必芁な堎合、これらの䟋は、䞊蚘の問題に察凊しながら、この機胜を迅速に提䟛する最善の方法を通知するのに圹立ちたす。

@RossTate 

どちらかずいえば、正確なタむプは、その支持者がただ察凊しようずしおいる問題を確立しおいたす。 興味深いこずに、TypeScriptチヌムは、提案しおいるフォヌムの正確なタむプがいく぀かの問題をどのように解決できるかを最初に芋たスレッドですが、最終的に、正確なタむプが解決するよりも倚くの問題を匕き起こすこずに気付きたした。 コンテキストに関する泚意その議論は、実際には理論的な意味で正確なタむプの圢匏ではなく、プレフィックスサブタむプのオブゞェクトアナログを単に蚱可しないFlowの正確なオブゞェクトタむプによっお促されたした。私たちはそのスレッドを再生するこずを想像できたしたここ。

ここでは括匧が重芁です。 そのスレッドで圌らが正確に䜕を考えおいるのかはわかりたせんが、同じこずではないようです。 それ以倖の堎合、「タむプT & Uは垞にTに割り圓お可胜であるず想定されたすが、 Tが正確なタむプである堎合、これは倱敗したす」のようなステヌトメントは意味がありたせんこれは意味がありたせん。 T & Uが無効たたはボトムになるため、倱敗したす。 他の質問は䞻に語甚論に関するものです。぀たり、プログラマヌがオブゞェクトに察しおそれらをどこで䜿甚したいかずいうこずですが、これは私たちの堎合には圓おはたりたせん。

䜎レベルの型システムの堎合、あなた自身の論文のいく぀かでさえ、正確な型は重芁な芁玠ではありたせんでしたか

これらの皮類の問題がWebAssemblyでどのように発生するかを瀺す䟋ずしお、サブタむピングを延期しなかったずしたす。 ref.nullのタむプは、正確なタむプを䜿甚した正確なnullrefになりたす。 ただし、正確なnullrefは、正確なanyrefのサブタむプにはなりたせん。

ここで意芋の盞違はありたせん。 サブタむプを持たないこずが正確なタむプの目的です。

実際、正確な型の通垞のセマンティクスによれば、倀の実行時型が正確にanyrefである可胜性が䜎いため、正確なanyrefに属する倀はない可胜性がありたす。

そうです、anyrefの唯䞀の目的がスヌパヌタむプであるこずを考えるず、 (exact anyref)の組み合わせは有甚なタむプではありたせん。 しかし、なぜそれが問題なのですか

これにより、call_indirectはanyrefに察しお完党に䜿甚できなくなりたす。

あなたは今レベルを混乱させおいないず確信しおいたすか 関数型(exact (func ... -> anyref))は完党に䟿利です。 たずえば、 (func ... -> (ref $T))タむプずは互換性がありたせん。 ぀たり、 exactは、関数型の重芁なサブタむプを防ぎたす。 しかし、それが芁点です

たぶんあなたは(exact (func ... -> anyref))ず(func ... -> exact anyref)たすか これらは無関係なタむプです。

正確なタむプの提案はサブタむプの問題にのみ察凊したすが、call_indirectにはサブタむプがなくおも問題があるこずを䞊蚘で確立したした。

抜象デヌタ型を定矩する手段ずしお、定矩なしで型を゚クスポヌトできるずどういうわけか想定しおいたす。 明らかに、そのアプロヌチは動的型キャストcall_indirectたたはその他の存圚䞋では機胜したせん。 そのため、MLスタむルの型抜象化ではなく、newtypeスタむルの型抜象化が必芁になるず私は蚀い続けおいたす。

私の理解では、call_indirectの䞻な䜿甚䟋は、C / C ++関数ポむンタヌをサポヌトするこずです。

はい。ただし、提案された制限に含めたため、これは私が蚀及したref.funcの唯䞀のナヌスケヌスではありたせんおそらく䞍必芁にそうですか。 特に、タむプチェックを含たないcall_refがありたす。

抜象デヌタ型を定矩する手段ずしお、定矩なしで型を゚クスポヌトできるずどういうわけか想定しおいたす。 明らかに、そのアプロヌチは動的型キャストcall_indirectたたはその他の存圚䞋では機胜したせん。 そのため、MLスタむルの型抜象化ではなく、newtypeスタむルの型抜象化が必芁になるず私は蚀い続けおいたす。

さお、あなたは正確な型がcall_indirectず型のむンポヌトの問題に察凊するために䜕もしないこずに同意しおいるようです。 しかし、実行時のキャストが原因でずにかく問題になるため、その問題に察凊する意味がないずも蚀っおいたす。 この問題を防ぐ簡単な方法がありたす。抜象型に察しお実行時のキャストを実行できないようにしたす抜象型がキャスト可胜であるず明瀺的に指定しおいる堎合を陀く。 結局、䞍透明OPAQUE型なので、キャストに必芁な構造を持っおいるずは思えたせん。 したがっお、正確な型がサブタむピングの問題に察凊する可胜性があるずしおも、問題の残りの半分を無芖するのは時期尚早です。

私が蚀ったように、すべおの゜リュヌションにはトレヌドオフがありたす。 あなたは、あなたの゜リュヌションにはあなた自身が特定したトレヌドオフしかないず掚枬しおいるようであり、CGは他の゜リュヌションよりもあなたの゜リュヌションを奜むず掚枬しおいるようです。 私も、この問題に察する朜圚的な解決策を持っおいたす。 䞀定時間のチェックを保蚌し、仮想マシンですでに䜿甚されおいるテクノロゞヌに基づいおおり、ここでのすべおの問題に察凊し私は信じおいたす、新しいタむプを远加する必芁はなく、実際に既知のアプリケヌションを䜿甚しおWebAssemblyに機胜を远加したす。 しかし、私はそれが私が期埅するように機胜するずは思いたせんし、あなたや他の人がそれを芋る機䌚がなかったので、私はいく぀かの欠点を芋逃しおいたせん。 たた、CGが代替オプションのトレヌドオフよりもトレヌドオフを奜むずは思いたせん。 代わりに、私だけでなくCGがこの分野暪断的なトピックに぀いお十分な情報に基づいた決定を䞋せるように、オプションを分析する時間を䞎えるために䜕ができるかを考えようずしおいたす。

特に、タむプチェックを含たないcall_refがありたす。

あなたの文のキヌワヌドは意志です。 私は、人々がサポヌトしたいず思うでcall_indirectアプリケヌションがあるこずを十分に承知しおいたす。 そしお、私たちはそのサポヌトは、䞊蚘の機胜ずアドレスの問題ずいうデザむンを考え出すこずを期埅しおいたす。 しかし、私が蚀ったように、理想的には、それらの圱響を調査する機䌚を埗る前に、暪断的な圱響を䌎う機胜を迅速に出荷しないように、その蚭蚈を開発する時間がありたす。 だから私の質問は、今その機胜を必芁ずする䞻芁なプログラムがあるかどうかです。 ある堎合は、仮説を立おる必芁はありたせん。 いく぀かを指しお、珟圚この機胜にどのように䟝存しおいるかを説明しおください。

抜象デヌタ型を定矩する手段ずしお、定矩なしで型を゚クスポヌトできるずどういうわけか想定しおいたす。 明らかに、そのアプロヌチは動的型キャストcall_indirectたたはその他の存圚䞋では機胜したせん。 そのため、MLスタむルの型抜象化ではなく、newtypeスタむルの型抜象化が必芁になるず私は蚀い続けおいたす。

これは私には根本的な問題のように思えたす。 ゚クスポヌトされたタむプの定矩の機密性を有効にするこずは、タむプむンポヌト提案の目暙ですか 私は@RossTateはそれが目暙ずすべきず考えおいるこずを、このスレッドから収集し@rossbergは、それが珟圚の目暙ではないず考えおいたす。 ゜リュヌションに぀いお説明する前に、この質問に぀いお話し合い、同意しお、すべおの人が同じ䞀連の仮定から䜜業できるようにしたす。

@RossTate 

さお、あなたは正確な型がcall_indirectず型のむンポヌトの問題に察凊するために䜕もしないこずに同意しおいるようです。

はい、それが抜象デヌタ型を定矩するための機胜を远加する方法の問題を意味する堎合はそうです。 型の抜象化が䞀貫しお機胜する方法はいく぀かありたすが、そのような機胜はさらに先にありたす。

あなたの文のキヌワヌドは意志です。 私は、人々がサポヌトしたいず思うであろう非数倀型のcall_indirectのアプリケヌションがあるこずを十分に承知しおいたす。

call_ref呜什は、関数refの提案に含たれおいるため、いずれにせよ、朜圚的な抜象デヌタ型メカニズムの前にかなり近いものになっおいたす。 それたで保留にするこずを提案しおいたすか

@tlively 

゚クスポヌトされたタむプの定矩の機密性を有効にするこずは、タむプむンポヌト提案の目暙ですか 私は@RossTateはそれが目暙ずすべきず考えおいるこずを、このスレッドから収集し@rossbergは、それが珟圚の目暙ではないず考えおいたす。

これは目暙ですが、抜象デヌタ型メカニズムは別の機胜です。 そしお、そのようなメカニズムは、茞入品の蚭蚈に圱響を䞎えないように蚭蚈されなければなりたせん。 もしそうなら、私たちはそれを非垞に間違っお行うでしょう-抜象化は䜿甚サむトではなく定矩サむトで保蚌されなければなりたせん。 幞いなこずに、これはロケット科孊ではなく、デザむンスペヌスはかなりよく敎備されおいたす。

ありがずう、 @ rossberg 、それは理にかなっおいたす。 型のむンポヌトず゚クスポヌトの埌にフォロヌアップ提案に抜象化プリミティブを远加するこずは私には問題ないように思えたすが、それをどのように行う予定かに぀いおの詳现を近いうちに曞き留めるこずができれば玠晎らしいず思いたす。 型のむンポヌトず゚クスポヌトの蚭蚈は、抜象型のむンポヌトず゚クスポヌトの蚭蚈を制玄しお通知するため、初期蚭蚈を完成させる前に、抜象化が将来どのように機胜するかをよく理解しおおくこずが重芁です。

その蚈画の詳现に加えお、 call_indirectに関するこの問題は、差し迫った決定に圱響を䞎えるこずを瀺しおいるので、抜象型をキャスト可胜にすべきではないずいう私の提案を拒吊しおいるように芋える理由を説明できたすかキャスト可胜に明瀺的に制玄されおいない限り  それらは䞍透明であるため、提案は抜象型の䞀般的な慣行に沿っおいるようです。

@tlively 、はい、同意したした。 それに加えお、私がしばらくの間曞く぀もりだった他のさたざたなこず。 69からのすべおのフォヌルアりトを凊理したら実行したす。 ;

@RossTate 。これは、抜象デヌタ型がキャストず互換性が

@rossbergあなたが考えおいるこの䞭心的なナヌスケヌスが䜕であるかを明確にできたすか あなたの䟋を解釈する䞊での私の最善の掚枬は簡単に解決できたすが、おそらくあなたは䜕か他のものを意味したす。

@RossTate 、ポリモヌフィック関数を怜蚎しおください。 Wasm-genericsを陀いお、anyrefからのアップ/ダりンキャストを䜿甚しおコンパむルする堎合、別のオブゞェクトに䜙分にラップするこずなく、他の抜象型の倀でそれらを䜿甚できるはずです。 通垞、抜象型の倀を他の倀ず同じように凊理できるようにする必芁がありたす。

さお、ポリモヌフィック関数を考えおみたしょう。むンポヌトされた型がHandleあるず仮定したしょう。

  1. Javaにはポリモヌフィック関数がありたす。 そのポリモヌフィック関数は、すべおのJava参照倀がオブゞェクトであるこずを想定しおいたす。 特に、Vテヌブルが必芁です。 Handleを䜿甚するJavaモゞュヌルは、おそらくむンタヌフェヌスを実装するJavaクラスCHandle指定したす。 このクラスのむンスタンスには、タむプHandle wasmレベルのメンバヌず、さたざたなクラスおよびむンタヌフェむスメ゜ッドの実装ぞの関数ポむンタヌを提䟛するvテヌブルがありたす。 衚面レベルのポリモヌフィック関数wasmレベルではオブゞェクトの関数に指定するず、モゞュヌルは他のクラスぞのキャストに䜿甚するのず同じメカニズムを䜿甚しおCHandleにキャストできたす。
  2. OCamlにはポリモヌフィックな機胜がありたす。 そのポリモヌフィック関数は、すべおのOCaml倀が物理的な同等性をサポヌトするこずを期埅しおいたす。 wasmはOCamlの型安党性に぀いお掚論できないため、そのポリモヌフィック関数もキャストを倚甚する必芁がありたす。 特殊な鋳造構造により、これがより効率的になる可胜性がありたす。 これらの理由のいずれかのために、OCamlモゞュヌルは、これらの芏範に適合し、タむプHandle wasmレベルのメンバヌを持぀代数的デヌタ型たたはレコヌド型THandleを指定する可胜性がありたす。 そのポリモヌフィック関数は、他の代数的デヌタ型たたはレコヌド型ず同じように、OCaml倀をTHandleキャストしたす。

蚀い換えるず、モゞュヌルはポリモヌフィック関数などを実装するためにサヌフェスレベルの倀がどのように衚されるかに぀いおの芏範に䟝存しおおり、Handleのような抜象むンポヌト型はこれらの芏範を満たさないため、倀のラップは避けられたせん。 これは、 anyrefの元のアプリケヌションの1぀がむンタヌフェむスタむプに眮き換えられたのず同じ理由です。 たた、ポリモヌフィック関数をサポヌトするためにanyrefが必芁ではなく、適切でもないこずを瀺すケヌススタディを開発したした。

䞀方、キャスト可胜なanyrefを䜿甚しお、静的な抜象化メカニズムを回避できるこずを瀺したした。 あなたがほのめかした抜象化メカニズムの蚈画は、動的な抜象化メカニズムを通じおこの問題にパッチを圓おる詊みです。 しかし、動的な抜象化メカニズムには倚くの問題がありたす。 たずえば、 i31refタむプを抜象的なHandle i31refタむプずしお゚クスポヌトするには、他のモゞュヌルがanyref 、ハンドルを停造するためにキャストするリスクがありたす機胜など。 代わりに、暙準の静的抜象化を保蚌しただけでは䞍芁な远加のフヌプずオヌバヌヘッドを飛び越える必芁がありたす。

たた、私が思うに正確な型をどのように䜿甚する぀もりかがよくわかったので、あなたの意図は、 call_indirectずサブタむプで泚意を喚起した2぀の䞻芁な問題のどちらにも察凊しおいないこずに気付きたした。

  1. call_indirectサブタむピングを尊重するのに圹立ちたせんこれはすでに明瀺的に蚀っおいるず思いたす
  2. call_indirectを䜿甚しお、゚クスポヌトされた眲名ではなく、定矩された眲名で゚クスポヌトされた関数を䜿甚するこずを劚げたせん。

したがっお、これは解決すべき簡単な問題ではありたせん。 そのため、時間の制玄を考えるず、適切に解決するための時間を䞎える方法の評䟡に焊点を圓おたいず思いたす。 anyrefが静的な抜象化を捚おる䟡倀があるかどうかに぀いお、最初に議論する必芁はないず思いたす。 それは、物事をさらに遅らせないために避けたいず思っおいた䞀皮の倧きな議論です。

䞀方、キャスタブルanyrefを䜿甚しお静的抜象化メカニズムを回避できるこずを瀺したした。

静的型の抜象化は、動的型キャストを䜿甚する蚀語では䞍十分です。 静的抜象化はパラメトリシティに䟝存しおおり、キャストはそれを砎るからです。 それに぀いお新しいこずは䜕もありたせん、それに぀いおの論文が曞かれおいたす。 このような状況では、他の抜象化メカニズムが必芁です。

抜象型の䜿甚を制限するこずによっおそれを回避しようずするず、その目的が無効になりたす。 WASIのナヌスケヌスを考えおみたしょう。 WASIモゞュヌルずそれが゚クスポヌトするタむプがホストによっお実装されおいるかWasmに実装されおいるかは関係ありたせん。 ナヌザヌ定矩の抜象型を任意に制限するず、Wasm実装は䞀般にホスト実装ず互換性がなくなりたす。

  1. call_indirectがサブタむピングを尊重するのに圹立ちたせんすでに明瀺的に蚀っおいるず思いたす

は これはサブタむピングルヌルの䞀郚であるため、定矩䞊も同様です。

  1. call_indirectを䜿甚しお、゚クスポヌトされたシグニチャではなく、定矩されたシグニチャで゚クスポヌトされた関数を䜿甚するこずを劚げたせん。

私はそうは蚀わなかった。 これはcall_indirect自䜓の問題ではなく、キャストのある蚀語に適した型抜象化メカニズムを遞択するこずの問題だず蚀いたした。

䜙談ですが、OCamlたたは同様の蚀語をコンパむルするためにバリアントタむプの導入が必芁になる理由はありたせん。 理論的にはそれがわずかに速い可胜性があるずしおも珟圚の䞖代の゚ンゞンの堎合はそうではない可胜性が高いですが、逆の可胜性が高いです、バリアントタむプは重倧な問題であり、MVPには必芁ありたせん。 時期尚早の耇雑さに察するあなたの欲求を完党には共有しおいたせん。 ;

関数の平等性HaskellやSMLなど、それをサポヌトしおいない蚀語があるため、関数参照から盎接恩恵を受ける可胜性がありたす。 OCamlは構造的な同等性をスロヌし、物理的なものに察しお実装定矩の動䜜を明瀺的に持っおいたす。 それが垞にfalseを返すこずを蚱可するか、関数をスロヌするこずを蚱可するかどうかは開いたたたですが、実際にはどちらでも十分であり、コストのかかる䜙分なラッピングを行う前に調査する䟡倀がありたす。

[メタコメントずしお、講矩を控えめにしお、おそらくこれは有胜な人々のセットがシングルトンではなく、脳の痕跡が以前に時々適甚された䞖界であるずいう考えを怜蚎しおいただければ幞いです。]

メタコメントずしお、講矩をトヌンダりンしおいただければ幞いです。

聞いた。

そしおおそらく、これはおそらく有胜な人々のセットがシングルトンではなく、脳の痕跡が以前に時々適甚された䞖界であるずいう考えを考慮したした。

ここでの私のアドバむスは、耇数の専門家ずの協議に基づいおいたす。

静的型の抜象化は、動的型キャストを䜿甚する蚀語では䞍十分です。 静的抜象化はパラメトリシティに䟝存しおおり、キャストはそれを砎るからです。 それに぀いお新しいこずは䜕もありたせん、それに぀いおの論文が曞かれおいたす。 このような状況では、他の抜象化メカニズムが必芁です。

私が盞談したこれらの専門家には、いく぀かの論文の著者が含たれおいたす。

さお、私が圌らのアドバむスを正しく統合したこずを確認する詊みずしお、私はこのトピックに぀いおこれたで議論したこずのない、いく぀かの論文の別の著者に電子メヌルを送りたした。 これが私が尋ねたものです

ポリモヌフィック関数fがあるずしたす。...。 私の型付き蚀語には、包含的サブタむピングず明瀺的なキャストがありたす。 ただし、t1からt2ぞのキャストは、t2がt1のサブタむプであるかどうかをタむプチェックするだけです。 Xのような型倉数には、デフォルトでサブタむプやスヌパヌタむプがないずしたすもちろんそれ自䜓以倖に。 fがXに関しお関係的にパラメトリックであるず思いたすか

これが圌らの反応でした

はい、これはパラメトリックになるず思いたす。これにより埗られる唯䞀の機胜は、すでに関係的にパラメトリックである恒等関数ず同等のキャストをXに曞き蟌むこずです。

これは私のアドバむスず䞀臎しおいたす。 もちろん、これは目前の問題を単玔化したものですが、WebAssemblyに察しおより具䜓的に問題を調査するように努力しおきたした。これたでの調査では、この期埅はWebAssemblyの芏暡でも維持されるこずが瀺唆されおいたす。 call_indirectを陀いお、したがっおこの問題。

参照しおいる定理は、すべおの倀がキャスト可胜な蚀語に適甚されるこずに泚意しおください。 この芳察結果から、キャスタビリティを制限するずいうアむデアが浮かびたした。

WASIのナヌスケヌスを考えおみたしょう。

私はあなたがしおいる䞻匵を理解しおいたせん。 WASIのナヌスケヌスを怜蚎したした。 私たちには、セキュリティ、特に機胜ベヌスのセキュリティの専門家が耇数含たれおいたす。

メタコメントずしお、私の提案を聞くために圓局やCGに蚎える必芁がないこずを本圓に感謝したす。 キャストを制限するこずで、キャストが存圚する堎合でも静的なパラメトリシティを確保できるようになるこずを提案したした。 あなたはすぐにその提案を無芖し、その华䞋を正圓化するために以前の論文に蚎えたした。 しかし、私がそれらの論文の著者にこれず同じ提案をしたずき、圌らは私がしたのず同じ結論にすぐに到達したした。 その前に、私は朜圚的な解決策を評䟡するこずは長いプロセスになるだろうず提案したした。 あなたはその提案を無芖し、あなたはすべおあなた自身で問題を解決したず䞻匵し、私たち䞡方をこの長い䌚話に匕き蟌みたした。 提案がさりげなく繰り返し华䞋されるず、進歩を遂げ、むラむラしないようにするこずは非垞に困難です。 私はここで可胜な解決策ずしおあなたの提案を华䞋しようずしおいるのではないこずを明確にする必芁がありたす。私はそれが唯䞀の解決策ではないこずを実蚌しようずしおいるので、他のさたざたなものず䞀緒に評䟡する必芁がありたす。

この問題で提起された懞念に察凊するための詳现な蚭蚈を明確にし、粟査するこずは重芁でタむムリヌだず思いたす。実際には、抜象型をより遠い機胜ず芋なすべきではないず思いたす。 WASIは今それらを必芁ずしおいたす。

たた、 exact + newtypeが懞念に察凊できるこずを期埅しおいたすが、珟時点では、時期尚早に蚭蚈にコミットするこずによっお、この時点でファヌムに単玔に賭けるこずはできないこずに同意したす。私たちはたもなく参照型を出荷したす。 それに぀いお適切に話し合うには時間が必芁です。

そうは蚀っおも、参照型の提案でcall_indirect眲名にexternrefを蚱可しおも危険はないず思いたす。 はい、モゞュヌルがexternref倀をconstグロヌバルずしおたたは関数から返す...゚クスポヌトする堎合、そのexternrefダりンキャストできるかどうかは明確にされおいたせん。 しかし、 call_indirectはexternrefダりンキャストしおいたせん。 funcrefダりンキャストしおおり、 externrefは、funcref-type-equalityチェックでi32ず同じ圹割を果たしたす。 したがっお、 call_indirectで型のむンポヌト、型の゚クスポヌト、およびサブタむピングが行われおいない堎合、MVPでただコミットしおいない新しいデザむンの遞択にどのようにコミットしおいるかわかりたせん。 。

ハザヌドがない堎合は、この激しい議論を、Type Imports提案適切な抜象型サポヌトを含める必芁があるず私はただ考えおいるのそれほど激しくない議論にダむダルダりンするこずができたすか

もちろん。 ハザヌドがあるかどうかを調べるのは良い考えだず思いたす。

WASIに関しおは、蚭蚈はただ非垞に流動的ですが、ただ実行可胜ず思われる1぀のオプションは、動的メモリ割り圓おを必芁ずしないため、「ハンドル」にi31refようなものを䜿甚するこずです。 WASIは他のオプションを決定するかもしれたせんが、芁点は珟時点では誰も知らないので、今埌そのような決定に圱響を䞎えないように今行われた決定があればよいでしょう。

珟圚、 externrefが利甚可胜な唯䞀の抜象型であるため、WASIベヌスのホストはi31ref たたはWASIの「ハンドル」が䜕であれでexternrefをむンスタンス化したす。 しかし、私の理解では、WASIは、ホストに䟝存するコヌドを枛らすために、その実装を可胜な限りWebAssemblyに移行したいず考えおいたす。 これを容易にするために、ある時点で、WASIシステムはexternref他のタむプのむンポヌトず同じように扱い、WASIの抜象゚クスポヌトされたHandleタむプでむンスタンス化する堎合がありたす。 ただし、 Handleがi31ref堎合、モゞュヌルの境界を越えお機胜できるようにするために必芁な䞊蚘のcall_indirect実装を䜿甚しお、 externrefを介しおハンドルを停造するこずもできたす。

それで、私の質問の1぀は、元の投皿で明確に述べられおいないこずに気づきたしたが、他の抜象型のむンポヌトず同じように、 externrefをむンスタンス化できるようにしたいですか

それで、私の質問の1぀は、元の投皿で明確に述べられおいないこずに気づきたしたが、他の抜象型のむンポヌトず同じように、 externrefをむンスタンス化できるようにしたいですか

この質問を明瀺的に提起しおいただきありがずうございたす。 FWIW、私はexternrefがWebAssemblyモゞュヌル内からむンスタンス化可胜であるこずを理解したこずがありたせん。 これは、WASIがexternrefをハンドルずしお䜿甚したい堎合、仮想化ぞのホストの参加を意味したすが、それは私には問題ないように思えるか、少なくずも分離可胜な議論のようです。

うヌん、はっきりさせおくれないか芋おみたしょう。 あなたはすでに次のようなものをたくさん持っおいるず思いたすが、私にずっおは最初から始めるほうが簡単です。

wasmモゞュヌルの芳点からは、 externrefはホスト参照を意味するものではありたせん。 モゞュヌルが䜕も知らないのは䞍透明OPAQUE型です。 むしろ、それをホスト参照ずしお解釈するのはexternref呚りの芏則です。 䟋えば、䜿甚しおモゞュヌルの芏則externref DOMず察話するためには、関係する機胜には明らかであろうexternrefのように、モゞュヌルの茞入ものをparentNode : [externref] -> [externref]ずchildNode : [externref, i32] -> [externref] 。 ホスト自䜓などのモゞュヌルの環境は、ホスト参照ずしおexternrefの解釈を実際に提䟛するものであり、その解釈を裏付けるむンポヌトされたメ゜ッドの実装を提䟛したす。

ただし、モゞュヌルの環境はホストである必芁はなく、 externrefはホスト参照である必芁はありたせん。 環境は、予想される芏則を瀺すホスト参照のように芋えるいく぀かのタむプの機胜を提䟛する別のモゞュヌルである可胜性がありたす。 モゞュヌルEがモゞュヌルMの環境であり、そのモゞュヌルMが䞊蚘のようにparentNodeずchildNodeをむンポヌトするずしたす。 EがモゞュヌルMを䜿甚したいが、DOMぞのMのアクセスを制限したいずしたす。たずえば、EはMの信頌を制限しおいるため、たたはEはMが持぀可胜性のあるバグを制限したいず考えおおり、Mのニヌズがこれらの制限を超えおはならないこずを知っおいたす。 Eができるこずは、Mのexternrefずしお「MonitoredRef」を䜿甚しおMをむンスタンス化するこずです。 特に、EがM個のDOMノヌドを提䟛したいが、MがDOMツリヌの䞊䜍に移動しないようにしたいずしたす。 その堎合、EのMonitoredRefは具䜓的にはref (struct externref externref)になりたす。ここで、2番目のexternref Eの芳点からはMが操䜜しおいるDOMノヌドですが、最初のexternrefはの祖先です。 Mが通り過ぎるこずを蚱可されおいないそのノヌド。 次に、EはMのparentNodeむンスタンス化しお、これら2぀の参照が同じである堎合に゚ラヌが発生するようにするこずができたす。 E自䜓が独自のparentNodeおよびchildNode関数をむンポヌトし、Eを効果的にDOM盞互䜜甚のランタむムモニタヌにしたす。

うたくいけば、それは適切な絵を描くのに十分具䜓的でしたが、詳现に迷うほど具䜓的ではありたせんでした。 明らかに、このようなパタヌンはたくさんありたす。 ですから、質問を蚀い換える別の方法は、 externrefがホスト参照のみを正確に衚すようにしたいのかずいうこずです。

私にずっお疑わしいず思われる唯䞀の郚分は、「Eができるこずは、Mのexternrefずしお「MonitoredRef」を䜿甚しおMをむンスタンス化するこずです。」です。 抜象化したものを他のモゞュヌルでexternrefずしお衚瀺できるようにする蚈画があるずいう印象はありたせん。 私の理解では、 externrefは抜象化ツヌルではありたせん。

私もそのような蚈画を知りたせん。 誰かがそのオプションを怜蚎したかどうかもわかりたせん。 ぀たり、 externref 、たずえばi32ような「プリミティブ」型にする必芁がありたすか、それずもむンポヌトされた型などの「むンスタンス化可胜な」型にする必芁がありたすか

私の元の投皿では、どちらの方法でも管理できるこずを瀺したした。 「プリミティブ」な解釈を採甚するこずのトレヌドオフは、むンポヌトされたタむプよりもexternref有甚性/構成可胜性が倧幅に䜎いこずです。これは、むンポヌトされたタむプが䞊蚘のパタヌンず同様にexternrefのナヌスケヌスをサポヌトするためです。 そのため、「プリミティブ」 externrefは痕跡的になる可胜性が高く、䞋䜍互換性のためにのみ存圚したす。 しかし、それが特に問題になる可胜性は䜎く、迷惑なだけです。 私が芋るこずができる最倧の問題は、よくbehavednessず同じように、぀たりcall_indirect数倀型には、圌らが䜕のスヌパヌタむプを持っおいないので、のよくbehavednessうたくいくcall_indirect䟝存終わる可胜性がexternrefにもスヌパヌタむプはありたせん。

ああ、そうです、これは理解の違いを説明しおいたす。 externrefはたったく抜象的ではなく、「 externrefを型でむンスタンス化する」ずいう抂念がないこずに@tlivelyに同意したす。これからはかなり自信が持おるず思いたす。  externrefは、明瀺的に宣蚀された型パラメヌタヌずは察照的に、プリミティブ型であるため、モゞュヌルごずにむンスタンス化を詊みる方法さえ明確ではありたせん。

ダりンキャストがない堎合には、この事実はWASIのための蚈画はからの遷移になっおいる理由であるWASIのAPIを仮想化/実装するためのほが圹に立たないwasmを䜜るi32盎接ハンドルタむプ茞入ず、なぜ私が提出するタむプ-茞入を/6 、b / cもう少し必芁です。

externrefは、明瀺的に宣蚀された型パラメヌタヌずは察照的に、プリミティブ型であるため、モゞュヌルごずにむンスタンス化を詊みる方法さえ明確ではありたせん。

タむプむンポヌトを远加するず、タむプむンポヌトなしで、 externrefが先頭にimport type externrefがあるモゞュヌルを扱うこずができたす。 他のプリミティブ型ずは異なり、 externrefはデフォルト倀以倖に関連するプリミティブ操䜜がないため、すべおがたったく同じように型チェックされたす。 しかし、その暗黙的なむンポヌトにより、仮想化、サンドボックス化、実行時監芖などを実行できるようになりたした。

しかし、それを行ったり来たりする前に、私たち党員が䜕かに぀いお同じペヌゞにいるかどうかを刀断するのに圹立぀ず思いたす。 次のステヌトメントに同意するか同意しないか、およびその理由をお知らせください。「タむプむンポヌトが利甚可胜になるず、モゞュヌルはexternrefを䜿甚する理由がなくなり、代わりにタむプむンポヌトを䜿甚するず、より再利甚可胜/構成可胜になりたす。」

次のステヌトメントに同意するか同意しないか、およびその理由をお知らせください。「タむプむンポヌトが利甚可胜になるず、モゞュヌルはexternrefを䜿甚する理由がなくなり、代わりにタむプむンポヌトを䜿甚するず、より再利甚可胜/構成可胜になりたす。」

私は芁玄のこの声明に同意したす。 実際には、externrefは、むンスタンス化時に远加の構成を必芁ずしないため、倖郚JSオブゞェクトを参照するためのWebコンテキストでは匕き続き䞀般的であるず思いたす。 しかし、それは単なる予枬であり、私が間違っおいるこずが刀明し、結局、誰もが型むンポヌトの䜿甚に切り替えおもかたいたせん。 externrefの䟡倀は、型のむンポヌトなどのより豊富なメカニズムよりも早く取埗できるこずです。 externrefをシンプルに保ち、埌でより゚レガントな遞択肢があるずきに、厄介に靎べらを䜿っおより匷力なものにするよりも、䜿甚されなくなるこずを確認したいず思いたす。

@tlively 、

FWIW、私はexternrefがWebAssemblyモゞュヌル内からむンスタンス化可胜であるこずを理解したこずがありたせん。

そうです、externrefは「プリミティブ」タむプの倖郚ポむンタであるずいう考えです。 参照型の実装の詳现を抜象化するには、anyrefや型むンポヌトなどの他の䜕かが必芁になりたす。

@lukewagner 、必芁に

@RossTate 

私が盞談したこれらの専門家には、いく぀かの論文の著者が含たれおいたす。

優秀な。 それから、あなたがより倚くの暩嚁を探しおいる堎合に備えお、あなたは本圓にあなたがこれらの論文のいく぀かの著者であるこずに気づいたず思いたす。 :)

これが私が尋ねたものです

ポリモヌフィック関数f...があるずしたす。 私の型付き蚀語には、包含的サブタむピングず明瀺的なキャストがありたす。 ただし、t1からt2ぞのキャストは、t2がt1のサブタむプであるかどうかをタむプチェックするだけです。 Xのような型倉数には、デフォルトでサブタむプやスヌパヌタむプがないずしたすもちろんそれ自䜓以倖に。 fがXに関しお関係的にパラメトリックであるず思いたすか

はぁ。 その特定の質問にも同じ回答をしたす。 しかし、この質問は、キャストの性質や、プログラミング蚀語にはめったに存圚しない有界ず非有界の定量化のかなり珍しい区別など、いく぀かの特定の仮定を具䜓化しおいたす。 そしお、それは理由があるず思いたす。

「静的型の抜象化が䞍十分である」ず蚀ったずき、それが_技術的に_䞍可胜であるずいう意味ではありたせんでしたがもちろん可胜です、それは_実際的に_適切ではありたせん。 実際には、型の抜象化ずサブタむピング/キャスト可胜性の間たたはパラメトリック型ずノンパラメトリック型の間の分岐は、キャストに基づく構成を人為的に壊しおしたうため、望たしくありたせん。

私はあなたがしおいる䞻匵を理解しおいたせん。

抜象型の倀を受け取った堎合でも、その正確な型を忘れお、たずえば、ある皮の和集合に入れお、埌でダりンキャストによっお回埩したい堎合がありたす。 他の参照型の堎合ず同じ理由で、これを実行するこずをお勧めしたす。 型の抜象化は、同じ皮類の通垞の型で有効な特定の䜿甚パタヌンの邪魔にならないようにする必芁がありたす。

あなたの答えは次のように思われたすそれで、それぞれの䜿甚サむトですべおを補助タむプに、たずえばバリアントにラップしたす。 しかし、それはかなりのラッピング/アンラッピングのオヌバヌヘッドを意味する可胜性があり、より耇雑なタむプのシステム機胜が必芁であり、䜿甚するのがより耇雑です。

これが私たちの意芋の盞違のいく぀かに垰着するず思いたすMVPが参照型の結合をサポヌトするべきかどうか、たたは明瀺的なバリアント型の導入ず゚ンコヌドを必芁ずするかどうか。 良くも悪くも、ナニオンは䞀般的な゚ンゞンのヒヌプむンタヌフェむスに自然に䞀臎し、今日のサポヌトは簡単で安䟡です。 バリアントはそれほど倚くはありたせんが、少なくずも既存の゚ンゞンでは、䜙分なオヌバヌヘッドず予枬䞍可胜なパフォヌマンスを匕き起こす可胜性が高い、はるかに研究的なアプロヌチです。 そしお私は、型システムの人ずしお、ナヌザヌ向け蚀語などの他の状況では、ナニオンよりもバリアントを非垞に奜むず蚀っおいたす。 ;

メタコメントずしお、私の提案を聞くために圓局やCGに蚎える必芁がないこずを本圓に感謝したす。

さたざたな提案に぀いおの䌚話は、明確でないこずに぀いおそれぞれのチャンピオンに尋ねるこずによっお開始された堎合、よりうたくいくかもしれないこずを芪切に提案できたすかこれらの仮定に基づいお答えを出し、幅広い䞻匵や提案をしたすか

優秀な。 それから、あなたがより倚くの暩嚁を探しおいる堎合に備えお、あなたは本圓にあなたがこれらの論文のいく぀かの著者であるこずに気づいたず思いたす。 :)

はい、それは、私の提案がそれらの䞻匵がなされた条件に具䜓的に察凊しおいるこずを知っおいおも、私の提案が機胜しないず䞻匵する論文があるこずを提案するずき、非垞に問題になりたす。

実際には、型の抜象化ずサブタむピング/キャスト可胜性の間たたはパラメトリック型ずノンパラメトリック型の間の分岐は、キャストに基づく構成を人為的に壊しおしたうため、望たしくありたせん。

これは意芋であり、事実ではありたせん私たちが同意しないこずは完党に合理的なこずです。 倚蚀語システムには、蚀語にずらわれない業界タむプのアセンブリ蚀語がないため、実践に぀いお䞻匵するこずは䞍可胜だず思いたす。 これは、培底的な個別の議論に倀するものです。 その議論のために、CGがトレヌドオフを比范できるように、最初にいく぀かの詳现なケヌススタディを提䟛するこずが圹立ちたす。

さたざたな提案に぀いおの䌚話は、具䜓的な根拠や将来の蚈画必ずしも明確ではない、たたはただ曞かれおいないなど、明確でないこずに぀いおそれぞれのチャンピオンに尋ねるこずから始めた方がうたくいくかもしれないこずを芪切に提案できたすかこれらの仮定に基づいお答えを出し、幅広い䞻匵や提案をしたすか

WebAssembly / proposal-type-imports4、WebAssembly / proposal-type-imports6、およびWebAssembly / proposal-type-imports7はそれぞれ、基本的にこの蚈画の詳现を芁求したした。 これらの最埌のものは問題をGCにパントしたすが、WebAssembly / gc86は、珟圚のGC提案が実際には動的抜象化メカニズムをサポヌトしおいないこずを指摘しおいたす。

メタレベルでは、この議論を脇に眮き、目前のトピックに焊点を圓おるよう求められたした。 私の質問に察する@tlivelyの回答は非垞に圹に立ちたした。 私は実際、その質問に぀いお具䜓的にあなたの考えを埗るこずに非垞に興味がありたす。

@RossTate 

私の質問に察する@tlivelyの回答は非垞に圹に立ちたした。 私は実際、その質問に぀いお具䜓的にあなたの考えを埗るこずに非垞に興味がありたす。

フム、私はすでにそれに぀いおコメントしお思った以䞊。 それずも䜕か他のこずを意味したすか

いいえ。 コメントは圌の回答に同意するこずを意味しおいるのではないかず思いたしたが、最初に確認したいず思いたした。 ありがずう

@lukewagner 、あなたはどう思いたすか

externrefは氞久にプリミティブ型であり、型パラメヌタヌずしおさかのがっお再解釈されないこずに同意したす。 それを考えるず、参照型はそのたたでよいず思いたす。

@rossbergを取り䞊げお、Type Imports提案の範囲を拡倧し、wasmが抜象型を実装する機胜をカバヌできるようにしたいず思いたす。 それを突き止めるこずができれば、関数参照ずサブタむプに関するさらなる議論のブロックを解陀できるず思いたす。

玠晎らしい。 次に、私たちはすべお同じペヌゞにいたすそしお、私も、関係するトレヌドオフず決定の根拠の玠晎らしい芁玄を@tlivelyが提䟛するず思いたす。

したがっお、 externrefはむンスタンス化できず、タむプむンポヌトの远加の柔軟性を探しおいるモゞュヌルは、機胜がリリヌスされたずきにタむプむンポヌトに倉換されるこずが期埅されたす。 その移行をスムヌズにするために、むンスタンス化が提䟛されおいない堎合、いく぀かのタむプのむンポヌトがデフォルトでexternrefによっおむンスタンス化されるようにする必芁があるず思いたす。

たた、タむプむンポヌトの範囲を拡倧するずいう申し出も受けたいず思いたす。 型むンポヌトの䞻芁なアプリケヌションの倚くは抜象化を必芁ずするため、抜象化がその提案の䞀郚になるのは自然なこずのように思えたす。

その間、 externrefに関する差し迫った質問に察凊したしたが、 call_indirectに぀いおより䞀般的に䜕をすべきかは、解決方法に぀いおの有益な議論はあるものの、ただ解決されおいたせん。問題は未解決のたたにしおおきたす。

ありがずう

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡