仕様では、 i32.load
使用するバイト順序については何も述べていません。 実際のプログラムには、仮想テーブルや静的データなどを提供するデータセクションが含まれています。これらのものには通常、さまざまな値型が必要です。 ただし、WebAssemblyはdata
セクションのバイトシーケンスに制限されています。 バイトでは、エンディアンについて何も知らないため、int32をエミュレートできません。
WebAssebmlyに構造に似たものとLLVMに似た構造初期化子があればいいのにと思います。 静的データのエンディアンの問題を解決するだけでなく、データセクションの整数はLEB128表現で消費するバイト数が少なくなる可能性がありますが、データセクションでエンコードすると常に4バイトを消費するため、バイナリデータを減らす機会があります。
現在の回避策は次のとおりです。
start
関数から実行しますWebAssemblyはリトルエンディアンです。 AstSemantics.mdはこれについて言及していないようです。 これを修正するために、 https://github.com/WebAssembly/design/pull/787を提出しました。
データセクションにLEB128でエンコードされたデータを含めるというアイデアは興味深いものです。 これは、新しい種類のデータ初期化子を使用するか、レイヤー1圧縮を使用して、さまざまな方法で実行できます。 レイヤ2圧縮は、一般に大きなデータセグメントにも役立つ場合があります。
なるほど、ありがとうございます。 あまりにも強い要件ではありませんか? 私が知っているビッグエンディアンを使用するCPUはありませんが、何らかの理由でビッグエンディアンが表示されて広く使用されるようになると、WebAssemblyはこのCPU上でオーバーヘッドを使用して実行されます。
エコシステム全体で複数のエンディアンを処理する必要がないことには大きな利点があり、近い将来、リトルエンディアンアクセスを効率的にサポートしないCPUアーキテクチャが普及する可能性は非常に低いと考えられています。
16:07時土、2016年9月3日には、アレクセイ・アンドレーエフ[email protected]
書きました:
なるほど、ありがとうございます。 あまりにも強い要件ではありませんか? CPUはありませんI
ビッグエンディアンを使用していることを知っていますが、何らかの理由で表示されて
広く使用されているWebAssemblyは、このCPU上である程度のオーバーヘッドを伴って実行されます。MIPSおよびSPARCCPUはビッグエンディアンですが、SPARCにはリトルエンディアンがあります
かなり長い間ロード/ストアされており、MIPSにはリトルエンドのバリアントがあります。
明示的なエンディアンスワッピングを介して、V8にビッグエンディアンサポートを実装しました
コードを記述しますが、オーバーヘッドをまだ注意深く測定していません。
—
このスレッドにサブスクライブしているため、これを受け取っています。
このメールに直接返信し、GitHubで表示してください
https://github.com/WebAssembly/design/issues/786#issuecomment -244548450、
またはスレッドをミュートします
https://github.com/notifications/unsubscribe-auth/ALnq1EEkfh88rAXYByuL9uNcjbsjVnFbks5qmX8agaJpZM4J0Snh
。
WebAssebmlyに構造に似たものとLLVMに似た構造初期化子があればいいのにと思います。
これは、CおよびC ++で行われるのとまったく同じ方法でWebAssemblyですでに実行可能です。つまり、main()が呼び出される前に、_start関数は.init_array関数を呼び出すことができます。 ここでは何もすることがないと思います。
エンディアンについて@ sunfishcode / @ titzerに同意しました。
これは解決したと思います。
最も参考になるコメント
エコシステム全体で複数のエンディアンを処理する必要がないことには大きな利点があり、近い将来、リトルエンディアンアクセスを効率的にサポートしないCPUアーキテクチャが普及する可能性は非常に低いと考えられています。