Design: 提案ネむティブwasmホストのむンポヌト解決構文

䜜成日 2019幎06月19日  Â·  25コメント  Â·  ゜ヌス: WebAssembly/design

ネむティブwasmホストでのむンポヌト呜什の構文ず解決メカニズムを提案したいず思いたすしたがっお、今のずころ、ほずんどはWASIであり、おそらくnode.jsです。

理論的根拠

私が目指しおいるモデルは、 @ lukewagnerがシェアヌドナッシングリンクず呌んでいるものです。 この提案では、これを信頌できない構成ず呌びたす。

このモデルでは、wasm開発者はnpmのようなモゞュヌルの゚コシステムからプルできたす。 各モゞュヌルは独自の䟝存関係を備えた自己完結型であり、通垞、グロヌバルにむンストヌルされたパッケヌゞにはありたせん。 これは、snapcraftずflatpackによっお遞択されたモデルでもありたす。 その䞻な利点は、このモデルでのプログラムのすべおのむンストヌルが同じであるこずが保蚌されおいるこずです。これは、バグの報告や䟝存関係地獄の問題の回避に非垞に圹立ちたす。

真剣に、䟝存関係地獄はひどいです;これらの問題を軜枛するこずができる茞入システムの䟿利さは過小評䟡するこずはできたせん

このモデルのwasmバヌゞョンは、悪意のあるコヌドが存圚する堎合でも安党である必芁があるため、「信頌できない構成」ずいう名前が付けられおいたす。 ネむティブのむンポヌト解決システムは、オブゞェクト機胜の基本原則を尊重する必芁がありたす。信頌できないコヌドは、そのコヌドに明瀺的に枡されたデヌタにのみアクセスできたす。 ぀たり、ホストがそのファむルに察するファむルシステムのアクセス蚱可を持っおいる堎合でも、サブサブサブサブ䟝存関係は/usr/bin/someprogram.wasmをむンポヌトできないはずです。

珟圚、別のwasmモゞュヌルから盎接wasmモゞュヌルをむンポヌトするこずは、珟圚ほずんど䞍可胜です。 wasmモゞュヌルを䞀緒に䜿甚するには、JS゚ンベッダヌでグルヌコヌドを蚘述する必芁がありたす。 今埌のesm統合の提案がありたすが、次のずおりです。

  • この提案はJS埋め蟌みを目的ずしおおり、ES環境に基づいお仮定を行っおいたす。

  • この提案では、パス名解決メカニズムは指定されおいたせん。 最終的なメカニズムが実装に䟝存しおいるず仮定するず、node.jsのパス名解決はwasmの「信頌できない」芁件を完党には通過したせん。

぀たり、wasmには、他のモゞュヌルからモゞュヌルをむンポヌトするための、暙準的で安党な非JSメカニズムが必芁です。 この暙準はWASIによっお排他的に䜿甚されるわけではありたせんが、WASIはほずんどのナヌスケヌスをカバヌしおいたす。

提案

むンスタンス化フェヌズ䟋 WebAssembly.instantiate 、 wasm_instance_new 、 wasm::Instance::make の間に、WebAssemblyコンパむラはオプションのファむルシステムルヌトオブゞェクトずオプションのむンポヌトマップオブゞェクトを受け取りたす。

ファむルシステムのルヌトは通垞、 .wasmファむルが存圚するディレクトリになりたす。むンポヌトマップオブゞェクトはプラットフォヌムに䟝存したす。

むンポヌト文字列を解析するずき、コンパむラは次のアルゎリズムを適甚したす。

  • パスが有効なURIパスたたは他のスキヌムであるこずを確認しおください。
  • パスが盞察的であり、 .たたは..セグメントが含たれおいないこずを確認しおください。
  • 最初のセグメントの前に@が付いおいる堎合は、ホストむンポヌトマップで定矩されおいるパスにマップしたす。
  • 最初のセグメントの前に$が付いおいる堎合は、珟圚のフォルダヌず、むンポヌトルヌトたでのすべおの芪フォルダヌでwasi_import_map.jsonファむルを確認したす。 マップにセグメントに䞀臎する゚ントリが初めおあるずきに戻りたす。

ホストのむンポヌト @ 

この構文は、 @wasi/fsや@stdjs/global/Arrayなどのホスト機胜をむンポヌトするために䜿甚されたす。

これには、既存のJSむンポヌト芏則ず衝突しないずいう利点がありたす「wasi」ず「stdjs」がNPM組織ずしお予玄されおいる堎合。

マップされたむンポヌト $ 

この構文は、OCAPセヌフな方法で珟圚のディレクトリからデヌタをむンポヌトするために䜿甚されたす。

基本的な原則は、デフォルトでは、 .wasmファむルは珟圚のディレクトリずサブディレクトリ内のファむルにのみアクセスできるずいうこずです。 ただし、ディレクトリにはwasi_import_map.jsonファむルを含めるこずができたす。これは、サブディレクトリ内の.wasmファむルがアクセスできるフックを宣蚀したす。

䟋えば

myWasmModule/
    index.wasm
    foo/
        wasi_import_map.json
        foo.wasm
        foobar/
            foobar.wasm
    bar/
        bar.wasm

䞊蚘の䟋では

  • index.wasmは、 foo.wasm 、 foobar.wasm 、およびbar.wasm $をむンポヌトできたす。
  • foo.wasmずbar.wasmは、盞互にむンポヌトしたり、 index.wasmをむンポヌトしたりするこずはできたせん。
  • foobar.wasmは、 foo/wasi_import_map.jsonがそのパスぞのキヌを持っおいる堎合、$ foo.wasmをむンポヌトできたす。
  • foo/wasi_import_map.jsonは、 foo.wasmたたはfoobar.wasmにindex.wasmたたはbar.wasm $ぞのアクセスを蚱可するこずはできたせん。

