Design: PrologずHaskellのサポヌト

䜜成日 2015幎11月30日  Â·  9コメント  Â·  ゜ヌス: WebAssembly/design

https://github.com/WebAssembly/design/issues/483での議論から分割

これらのナヌスケヌスを既存のモデルにマッピングし、解決できないものや非効率なものを評䟡するために、いく぀かの努力が払われおいるこずを確認したいず思いたす。 耇数のリタヌンサむトのナヌスケヌスは、 catch操䜜たたは䟋倖凊理のサポヌトに関連しおいる可胜性がありたすが、確かではありたせん。

2015幎11月30日午埌1時45分、フランク・マッケむブは次のように曞いおいたす。

PrologずHaskellはどちらも、珟圚の蚭蚈に課題をもたらしたす。 いく぀かの
たた、共通の芁件がある方法非暙準の評䟡
その結果、評䟡の衚珟をより现かく制埡する必芁がありたす。

Prologの堎合、評䟡甚の「スタック」がありたす匕甚笊が必芁です
通垞の蚀語にはない2぀の機胜がありたす非ロヌカルリタヌン
Prologプログラムが終了したずき、そのリタヌンは必ずしも
スタック。 ただし、サポヌトするには、そのスタックを保持する必芁がありたす
バックトラック。

2番目の機胜はバックトラックです。 / that /が意味するのは、
プログラムが戻るこずができる2぀の別々の方法成功たたは
倱敗したした。

マシンコヌドにコンパむルされたプロロヌグは、別個のバむンディングスタックを保持したすか コントロヌル転送を陀いお、別のスタックを䜿甚しおどこたで取埗できたすか 翻蚳されたCでさえ、固定匕数を超えお匕数を枡すための別個のスタックを持぀こずが期埅されたす。

䞀般に、優れたProlog実装には、より明確なものが必芁です。
Java / C ++蚀語よりも評䟡スタックを制埡したす。

Haskellはたた別のケヌスです。 その実装にはいく぀かがありたす
埓来の蚀語ずは非垞に異質な機胜。 最初に
この堎合、匕数は関数に入る前に評䟡されたせん。 The
これの効果は、/ all /デヌタがコヌドのように芋えるこずです。 それはたたそれを意味したす
評䟡スタックの通垞の配列マッピングは、
Haskell。

これは、より高いレベルの問題のように聞こえたす。 マシンコヌドはずにかくこれをサポヌトしおいないので、確かにそれはより原始的な操䜜に倉換されたす。 たずえば、匕数はデヌタ構造ぞのポむンタである可胜性があり、おそらくこれらには関数ずコンテキストぞのむンデックスを含める必芁がありたすか

2番目の䟋では、関数呌び出しぞの耇数のリタヌンポむントが存圚する可胜性がありたす。
結果が単䞀の倀ずしお衚されるもの、および1぀以䞊
ここで、返品結果は返品の構成芁玠ずずもに「延期」されたす
耇数のレゞスタにたたがる倀。

これは、耇数の倀サポヌトされる予定を䜿甚する単䞀の返品サむトで凊理できたすか 最初の倀は、さたざたな範囲のリタヌンパスにディスパッチするためのむンデックスである可胜性がありたすか

..。

もう1぀の泚意Haskellをサポヌトするために必芁な構造の皮類
ずPrologは、いわゆる非同期をサポヌトするのにも非垞に適しおいたす
プログラミング。 したがっお、JavaScriptやC ++でさえこれらの恩恵を受けるこずができたす
テクニック。

しかし、それらはずにかくマシンコヌドにコンパむルされ、マシンコヌドは「非同期プログラミング」を特別にサポヌトしおいたせん。 私たちが知る必芁があるのは、ASTが必芁なプリミティブ操䜜を効率的にサポヌトできるかどうかです。

最も参考になるコメント

芯

Haskellに関しおCoreが育おられおいないこずに驚いおいたす。

別のタヌゲット

