将Swift编译为WebAssembly

时间:2017-10-04 18:51:11

标签: swift llvm webassembly

LLVM基础架构现在支持从LLVM IR to 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编译的受支持目标?

4 个答案:

答案 0 :(得分:23)

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

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

通过研究Swift如何移植到Android,您可以了解 ton 您需要做什么。幸运的是,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代码,这两个库将是必不可少的。

链接:

答案 1 :(得分:12)

看起来有一个商业产品支持Swift到WebAssembly的编译。开发人员工具公司RemObjects有just announced support for WebAssembly with their Elements compiler,它可以编译Java,Swift,C#和Oxygene。

答案 2 :(得分:1)

从2019年5月开始,有一个名为SwiftWasm的开源项目,您可以将Swift代码编译为以WASI SDK为目标的WebAssembly。这意味着SwiftWasm生成的二进制文件可以在带有WASI polyfill的浏览器中执行,也可以在支持WASI的独立WebAssembly运行时中运行,例如wasmtimelucetwasmer

答案 3 :(得分:-4)

WebAssembly目标就像llvm的通用unix目标,所以我认为有人需要开发该端口。

请注意Swift - >浏览器中的WASM几乎没用,因为WASM没有DOM或DOM API访问权限,所以你仍然需要JavaScript来做任何有意义的事情,因此问题是:为什么有人会费心去做这个端口?看起来JavaScript仍然是唯一的网络语言。如果您不喜欢JavaScript,最好忘记Web开发。

有可能Swift会在Android上运行之前在Android上运行,因此坚持使用Swift / iOS,然后只要有可能就将端口设置为Android。无论如何,人们不会使用那么多的网络/浏览器。