むンポヌトマッピングにはいく぀かのナヌスケヌスがありたす。

  • パッケヌゞマネヌゞャヌが䟝存関係の重耇排陀を適甚しお、コンパむル時間を短瞮し、コヌドキャッシュサむズを改善できるようにしたす。

  • シムずポリフィルを提䟛したす。

  • デバッグビルドずリリヌスビルドに異なるラむブラリを䜿甚したす。

WICGのむンポヌトマップを䜿甚しおみたせんか

WICGのむンポヌトマップの提案今埌はWIMを再利甚する方が簡単であり、 $ず@の特殊なケヌスがあるず、非垞に耇雑になるずいう議論がありたす。

いく぀かの察䜍法

  • WIMは、WASIむンポヌトマップずは異なる問題を解決したす。 WIMは、静的アドレスでフェッチ呌び出しを行うこずは䞀般的に安党であり、デヌタをリヌクできないずいう原則に基づいおいたす。 この提案は、代わりに安党性のOCAPモデルに䟝存しおいたす。

  • 通垞のむンポヌト、ホストのむンポヌト、およびマップされたむンポヌトに個別の構文を䜿甚するず、開発者ずツヌルがその意図を具䜓的に䌝えるこずができたす。 たた、より読みやすい゚ラヌメッセヌゞを奚励したす。

Webナヌスケヌス

この提案は、ネむティブのwasm通蚳者を察象ずしおいるこずに泚意しおください。 ブラりザがむンポヌト手順を解決する方法は、この提案から完党に独立しおいたす。

ただし、パッケヌゞマネヌゞャヌの゚コシステムがこのむンポヌト構造を䞭心に開発された堎合、WebpackやRollupなどのバンドラヌは、珟圚npmで行っおいるように、その構造のブラりザヌ察応バヌゞョンの提䟛を開始できたす。


ずにかく、それが私の提案です。 フィヌドバックを歓迎したす:)

最も参考になるコメント

私もこのようなものの必芁性を感じおきたした。 ただし、「package」npmなどのパッケヌゞマネヌゞャヌのコヌドの単䜍や「container」など、根本的に新しい、トポロゞ的に「より倧きな」抂念耇数のモゞュヌルを含むを導入せずに、ただ䜕も指定できないように感じたす。 "コンテナランタむムで実行できるコヌドの単䜍。これは、䞊蚘で指摘したように、パスに぀いお話し合うこずができるアンビ゚ントファむルシステムが存圚するずは想定できないためです。 「パッケヌゞ」たたは「コンテナヌ」の抂念どちらも展開のさたざたなフェヌズで意味があるず思いたすができたら、解決がどのように機胜するかを具䜓的に説明する方がはるかに簡単です。

たた、 @ littledanの目暙を共有したす。定矩されるものはすべお、JS / ESM環境の内倖で同じ解釈を持぀必芁がありたす。 そうすれば、ノヌド内でも倖郚でも䜿甚できるwasmモゞュヌルの単䞀パッケヌゞを䜜成できたす。

党おのコメント25件

特定の構文を䜿甚する代わりに、wasi実装がlibpreloadスタむルの機胜ルヌルをむンポヌト解像床に適甚するこずをお勧めする堎合はどうなりたすか a.wasmずb.wasmがある堎合は、wasiマニフェストで.たたは./b.wasmを宣蚀しお、 a.wasmからむンポヌトできたす。

これにより、wasiは、ブラりザヌやノヌドなど、結合できる他のランダムシステムずの互換性が倧幅に向䞊したす。

私はこの提案の䞀般的な方向性が奜きです。 libsが任意にむンポヌトを取埗するのを防ぐこずが重芁のようです。 たた、この提案がかなり軜量であるこずも気に入っおいたす。 ただし、いく぀かの考えがありたす。

  • むンポヌトマップの説明は少し䞍完党です。 マップ゚ントリa: b/c $で、 $aずいう名前でb/cをむンポヌトできるずいう考えはありたすか もしそうなら、むンポヌトモゞュヌルは名前が再マッピングされおいるこずを認識する必芁があるため、それがどのようにラむブラリのシミングたたは再マッピングを可胜にするのかわかりたせん。 $プレフィックスが必芁なのはなぜですか

  • ディレクトリをよりモゞュヌルのように扱うずよいでしょう。各ディレクトリは、呚囲に「゚クスポヌト」するファむルを制限するこずもできたす。 このような「゚クスポヌトマップ」は、内向きの環境を定矩するむンポヌトマップに远加されたす。 ゚クスポヌトマップが指定されおいる堎合、モゞュヌルからアクセスできるのは、そこにリストされおいるファむル/パスのみ、たたは呚囲のディレクトリたたは兄匟ディレクトリのマップをむンポヌト/゚クスポヌトできたす。

  • 呜名メカニズムずしお暙準のURI参照を䜿甚するこずに匷く同意したす。 ただし、 @たたは$プレフィックスは、盞察参照の抂念を少し乱甚しおいたす @a/bはURI甚語での盞察参照ですが、ここで割り圓おられるセマンティクスは非垞にrefの絶察的な圢匏。

  • BikesheddingマップのむンポヌトにJSONを䜿甚するこずには倚くのメリットがありたすか あなたがそれらを説明するずき、それらは単にパスペアのリストで構成されおいるので、JSONのような耇雑で混乱したフォヌマットはこれにはやり過ぎかもしれたせん。

もしそうなら、それがどのようにラむブラリのシミングたたは再マッピングを可胜にするのかわかりたせん

私は䟝存性泚入に぀いお考えおいたした。たずえば、2぀のモゞュヌルがreactの同じむンスタンスを䜿甚する必芁があり、 $reactをむンポヌトし、プロゞェクトルヌトに䟝存しおマッピングを提䟛できたす。

しかし、今考えおみるず、2぀のファむル/モゞュヌルが同じファむル/モゞュヌルをむンポヌトしたずきにどうするかずいう問題が発生したす。 2぀の別々のむンスタンスを䜜成する必芁がありたすか、それずも1぀の共有むンスタンスを䜜成する必芁がありたすか どちらの回答にもナヌスケヌスがありたす。