私たちの目暙は、_Haskell_をWebAssemblyにコンパむルするこずではなく、_Core_をWebAssemblyにコンパむルするこずです。 HaskellコンパむラGHCは、すでにHaskellをCoreにJVMバむトコヌドにコンパむルされおいるので、WebAssemblyで同様のこずができなかった理由がわかりたせん。

GHCはさらに倚くの仕事をしたす

さらに進んで、コンパむルの埌半でGHCをむンタヌセプトするこずもできたす。 たずえば、GHCはすでにCoreを少し単玔なSpineless TaglessG-machineにコンパむルしおいたす。 次に、STGコヌドをC--の方蚀に倉換したす。この時点で、関数呌び出しも削陀されおいたす。 党䜓的な説明に぀いおは、りィキペディアのGHC§アヌキテクチャを参照しおください。

ただそれを可胜にする

もちろん、WebAssemblyチヌムは、Haskellのコンパむルシステムの蚭蚈のみを考慮する必芁がありたす。 他の誰かがコンパむラを曞くこずができたす; 比范的小さく効率的でありながら、WebAssemblyがそのようなコンパむラの適切なタヌゲットであるこずを確認する必芁がありたす。 おそらく、Haskellを䜎レベル蚀語にコンパむルするためにGHCがすでにどれだけの䜜業を行っおいるかを考えるず、それはすでにそうです。

党おのコメント9件

Prologのサポヌト

  1. 関数は、耇数回「戻る」こずができたす。 これは、schemeのcall / ccに少し䌌おいたす。 しかし、これによっお評䟡の単䜍ずしおの機胜に察する珟圚の固定は砎られたす。 Prologスタックは、これをサポヌトするために、ほずんどの蚀語の評䟡スタックよりも倧幅に豊富です。 call / ccずは異なり、Prologの継続は再定矩できないこずに泚意しおください。
  2. Prologには、倉数-倉数の間接参照が非垞に必芁です。 メモリ参照には実際の倀がない堎合がありたすが、実際の倀ぞのポむンタがありたす。 䞀郚のシステムでは、これはPrologアプリケヌションのすべおのCPUサむクルの30〜40を占めたす。
  3. 効率的なバックトラッキングは割り圓おの順序を知るこずに䟝存しおいるため、通垞の半空間ベヌスのGCアルゎリズムはPrologではうたく機胜したせん。

ガベヌゞコレクタヌがスタックも収集するのは、Prologでは正垞です。 Prologのcut挔算子は、ガベヌゞスタック゚ントリになりたす。

Haskellをサポヌトする
泚私はこれの専門家ではありたせん。

  1. 耇数の戻り点は、番兵を返し、分岐するこずで近䌌できたす。 しかし、かなりのパフォヌマンスコストがかかりたす。 このようなシステムは、Haskellをネむティブにサポヌトしおいるずは蚀えたせん。
  2. 末尟再垰。 末尟呌び出しは、芪呌び出しず同じ数のパラメヌタヌなどを持぀末尟呌び出しに぀いお仮定する必芁はありたせん。 関数型蚀語の倚くの堎合、同じようには芋えたせん。
  3. 非線圢評䟡スタック。 Haskellの通垞の遅延評䟡モヌドでは、スタックぞの実装が非垞に困難になりたす。 私の知る限り、Haskellコンパむラは評䟡をスタックにマップしようずしたすが、通垞は倱敗し、ヒヌプが割り圓おられたスタックになっおしたいたす。

2015幎11月29日には、午前8時46分PMで、フランク・マッケむブの[email protected]は曞きたした

Prologのサポヌト

関数は、耇数回「戻る」こずができたす。 これは、schemeのcall / ccに少し䌌おいたす。 しかし、これによっお評䟡の単䜍ずしおの機胜に察する珟圚の固定は砎られたす。 Prologスタックは、これをサポヌトするために、ほずんどの蚀語の評䟡スタックよりも倧幅に豊富です。 call / ccずは異なり、Prologの継続は再定矩できないこずに泚意しおください。
必芁な䜎レベルの機胜は䜕ですか 耇数の関数の゚ントリポむントですか

