将Swift编译为WebAssembly

Rob*_*ham 32 llvm swift webassembly

LLVM基础结构现在支持从LLVM IR到WebAssembly的编译(至少在实验上).Swift使用LLVM编译器基础结构,可以轻松编译为LLVM IR.所以我认为将一些Swift代码编译为LLVM IR然后编译为WebAssembly会很简单.

然而事实证明并非那么容易.看起来LLVM IR并不完全独立于平台?无论幕后的原因是什么,在将Swift编译为LLVM IR时,必须指定目标体系结构并且WebAssembly不可用.

那我有两个问题:

1)我是否正确当前(截至2017年10月)无法将Swift编译为WebAssembly?

2)如何使WebAssembly成为Swift到LLVM IR编译的受支持目标?

n8g*_*ray 25

1)据我所知,截至2017年11月初,您是正确的:没有通常可用的方法将Swift编译为WebAssembly.也许某个有进取心的黑客已经实现了它,但如果是这样,她还没有与我们分享她的代码.

2)为了启用WASM支持,您可能需要破解几个不同的部分.我认为你可以做到这一点不知道任何东西关于编译器的内部(如解析器和优化),但你需要了解它是如何的工具链工作以及如何与平台在运行时集成.

你可以学到左右你需要通过研究斯威夫特如何移植到Android做什么.幸运的是,Brian Gesiak发布了一篇非常详细的博客文章,讲述了该端口的确切运作方式(警告:需要小型Patreon捐赠):

https://modocache.io/how-to-port-the-swift-runtime-to-android

说真的,如果不阅读那篇文章,你就会疯狂地开始这个项目.

虽然我不是专家,但基于该端口和我对Swift的基本理解,我认为你需要破解的粗略概述是:

  • Swift编译器
    • 你需要教它关于LLVM使用的WASM"三元组",所以它知道如何与其余的工具链集成
    • 您需要设置WebAssembly平台,以便人们可以#if os(WebAssembly)在需要条件编译的位置进行编写
    • 您还需要设置类似的构建时宏.Android文章很好地解释了这种事情.
  • Swift运行时
    • 这是用C++编写的,需要在WASM上运行
    • 由于WASM是一个不寻常的平台,因此可能会有一些工作.您可能需要为各种系统调用等提供兼容性填充程序.
    • 像Emscripten这样的项目已经证明了很多成功将C++编译成WASM.
  • Swift标准库
    • 从理论上讲,您可以编写和运行不使用标准库的Swift代码,但是谁会想要?
    • 同样在理论上,如果运行时工作,这应该"正常工作",但你可能需要在#if os(WebAssembly)这里使用你的功能解决平台违规问题
  • 奖金:基础和调度库
    • 如果您想使用现有的Swift代码,这两个库将是必不可少的.

链接:

  • 此Github问题主要跟踪此事的进展:https://github.com/kripken/emscripten/issues/2427 (5认同)

Col*_*inE 12

看起来有一个商业产品支持Swift到WebAssembly的编译.开发人员工具公司RemObjects 刚刚宣布使用他们的Elements编译器支持WebAssembly,它可以编译Java,Swift,C#和Oxygene.


Max*_*tov 5

截至 2019 年 5 月,有一个名为SwiftWasm的开源项目可用,它允许您将 Swift 代码编译为针对WASI SDK 的WebAssembly 。这意味着 SwiftWasm 生成的二进制文件可以在具有WASI polyfill 的浏览器或支持 WASI 的独立 WebAssembly 运行时(例如wasmtimelucetwasmer )中执行