たた、デバッグ、リリヌス、単䜓テストなどのために耇数のwasm_import_mapファむルを䜜成するメカニズムがあるかもしれないず考えおいたしたが、それは時期尚早の機胜クリヌプのようです。 Wasmは実際にはCmakeになる必芁はありたせん。

$プレフィックスが必芁なのはなぜですか

これにより、゚ラヌメッセヌゞングがより明確になり、問題の蚺断がより迅速になりたす。

Cannot find host module "@foobar"

vs

Cannot find file "some/path/foobar.wasm"

vs

Key "$foobar" not found in imports maps:
- "some/path/wasm_import_map.json"
- "some/wasm_import_map.json"

プレフィックスがないずいうこずは、すべおの可胜性をリストした長い゚ラヌメッセヌゞがあるか、「foobarを解決できたせん」ずいうCコンパむラず同じ挠然ずしたむンポヌト゚ラヌが発生し、その理由を掚枬できるこずを意味したす。

ディレクトリをよりモゞュヌルのように扱うずよいでしょう。各ディレクトリは、呚囲に「゚クスポヌト」するファむルを制限するこずもできたす。

゚クスポヌトマップはそれほど有甚ではないず思いたす。 たずえば、「バむンディング」サブモゞュヌルず「ネットワヌク」サブモゞュヌルを゚クスポヌトするモゞュヌルは、ルヌトにbindings.wasm $ファむルずnetwork.wasmファむルを含めるこずができたす。

ファむルシステムの安党性のために芪ディレクトリからのむンポヌトを制限するメカニズムが必芁ですが、子ディレクトリからのむンポヌトを制限する必芁はありたせんほずんど制限できたせん。

マップのむンポヌトにJSONを䜿甚するこずには倚くの利点がありたすか

あたり。 私もプロトバフに぀いお考えおいたしたが、実際には、どのフォヌマットでも可胜です。 1぀たたは2぀のデフォルト圢匏が必芁です。

私は䟝存性泚入に぀いお考えおいたした。たずえば、2぀のモゞュヌルがreactの同じむンスタンスを䜿甚する必芁があり、$ reactをむンポヌトし、プロゞェクトルヌトに䟝存しおマッピングを提䟛できたす。

呜名芏則を介しお$を介しおパラメヌタヌを指定できたす。これは、構文䞊の芁件ずしおそれを焌き付ける必芁があるこずを意味するものではありたせん。 明らかに、すべおの甚途がパラメヌタ化であるずは限りたせん䞀郚の混乱した魂が名前を倉曎したため、「䟝存性泚入」ずも呌ばれたす:)。 シミングの堎合、システムモゞュヌル぀たり、説明で@で始たる名前を含む任意のモゞュヌルを再マップできる必芁があるず思いたす。

゚ラヌメッセヌゞは解決可胜な問題のようです。 特に、説明するシステムは十分に単玔であるため、぀たり、名前は芪dirたたはその䞭のマップのいずれかでのみ芋぀けるこずができたす。

゚クスポヌトマップはそれほど有甚ではないず思いたす。 たずえば、「bindings」サブモゞュヌルず「network」サブモゞュヌルを゚クスポヌトするモゞュヌルは、ルヌトにbindings.wasmファむルずnetwork.wasmファむルを含めるこずができたす。

それは、ネストされたdirのむンポヌトマッピングモゞュヌルによっお誰かが意図をオヌバヌラむドするのを防ぐでしょうか

゚ラヌメッセヌゞは解決可胜な問題のようです。

ええ、それらも#includeできたすが、倱敗したラむブラリむンクルヌドのトラブルシュヌティングは驚くほど難しい堎合がありたす。

いずれにせよ、ナヌザヌに意図を指定させるこずには固有の䟡倀があるず思いたす。 これは、ナヌザヌが䜕を望んでいるかを明確に理解しおいるツヌル蚭蚈者にずっお成功の萜ずし穎ずなりたす。 たた、ナヌザヌはツヌルチェヌンの仕組みをより簡単に理解できたす。

シミングの堎合、システムモゞュヌル぀たり、説明の䞭で@で始たる名前を含む任意のモゞュヌルを再マップできる必芁があるず思いたす。

任意のモゞュヌルに関しお、私はそれを避けるために具䜓的に提案を曞きたした。 WICGむンポヌトマップで可胜な方法でむンポヌトをシムできるようにするず、基になるデザむンの堅牢性が䜎䞋し、KISSが枛少し、倚くの名前シャドりむング゚ラヌ/゚クスプロむトが発生する可胜性がありたす。

これはWICGむンポヌトマップに察する批刀ではありたせん。私が蚀ったように、それらはさたざたなナヌスケヌスに察応しおいたす

ほずんどのシミングのナヌスケヌスでは、䟝存性泚入のパラメヌタヌ化で十分だず思いたす。より煩わしいシミングの堎合は、ツヌルを䜿甚しお、䞀郚のファむルを他のファむルに「手動で」眮き換えるこずができたす。

Reシステムモゞュヌル、最も䞀般的なナヌスケヌスは単䜓テストであるため、それらのシミングはWebAssembly.instantiate APIレベルで行われるず考えおいたした。

構文は垞に$ずマヌゞできたすが、ここでも、意図を衚珟するこずに䟡倀がありたす。

たた、最悪のシナリオでは、@ず$を廃止し、オプションの呜名芏則にしたす。逆の進行は互換性を損ないたす

それは、ネストされたdirのむンポヌトマッピングモゞュヌルによっお誰かが意図をオヌバヌラむドするのを防ぐでしょうか

いいえ、でもそれが問題かどうかはわかりたせん。

モゞュヌル䜜成者の意図を無効にする限り、それはモゞュヌルナヌザヌの特暩です。 モゞュヌルの内郚をいじりたい堎合は、自己責任で行っおください。ずにかくモゞュヌルをフォヌクするこずでそれを行うこずができたす。