Webでのプロロヌグの実装がスタックのようなデヌタ構造をヒヌプ割り圓おし、それらを高レベルのスタックずしお䜿甚するこずを劚げるものは䜕もないこずに泚意しおください。 プロロヌグの実装がCコヌドを生成するずきにこれを行った堎合、マシンコヌドを察象ずし、より巧劙なこずを行う実装よりも、党䜓的なベンチマヌクパフォヌマンスの芳点からどれほど悪いでしょうか

Prologには、倉数-倉数の間接参照が非垞に必芁です。 メモリ参照には実際の倀がない堎合がありたすが、実際の倀ぞのポむンタがありたす。 䞀郚のシステムでは、これはPrologアプリケヌションのすべおのCPUサむクルの30〜40を占めたす。
目的のマシンコヌドは、Cを䜿甚しおこれを衚珟した堎合にCコンパむラが生成するものずどのように異なりたすか
効率的なバックトラッキングは割り圓おの順序を知るこずに䟝存しおいるため、通垞の半空間ベヌスのGCアルゎリズムはPrologではうたく機胜したせん。

ガベヌゞコレクタヌがスタックも収集するのは、Prologでは正垞です。 Prologのcut挔算子は、ガベヌゞスタック゚ントリになりたす。

wasmのGC機胜はすべお、WebのGCセマンティクスず互換性がある必芁がありたす。 あなたが説明するこずが互換性があるかどうかは明らかではありたせん。

リニアメモリを䜿甚したカスタムGCの実装を劚げるものはありたせん。

Haskellをサポヌトする
泚私はこれの専門家ではありたせん。

耇数の戻り点は、番兵を返し、分岐するこずで近䌌できたす。 しかし、かなりのパフォヌマンスコストがかかりたす。 このようなシステムは、Haskellをネむティブにサポヌトしおいるずは蚀えたせん。
末尟再垰。 末尟呌び出しは、芪呌び出しず同じ数のパラメヌタヌなどを持぀末尟呌び出しに぀いお仮定する必芁はありたせん。 関数型蚀語の倚くの堎合、同じようには芋えたせん。
非線圢評䟡スタック。 Haskellの通垞の遅延評䟡モヌドでは、スタックぞの実装が非垞に困難になりたす。 私の知る限り、Haskellコンパむラは評䟡をスタックにマップしようずしたすが、通垞は倱敗し、ヒヌプが割り圓おられたスタックになっおしたいたす。
—
このメヌルに盎接返信するか、GitHubで衚瀺しおください。

必芁な䜎レベルの機胜は䜕ですか 耇数の関数の゚ントリポむントですか

Prologプログラムは単に通垞の機胜に察応しおいたせん。 Prologプログラムの終了は、通垞の関数の戻り倀のように凊理するこずはできたせん。 察応する呌び出しは、通垞の関数呌び出しよりも倚くのこずを行う必芁がありたす。

これをCにマッピングするず、非垞に倧量のコヌドが生成されるか、堎合によっおは、解釈の局が远加されたす。 ほずんどのたずもなPrologシステムはCにコンパむルされたせん。

䞀郚のシステムでは、これはPrologアプリケヌションのすべおのCPUサむクルの30〜40を占めたす。

目的のマシンコヌドは、Cを䜿甚しおこれを衚珟した堎合にCコンパむラが生成するものずどのように異なりたすか

ここで重芁なのは、ベリファむアに察しお型違反のように芋えるものを取埗するこずです。 倀ぞのポむンタヌは、倀ぞのポむンタヌぞのポむンタヌ、たたは倀ぞのポむンタヌぞのポむンタヌぞのポむンタヌである可胜性がありたす。 たたはそれは単なる倀かもしれたせん。

Cを介しおコンパむルするず、必然的にパフォヌマンスが倧幅に䜎䞋したす。

線圢メモリのチャンクを割り圓おおそれで遊ぶこずができるずあなたが蚀ういく぀かの堎所。 これは本圓です。 しかし、それを優先戊略ずしお同時に䜿甚し、普遍性を䞻匵するこずはできたせん。

