web-dev-qa-db-ja.com

コンパイルSwift to WebAssembly

LLVMインフラストラクチャは、 LLVM IRからWebAssembly (少なくとも実験的に)からのコンパイルをサポートするようになりました。 SwiftはLLVMコンパイラインフラストラクチャを使用し、LLVM IRに簡単にコンパイルできます。だから、SwiftコードをLLVM IRにコンパイルしてから、 WebAssemblyに。

しかし、それほど簡単ではないことが判明しました。 LLVM IRは完全にプラットフォームに依存しているわけではないようです。舞台裏の理由が何であれ、Swift=をLLVM IRにコンパイルする場合、ターゲットアーキテクチャを指定する必要があり、WebAssemblyは使用できません。

次に、2つの質問があります。

1)現在(2017年10月現在)SwiftをWebAssemblyにコンパイルする方法はありませんか?

2)WebAssemblyをSwift to LLVM IRコンパイルのサポート対象にするためには何が必要ですか?

32
Rob Mecham

1)2017年11月初旬の私の知る限り、あなたは正しいです:Swift to WebAssembly。おそらく、どこか進取の気性のあるハッカーがどこかでそれを起こしたかもしれませんが、そうであれば彼女はまだ私たちとコードを共有していません。

2)WASMサポートを有効にするには、おそらくいくつかの異なる部分をハッキングする必要があります。コンパイラーの内部(パーサーやオプティマイザーなど)についてほとんど何も知らなくてもできると思いますが、実行時にツールチェーンがどのように機能し、プラットフォームとどのように統合されるかについて学ぶ必要があります。

tonを学ぶことができます。SwiftがAndroidに移植された方法を調べることで、何をする必要があるかを知ることができます。幸いなことに、Brian Gesiakはreallyそのポートがどのように機能したかについての詳細なブログ投稿(警告:小さなPatreonの寄付が必要です):

https://modocache.io/how-to-port-the-Swift-runtime-to-Android

真剣に、あなたはその記事を読まずにこのプロジェクトに乗り出すのに夢中になるでしょう。

私は[〜#〜]ではない[〜#〜]専門家ですが、そのポートと私の(基本的な)Swiftの理解に基づいて、どこでの大まかな概要を考えますあなたがハックする必要があるだろう:

  • Swift compiler
    • LLVMで使用されるWASM「トリプル」について説明する必要があるため、LLVMは他のツールチェーンと統合する方法を知っています。
    • 条件付きコンパイルが必要な場所で#if os(WebAssembly)を記述できるように、WebAssemblyプラットフォームをセットアップする必要があります。
    • また、同様のビルド時マクロを設定する必要があります。 Androidの記事は、この種のことを本当によく説明しています。
  • Swift runtime
    • これはC++で書かれており、WASMで実行する必要があります
    • WASMは珍しいプラットフォームなので、おそらくここでいくつかの作業が行われるでしょう。さまざまなシステムコールなどに互換性シムを提供する必要がある場合があります。
    • Emscriptenのようなプロジェクトは、C++をWASMにコンパイルする多くの成功を実証しています。
  • Swift=標準ライブラリ
    • 理論的には、Swift標準ライブラリを使用しないが、だれがしたいコードを記述して実行できますか?
    • また、理論的には、ランタイムが機能する場合は「機能する」はずですが、プラットフォームの不規則性を回避するには、ここで#if os(WebAssembly)機能を使用する必要があります。
  • ボーナス:FoundationおよびDispatchライブラリ
    • 既存のSwift=コードを使用する場合、これらの2つのライブラリは不可欠です。

リンク:

24
n8gray

SwiftのWebAssemblyへのコンパイルをサポートする商用製品があるようです。開発者ツール会社であるRemObjectsは、 ElementsコンパイラによるWebAssemblyのサポートを発表したばかりです 、 Java、Swift、C#、およびOxygeneをコンパイルできます。

12
ColinE

2019年5月現在、 SwiftWasm という名前のオープンソースプロジェクトがあり、これを使用してSwift= WebAssemblyターゲティングのコードを WASI SDK にコンパイルできます。 SwiftWasmによって生成されたバイナリは、ブラウザで WASI polyfill を使用して、または wasmtimelucet または-などのWASIをサポートするスタンドアロンWebAssemblyランタイムのいずれかで実行できることを意味します wasmer

2
Max Desiatov