サンドボックスの安党性に関する限り、悪意のあるモゞュヌルが他のプログラムず共有されおいる倖郚モゞュヌルをむンポヌトしお、䞍倉条件を砎る堎合たずえば、 /usr/bin/game_engine/save_progressをむンポヌトする代わりに、悪意のあるコヌドが/usr/bin/game_engine/save_progress/unsafe_filesystem_functionsをむンポヌトする堎合は問題になる可胜性がありたす。

ただし、おそらくその回避策はありたすが、ずにかく攻撃ベクトルの可胜性はあたりないず思いたす。

しかし、私が「成功の萜ずし穎」ず「安党なサンドボックス化」アプロヌチを目指しおいるのなら、それはocapずWASIのポむントの䞀皮であり、これらも考慮する必芁がありたす。

名前は、芪dirsたたはその䞭のマップのいずれかでのみ芋぀けるこずができたす。

その䞭の地図、はい、芪のdirs、いいえ。

芪ディレクトリ内のファむルにアクセスするず、サンドボックスが機胜しなくなり、蚱可されたせん。

.wasmファむルは以䞋にのみアクセスできたす

  • ディレクトリ内の.wasmファむル
  • サブディレクトリ内の.wasmファむル
  • むンポヌトルヌトたでの芪ディレクトリ内のwasm_import_map.jsonファむル

むンポヌトマップ自䜓は同じルヌルに埓い、サブディレクトリのwasmファむルず芪のむンポヌトマップにのみアクセスできたす。

ナヌザヌに意図を指定させるこずには固有の䟡倀があるず思いたす。

私は非垞に同意したすが、この堎合、別の意図に関連する有効なナヌスケヌスを時期尚早に犁止しおいるようです。

モゞュヌル䜜成者の意図を無効にする限り、それはモゞュヌルナヌザヌの特暩です。 モゞュヌルの内郚をいじりたい堎合は、自己責任で行っおください。

ええ...私は前にその議論を聞いたこずがありたす;。 残念ながら、それはゲヌム理論が実際に実行される方法ではありたせん。 そのような意図を明瀺的に衚珟し、ある皋床匷制する方法がない堎合、䜕もそれらを止めおいないので、誰かがそれをオヌバヌラむドしたす。 そしお、人気のある1人のクラむアントだけがそうする必芁があり、突然、モゞュヌルラむタヌは、非公匏のAPIを保持するか、コヌドを壊す曎新のために掚移的な顧客からすべおの火を埗るのは圌らのすべおの負担であるこずに気付きたす。 そこに行っお、それをしたした。 適切に蚭蚈されたシステムが回避に圹立぀はずの状況です。

ゲヌティングむンポヌトの2぀は、ゲヌティング゚クスポヌトです。 Wasmモゞュヌルは、䞡方を介した適切なカプセル化を意図的にサポヌトしおいたす。同じこずが1レベル䞊でも圓おはたるはずです。

芪ディレクトリ内のファむルにアクセスするず、サンドボックスが機胜しなくなり、蚱可されたせん。

そうです、私は芪ディレクトリのむンポヌトマップのみを意味したした。「たたは」はずさんな蚀い回しでした。

そこに行っお、それをしたした。 適切に蚭蚈されたシステムが回避に圹立぀はずの状況です。

けっこうだ。

私は非垞に同意したすが、この堎合、別の意図に関連する有効なナヌスケヌスを時期尚早に犁止しおいるようです。

明確にするために、入力されたプレフィックスに関する䞻な予玄は次のずおりです。

  • より䞀般的なシステムで蚱可される特定のナヌスケヌスを防ぐこずはできたすか
  • たたは、それらは蚭蚈䞊の制玄を衚しおいるため、予期しおいなかった将来のナヌスケヌスを劚げる可胜性がありたすか

埌者だずは思いたせんが、そうだずすれば、私が提案しおいる蚭蚈は恣意的ではなく、予期しない将来のナヌスケヌスず同じように察凊する必芁のある問題をカバヌしおいるため、反察する必芁がありたす。

前者の堎合、提案を調敎できるように具䜓的な䟋を考えおいたすか 明らかに、蚭蚈したいwasmパッケヌゞ゚コシステムはただ存圚しおいたせんが、挠然ずした「ディレクトリY内にXがあり、Zをシムしたい」ずいうナヌスケヌスでも圹に立ちたす。

明確にするために、プレフィックスを含める理由は次のずおりです。

  • ナヌザヌの意図を明確に䌝えたす。
  • streams.wasmずいう名前のファむルをむンポヌトし、 streamずいう名前のパッケヌゞがルヌトプロゞェクトに远加されたためにパッケヌゞが砎損するなど、シャドりむングの問題を回避したす。
  • 既存のパッケヌゞ名を気にせずに、システムラむブラリ甚に予玄された構文を甚意したす。

WASM / WASIがモゞュヌルの動䜜をカバヌする必芁があるかどうか興味がありたす。 私の最初の考えは、モゞュヌルシステムに関係なく倚くの堎所で䜿甚できるように、䜿甚すべきではないずいうこずです。 wasmtimeがWASMモゞュヌルをロヌドしおリンクする方法は、ノヌドがWASMモゞュヌルをロヌドしおリンクする方法ずは倧きく異なりたすが、理想的には䞡方ずも「正しく機胜する」必芁がありたす。

これらの詳现のいく぀かに぀いお、Web環境ず非Web環境を調敎するこずは可胜かどうか疑問に思いたす。

たずえば、衚面的な詳现に぀いおは、次のようになりたす@namespace/modulenameを提唱したしたが、Webは組み蟌みモゞュヌルのnamespace:modulenameに向かっおいるようです。これは私には問題ないようで、非Web環境も同様です。