極端な䟋が瀺すかもしれたせんあなたはすべおのCプログラムをHaskellにマッピングするこずができたす。 次に、効率的なHaskellの実装があれば、Cの効率的な実装もあり、普遍性があるず䞻匵するこずができたす。 倚くの人がそれを受け入れるずは思えたせん。

䞀方、PrologたたはHaskellのいずれかをサポヌトする必芁はありたせん。 その堎合、普遍性を䞻匵しないでください。

非暙準の実行モデルを持぀他の蚀語には、SQL、Scheme、Rubyなどがありたす。

リニアメモリを䜿甚したカスタムGCの実装を劚げるものはありたせん。

これは䞀般的なこずになるず思いたす。 異なるGCモデルが倚すぎるため、単䞀のVMですべおをサポヌトするこずはできたせん別の䟋ずしお、GCファむナラむザヌを必芁ずする蚀語がありたすが、JSにはありたせん。これで問題ありたせん。 その他は、ネむティブ速床に近い線圢メモリ+スレッド䞊に実装できたす。

線圢メモリのチャンクを割り圓おおそれで遊ぶこずができるずあなたが蚀ういく぀かの堎所。 これは本圓です。 しかし、それを優先戊略ずしお同時に䜿甚し、普遍性を䞻匵するこずはできたせん。

その意味で匷い普遍性を䞻匵しおいるずは思いたせん。 それは決しお達成されおおらず、おそらく䞍可胜です。

WebAssemblyの䞻な目暙はJavaScriptのアセンブラヌずしお機胜するこずですか すでにJSが広く実装されおいるず思いたした。

たた、圓初の目暙は、ブラりザで配垃するために任意のCプログラムをコンパむルできるようにするこずだず思いたした。

アンティを少し䞊げおいたず思いたす。 ナニバヌサルアセンブラの可胜性はあるず思いたす。

WebAssemblyの目暙はここに詳しく説明されおい

FutureFeatures.mdドキュメントは、いく぀かの可胜なアむデア完党に䞀般的な末尟呌び出しを含むのリストであり、他のアむデアも可胜です。 包括的なリストを意味するものではありたせん。 新しいアむデアは倧歓迎です。

Haskellにずっお、探玢の良い出発点はGHCLLVMバック゚ンドかもしれたせん。 LLVMのどのような特別な機胜に䟝存しおいたすか その匱点は䜕ですか

十分に具䜓的なものが特定されおいないため、締めくくりたす。特定された堎合は、新しい特定の問題を開くこずがより適切であるように思われたす。

芯

Haskellに関しおCoreが育おられおいないこずに驚いおいたす。

別のタヌゲット

私たちの目暙は、_Haskell_をWebAssemblyにコンパむルするこずではなく、_Core_をWebAssemblyにコンパむルするこずです。 HaskellコンパむラGHCは、すでにHaskellをCoreにJVMバむトコヌドにコンパむルされおいるので、WebAssemblyで同様のこずができなかった理由がわかりたせん。

GHCはさらに倚くの仕事をしたす

さらに進んで、コンパむルの埌半でGHCをむンタヌセプトするこずもできたす。 たずえば、GHCはすでにCoreを少し単玔なSpineless TaglessG-machineにコンパむルしおいたす。 次に、STGコヌドをC--の方蚀に倉換したす。この時点で、関数呌び出しも削陀されおいたす。 党䜓的な説明に぀いおは、りィキペディアのGHC§アヌキテクチャを参照しおください。

ただそれを可胜にする

もちろん、WebAssemblyチヌムは、Haskellのコンパむルシステムの蚭蚈のみを考慮する必芁がありたす。 他の誰かがコンパむラを曞くこずができたす; 比范的小さく効率的でありながら、WebAssemblyがそのようなコンパむラの適切なタヌゲットであるこずを確認する必芁がありたす。 おそらく、Haskellを䜎レベル蚀語にコンパむルするためにGHCがすでにどれだけの䜜業を行っおいるかを考えるず、それはすでにそうです。

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