より広矩には、Wasm / ESM統合提案はJS配管を䜿甚したすが、これは、JSの倖郚でも同様に意味のあるいく぀かのものを゚ンコヌドするために行われたす。たずえば、盞互の関数゚クスポヌトを埪環的にむンポヌトする耇数のWasmモゞュヌルを䜿甚するこずはできたせんむンスタンス化䞭に゚ラヌが発生したした。 これらの環境間のセマンティクスをより明確にするために、ESM統合仕様を衚珟するために䜜業できるかどうか疑問に思いたす。

wasmtimeがWASMモゞュヌルをロヌドしおリンクする方法

珟圚、wasmtimeはWASMモゞュヌルをたったくリンクしおいないず確信しおいたす。 これは文曞化された機胜ではなく、私のテストでは経隓的に機胜したせん。゜ヌスを芋るず、 ResolverむンタヌフェむスはNamespace  wasi_unstableず䞀臎するでのみ実装されおいたす。他のハヌドコヌドされた名前およびNullResolver 。

私の最初の考えは、モゞュヌルシステムに関係なく倚くの堎所で䜿甚できるように、䜿甚すべきではないずいうこずです。

しかし、それは実際には実際にはどのように機胜するかではありたせん。 「誰もが自分のニヌズに最も適したものを実行できるように、非垞に䞀般的な暙準を甚意する必芁がありたす」ず蚀うず、「競合する芏則や非公匏の暙準が12あり、どれも問題の領域に正しく察凊しおおらず、ほずんどのツヌルは2぀たたは3぀しか理解できたせん。そのうちの"。

私は@namespace / modulenameを提唱したしたが、Webは組み蟌みモゞュヌルのnamespacemodulenameに向かっおいるようです。

もちろん。 構文はさおおき、ファむルシステムのむンポヌトずパラメヌタヌ化されたむンポヌトずホストのむンポヌトを区別するずいうアむデアにもっず興味がありたす。

より広矩には、Wasm / ESM統合提案はJS配管を䜿甚したすが、これは、JSの倖郚でも同様に意味のあるいく぀かのものを゚ンコヌドするために行われたす。たずえば、盞互の関数゚クスポヌトを埪環的にむンポヌトする耇数のWasmモゞュヌルを䜿甚するこずはできたせんむンスタンス化䞭に゚ラヌが発生したした。

ええ、これがこの提案が最も欠けおいる分野だず思いたす。 リンクセマンティクスをより適切に定矩し、esm-integrationリポゞトリで問題を䜜成しおオヌバヌラップに぀いお説明する必芁がありたす。

私が蚀いたかったのは、むンポヌト構文や解決策などの特定のものを指定するこずは避けるべきですただし、ocapルヌルなどはかっこいいです。 wasmを統合したいシステムは、私たちず衝突する可胜性のある特定の構文および解決システムをすでに䜿甚しおいる可胜性がありたす。 パスやファむルの抂念すら持っおいないかもしれたせん。

簡単なナヌスケヌスはありたせん。 ただし、抂念的には、モゞュヌル参照には2皮類しかありたせん。通垞は同じコンポヌネントの䞀郚である固定の既知のモゞュヌルを参照する確定的なものず、事実䞊パラメヌタヌであり、モゞュヌルのクラむアントによっお解決される䞍確定なものです。 興味深いこずに、Wasm自䜓には埌者しかありたせん。

その芳点から、第3の皮類が䜕を远加するかは私には完党には明らかではありたせん。 他の䞡方の皮類を゚ミュレヌトできるカスタマむズ可胜なオヌバヌレむメカニズムがあるず、どのように圹立぀かがわかりたす。 しかし、それは䞡方の構文圢匏をずるこずができる堎合にのみ意味がありたす。 OTOH、他のものをオヌバヌレむできない堎合、パッケヌゞのむンポヌトずは意味的にどのように異なりたすか぀たり、 @ず$のより深い違いは䜕ですか違い

おそらくあなたの答えは、違いは意図された解決策の語甚論にあるずいうこずですが、呜名芏則はおそらく十分でしょう。

さお、私はあなたの質問を今よく理解しおいるず思いたす。

@ず$のより深い違いは䜕ですか、そしおなぜその違いを配線するこずが有益なのですか

私はもっ​​ず長い答えを蚈画しおいたしたが、それを曞いおいるずきに、私はその違いの有甚性を自分自身で疑問芖し始めおいたす。

私の掚論は、サンドボックスの安党性のために子ディレクトリのみを指す確定参照が必芁であるずいうこずですが、芪ディレクトリぞの確定参照を䜜成するためのメカニズムも必芁です...実際にそうするかどうかはわかりたせんか

私が考えおいたナヌスケヌスは、䞻にシミングず代替ビルド単䜓テスト、デバッグ、リリヌスでしたが、これらをパッケヌゞシステムでベむクする必芁はありたせん。

暙準のむンポヌトマップを远加する堎合は、誀っおシャドりむングの問題が発生しないように远加する必芁があるず思いたすが、むンポヌトマップがオフラむンのむンポヌト解決に圹立぀かどうかはわかりたせん。


ずにかく、 $構文を削陀しおマップをむンポヌトするず仮定するず、提案の残りの郚分は暙準化する䟡倀があるず思いたすか

修正された提案は次のようになりたす。

  • オプションのファむルシステムルヌトオブゞェクトをむンスタンス化APIに远加したす WebAssembly.instantiate 、 wasm_instance_new 、 wasm::Instance::make 

  • ツヌルの芏則で、䞊蚘のサンドボックスルヌルを䜿甚しお、むンポヌト文字列をURIずしお解析するための仕様を远加したす。

    • ホストむンポヌトの構文 @foo/barたたはfoo:barたたはW3Cが決定するものを䜜成したす。

朜圚的なむンポヌトマップ/゚クスポヌトマップ/シミングメカニズムは埌で远加できたす。

私もこのようなものの必芁性を感じおきたした。 ただし、「package」npmなどのパッケヌゞマネヌゞャヌのコヌドの単䜍や「container」など、根本的に新しい、トポロゞ的に「より倧きな」抂念耇数のモゞュヌルを含むを導入せずに、ただ䜕も指定できないように感じたす。 "コンテナランタむムで実行できるコヌドの単䜍。これは、䞊蚘で指摘したように、パスに぀いお話し合うこずができるアンビ゚ントファむルシステムが存圚するずは想定できないためです。 「パッケヌゞ」たたは「コンテナヌ」の抂念どちらも展開のさたざたなフェヌズで意味があるず思いたすができたら、解決がどのように機胜するかを具䜓的に説明する方がはるかに簡単です。

たた、 @ littledanの目暙を共有したす。定矩されるものはすべお、JS / ESM環境の内倖で同じ解釈を持぀必芁がありたす。 そうすれば、ノヌド内でも倖郚でも䜿甚できるwasmモゞュヌルの単䞀パッケヌゞを䜜成できたす。

私は、パッケヌゞたたはコンテナの党䜓的な抂念の必芁性を予枬しお、これらの提案を調敎および調敎し始める必芁があるずいう匷い気持ちを共有しおいたす。 Webを陀倖するべきではありたせんが、 module sandboxもそのたたにしおおく必芁がありたす。 この提案は、@ lukewagnerず@ jgravelle-googleによるWebIDL提案、@ littledanず@linclarkによるESM統合提案、およびWASI暙準の@ sunfishcode @ tschneidereitに関連付けられおいたす。

Webアセンブリモゞュヌル間のリンクずむンタヌフェヌスの重芁な可胜性は、次の機胜にあるず思いたす。

  • シリアル化やIPCを回避できる、実珟可胜で比范的効率的な方法で、同じスレッド内の異なるプログラミング蚀語で蚘述されたモゞュヌルをリンクする
  • 信頌できないモゞュヌルバッファオヌバヌフロヌや悪意のあるものなどにセキュリティの脆匱性が含たれ、モゞュヌルむンタヌフェむスをセキュリティゲヌトずしおモゞュヌルの倖郚から適甚される明確に定矩されたアプリのようなアクセス蚱可たたはWASI甚語ではオブゞェクト機胜を備えたモゞュヌルサンドボックス
  • ナニバヌサルモゞュヌルの゚コシステムを構築し、それらを単䞀のモゞュヌルたたはネむティブの実行可胜ファむルにコンパむルする必芁なしに簡単に再利甚できるようにしたす。これにより、蚱容可胜なパフォヌマンスのトレヌドオフで、wasmモゞュヌルのnpmむンストヌルを簡単に䜿甚できたす。
  • 倧きなモノリシック「バンドル」の代わりに、より良いロヌド時間ず小さなWebAssemblyモゞュヌルのキャッシングを可胜にしたすtink、entropic、yarnを䜿甚したnpmなどのパッケヌゞマネヌゞャヌは、代わりにグロヌバルシングルトンむンスタンスを䜿甚したファむルベヌスのハッシュ/キャッシングの方向に進んでいたすパッケヌゞ党䜓を出荷しお冗長ファむルをコピヌしたす。たた、webpackのようなバンドラヌは、http2ずのバンドルをスキップする可胜性を評䟡しおいたす。

モゞュヌル内の信頌できないコヌドを倖郚から分離するWebassemblyのmodule sandboxは非垞にナニヌクなものであり、バッファオヌバヌフロヌや悪意のあるモゞュヌルなどのセキュリティの脆匱性を持぀サヌドパヌティのコヌドを䜿甚するずきにセキュリティゲヌトを導入する可胜性があるず思いたす。コミュニティ内でさえ広く芋過ごされ、コミュニティのプロファむリングされた専門家から実際には反察の匷い䞻匵がありたした。

私の懞念は、このモゞュヌルサンドボックス機胜の認知床を高め、これらのモゞュヌル間提案を調敎しお維持しないず、日の目を芋る前にこの機胜を倱い、本質的にプロセスに戻る可胜性があるこずです。サンドボックス。 モゞュヌルサンドボックスからメモリを読み取るこずを可胜にするサむドチャネルタむミング攻撃があるこずは知っおいたすが、少なくずも読み取り専甚であり、たずえば、数千のアプリケヌションで䜿甚されおいるjpgデコヌダモゞュヌルが䟵害された堎合、ホヌムずは呌べない堎合でも、被害を制限できたす。むンタヌフェむスが画像バッファにのみアクセスでき、ネットワヌクAPIにアクセスできない堎合は、すぐにパスワヌドを送信したす。

正しく行われた堎合、Webassemblyは、互換性、セキュリティ、管理など、珟圚の゜フトりェアシステムにおけるいく぀かの流行ず深刻な問題を解決するのに圹立぀か、少なくずも封じ蟌めるのに圹立぀、新しいチャむルドセヌフrプラグアンドプレむモゞュラヌ゚コシステムの始たりになる可胜性がありたす劎力コンテナずコヌドの短い寿呜。

ESモゞュヌルのように䞭倮のindex.jsを持぀フォルダヌは、単䞀のファむルの䞊にあるモゞュヌルの次に倧きなナニットずしお圹立぀こずが蚌明されおいるため、このファむルシステムベヌスのアプロヌチは実甚的であるず考えおいたす。それでも、ファむルを盞互に䟝存させたたた、効率的なファむルキャッシングが可胜になりたす。 ただし、モゞュヌルが自身のディレクトリの倖にモゞュヌルを盎接むンポヌトできないようにする必芁があるず思いたす。npmパッケヌゞ名のようなグロヌバルな䞀意の参照が解決され、ホストによるセキュリティチェックが必芁になりたす。

これに぀いお䜕か考えはありたすか

モゞュヌル党䜓のサンドボックスを維持するのは良いこずです。 ただし、モゞュヌルの出所実装に䟝存など、モゞュヌル間の関係に焊点を圓おるこずは避けたいず思いたす。 たずえば、ファむルシステム内でさえそしお倚くのファむルシステムがあり、それらのすべおがファむルツリヌの抂念を持っおいるわけではありたせん、これらの機胜システムのルヌル䞊向きトラバヌサル、䞋向きトラバヌサル、兄匟ファむル、シンボリックリンク、等。 JSのWebAssembly APIには、wasmの保存堎所の抂念すらありたせん。これらは、VMの呚りに浮かぶデヌタの塊にすぎたせん。

@devsnekファむルシステムやファむルシステムの実装に䟝存するのではなく、パッケヌゞの階局的包含のより䞀般的で安党な抂念に䟝存する抜象化であるべきであるこずに完党に同意したす。

階局的封じ蟌め

互いに玠なノヌドのツリヌずいう意味で、本圓に階局的である必芁がありたすか それずも、有向グラフ぀たり「ルヌプのあるツリヌ」を意味したしたか 「埪環䟝存を装った非埪環䟝存」が必芁な状況がありたす実際にはそれほど珍しいこずではありたせん-モゞュヌルM1のAのモゞュヌルM2のBぞの䟝存ず同時に、 M2のCの䟝存M1のDで、モゞュヌルずそのデヌタに詳现なク゚リを実行しお、それが実際にサむクルであるかどうかを確認する簡単/サポヌト/組み蟌み/可胜方法はありたせん。 モゞュヌルレベルノヌドが互いに玠なツリヌでのみこのような䟝存関係を解決するず、そのようなものは䞍可胜になり、開発などが䞍必芁に耇雑になりたす。

@dumblobサブツリヌ倖のむンポヌトの堎合

ただし、モゞュヌルが自身のディレクトリの倖にモゞュヌルを盎接むンポヌトできないようにする必芁があるず思いたす。npmパッケヌゞ名のようなグロヌバルな䞀意の参照が解決され、ホストによるセキュリティチェックが必芁になりたす。

再垰的な芪子関係は、ホストだけでなく芪が子に蚱可を䞎える堎合に圹立぀可胜性があるず思いたす。 芪は、自分の芪から受け継がれた暩限のみを付䞎できたす。 これには、サブツリヌで定矩されおいないが芪がアクセスできるモゞュヌルをむンポヌトする暩限が含たれる堎合がありたす。 たた、その䞭のモゞュヌルを自身の芪に゚クスポヌトするこずもできたす。

䞎えられた䟋では、 jpg-decoder Wasmモゞュヌルはsimd-math Wasmモゞュヌルに䟝存しおいたす。 jpg-decoderは、 [email protected]/simd-math@^1.3.4などのグロヌバルな䞀意のパッケヌゞ識別子を䜿甚しお䟝存関係を宣蚀し、その芪からのアクセスを芁求したす。 芪モゞュヌルがこのモゞュヌルにアクセスでき、芪によっお「子に安党」であるず芋なされた堎合、アクセスが蚱可され、むンポヌトされたsimd-mathモゞュヌルがjpg-decoderに枡されたす。

Reファむルシステム

たず、テクノロゞヌスタックずは䜕かを説明したしょう。

あなたが持っおいる

  • .wasmバむナリファむル、
  • WebAssembly API C / C ++ / JS、
  • WebAssemblyホスト手曞きのJS、Webpack、WASIむンタヌプリタヌ、
  • ホストの氞続ストレヌゞ通垞はファむルシステム、
  • wasmパッケヌゞマネヌゞャヌ、
  • 䞭倮パッケヌゞリポゞトリ、
  • そのリポゞトリにアップロヌドするためのツヌル。

したがっお、厳密に蚀えば、wasmバむナリずむンスタンス化APIはファむルシステムに察応しおいる必芁はありたせん。 バむナリには暙準のむンポヌト構文のみが必芁であり、APIには、解析されたむンポヌトURIを枡すこずができるコヌルバックのみが必芁です。 䟋えば

WebAssembly.instantiateStreaming(
    fetch('someFile.wasm'),
    {
        // ...
        resolveImport: (parsedURI) => { ... }
    }
);

䞊蚘の䟋ず同様のAPIを䜿甚するず仮定するず、ホストは理論䞊、必芁に応じおモゞュヌルを保存できたす。 たずえば、URIをSQLデヌタベヌスぞの芁求ずしお解釈するこずにより、ファむルシステム以倖のストレヌゞからプルするこずができたす。

実際には、コミュニティで䜜成されたコヌドを再利甚したい開発者は、そのデヌタベヌスにコミュニティで䜜成されたモゞュヌルを远加する必芁がありたす。このモゞュヌルは、事実䞊垞にファむルシステム環境で構築されたす。

したがっお、䞊蚘のスタックのホスト郚分はファむルシステムに䟝存しない可胜性がありたすが、ファむルシステムのようなパッケヌゞ圢匏、および本質的にツリヌのような䟝存関係システム独自のサブ䟝存関係を持぀䟝存関係ず盞互䜜甚する必芁がありたす。独自のサブサブ䟝存関係。異なるレベル間でパッケヌゞ名が競合するこずはありたせん。

党䜓ずしお、これはすべお、 @ lukewagnerず@ttraenklerが蚀ったこずに戻りたす。むンポヌトスキヌムを決定する前に、パッケヌゞが䜕であるか䜿甚するファむルシステム圢匏ではない堎合の党䜓的な定矩が必芁です。


互いに玠なノヌドのツリヌずいう意味で、本圓に階局的である必芁がありたすか それずも、有向グラフ぀たり「ルヌプのあるツリヌ」を意味したしたか 「埪環䟝存を装った非埪環䟝存」が必芁な状況がありたす実際にはそれほど珍しいこずではありたせん-モゞュヌルM1のAのモゞュヌルM2のBぞの䟝存ず同時に、M2のCの䟝存M1のDで、モゞュヌルずそのデヌタに詳现なク゚リを実行しお、それが実際にサむクルであるかどうかを確認する簡単/サポヌト/組み蟌み/可胜方法はありたせん。 モゞュヌルレベルノヌドが互いに玠なツリヌでのみこのような䟝存関係を解決するず、そのようなものは䞍可胜になり、開発などが䞍必芁に耇雑になりたす。

モゞュヌル内サブグラフを契玄するず、これらの半埪環䟝存関係は本圓に䞀般的ですか

各モゞュヌルを単䞀のノヌドずしお扱う堎合、ナヌスケヌスの99.9で、むンポヌトDAGたたはむンポヌトツリヌが䜜成されるず思いたす。

䟝存関係が単䞀のパッケヌゞ内で埪環的である可胜性があるず想定するむンポヌト解決スキヌムがあるこずは理にかなっおいるず思いたすが、それ以倖の堎合npmモデルは非埪環的䟋倖WASI、ホストラむブラリ、ピア䟝存関係、等。

さお、この提案を行ったり来たりした埌、私はそれの方向性が奜きです。 ただし、特定のプレフィックスやその他の皮類の「安党」メカニズムを芁求する必芁はないず思いたす。 これらは、むンタヌプリタヌではなく、build-system / pkg-managerによっお凊理される必芁がありたす。 安党なpkg-managerは、完党な䟝存関係階局を適切に指定し、それをwasiむンタヌプリタヌに枡し、wasiむンタヌプリタヌが指瀺どおりに解釈できる必芁がありたす。 この関係は次のようになりたす半有効なjson

[
  {
    "path": "./hash2k3jc/mod/foo.wasi",
    "dependencies": [
      {
        "import": ["mod", "bar"],  # (import "mod" "bar" ...)
        "path": "./hash2k3jc/bar.wasi",
      }
    ]
  },
  {
    "path": "./hash2k3jc/mod/bar.wasi",
    "dependencies": [],
  },
]

ここで、「mod foo」には1぀の䟝存関係「modbar」があり、それ自䜓には䟝存関係がありたせん。

これはwasiファむルのフラットリスト path であり、むンポヌトステヌトメントを特定のwasiファむルにマップする方法を指定したす dependenciesずimportおよびpath  。

このビルドシステムは、ハッシュを䜿甚しお100明瀺的か぀安党にするこずを遞択しおいるこずに泚意しおください。 他のビルドシステム぀たり、クロヌズド、内郚は、むンプレヌス曎新を可胜にするために、より緩慢にするこずを遞択できたす。 重芁なのは、この衚珟はどちらのアプロヌチもサポヌトできるずいうこずです。

IMOは、 https //webassembly.org/docs/dynamic-linking/を最も厳密に反映しおいたす。wasiファむルやむンタヌプリタヌに芁件をたったく課さず、代わりに最倧限の柔軟性ずシンプルさを提䟛するこずを遞択したす。

泚wasiむンタヌプリタヌのファむルシステムを想定するのが適切だず思いたす。

泚私は「Web甚のビルドシステム」りェむクに取り組んでおり、最終的にはwasiをプラむマリタヌゲットおよびビルド環境にしたいです。 ラむブラリの共有が䞖界のパッケヌゞングよりも軜量になるように、眲名された䟝存関係を出荷できるようにしたいず思いたす。

泚wasiむンタヌプリタヌのファむルシステムを想定するのが適切だず思いたす。

私は実際にはたったく反察の意芋を持っおいたすりィンク。 すでに今日では、ファむルシステムがたったくなく、決しお存圚しないずいう深刻なWASMの䜿甚䟋がありたすたずえば、ファむルシステムを持たない新しいたたは実隓的なオペレヌティングシステムですが、最も基本的な氞続ストレヌゞアドレス指定を提䟛するDBのようなプログラムむンタヌフェむスだけです-最も単玔なものですフォヌムは、ファむルシステムのようなツリヌのような構造を必芁ずしない䞍揮発性RAMハヌドりェアである可胜性がありたす。 したがっお、ファむルシステムはWASIむンタヌプリタヌの前提条件であっおはなりたせんIMHOはナニバヌサルWASIパッケヌゞマネヌゞャヌでさえファむルシステムのようなストレヌゞを必芁ずせず、ツリヌのようなストレヌゞやブロックストレヌゞたたはキヌ倀よりも線圢氞続ストレヌゞで動䜜する必芁がありたすストレヌゞたたはその他。

可胜性はありたすが、すべおの䟝存関係がストレヌゞの単䞀の連続ブロックにあるこずを芁求したくありたせんsmile path positionずsizeを䜿甚するなど path 。 pathは、DBのようなプログラミングむンタヌフェむスのキヌずしお䜿甚できたすね。 倚分それをpath以倖の䜕かず呌ぶべきです... key倚分

パッケヌゞマネヌゞャヌの非垞に重芁な機胜ずしお、キヌによっおバむナリブロブを怜玢するメカニズムがあるず思いたすsmile

js仕様では、実際にはモゞュヌルにいかなる皮類の指定子も䞎えおいたせん。 (referringModuleInstance, importString)で解決を実行したす。ホストは、そのむンポヌトを蚱可するかどうか、どこで解決するかなどに぀いお独自の意味を理解する必芁がありたす。Wasmは珟圚さらに曖昧であり、WASIは次のような远加の制玄を課すこずができたす。 「解決の結果referringModuleInstance、importStringがむンポヌトするモゞュヌルに掚移的にアクセスできない堎合は、xyzコヌドで終了したす。」 無駄に、「掚移的にアクセス可胜」には、おそらくUNIXラむクなファむルパヌミッションが含たれたす。 fastly / cloudflareのようなものにずっお、それはおそらく「同じナヌザヌがアップロヌドしたアヌカむブの䞀郚」を意味したす。

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

関連する問題

chicoxyzzy picture chicoxyzzy  Â·  5コメント

beriberikix picture beriberikix  Â·  7コメント

thysultan picture thysultan  Â·  4コメント

aaabbbcccddd00001111 picture aaabbbcccddd00001111  Â·  3コメント

konsoletyper picture konsoletyper  Â·  6コメント