将Swift编译为WebAssembly

34
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编译的目标需要什么?

我认为你需要自己构建LLVM,因为它默认不支持webm。 - Rakete1111
2
是的,没错。我有一个使用WebAssembly支持的LLVM版本的自定义版本。我已经成功地将C代码编译成了WebAssembly。但现在我想将Swift代码编译成WebAssembly,为此,正确的LLVM构建似乎是必要但不足的。据我所知,在Swift本身中需要一些对WebAssembly的支持。 - Rob Mecham
1
请关注此空间 - https://github.com/kripken/emscripten/issues/2427 - johndpope
5个回答

26

1) 我知道的最新情况是在2017年11月初,你说的是正确的:目前还没有普遍可用的方法将Swift编译为WebAssembly。也许有些富有创业精神的黑客已经做到了,但如果是这样的话,她还没有与我们分享她的代码。

2) 要启用Wasm支持,您可能需要对一些不同的部分进行修改。我认为,甚至不需要了解编译器内部的细节(例如解析器和优化器),但您需要学习工具链的工作原理以及它如何在运行时与平台集成。

通过研究Swift如何移植到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)特性来解决平台不规则性问题。
  • 奖励:Foundation和Dispatch库
    • 如果您想使用现有的Swift代码,则这两个库将是必不可少的。
  • 链接:


    5
    此外,这个事情的进展大部分都在这个 Github 问题中进行跟踪:https://github.com/kripken/emscripten/issues/2427 - Alper

    12

    看起来有一种商业产品支持将Swift编译为WebAssembly。RemObjects是开发工具公司,他们的Elements编译器刚刚宣布支持WebAssembly,可以编译Java、Swift、C#和Oxygene。


    5

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


    1
    我正在寻找一种将Swift代码转换为Web Assembly的方法,然后我发现了这个网站:https://swiftwasm.org/。我不知道这个平台有多成熟(截至2022年10月),也不知道它是否能够兴旺发展,但拥有这种能力是令人兴奋的。此外,它还提供了一种在Swift中直接编写JavaScript的手段。

    -4

    WebAssembly目标就像LLVM的通用Unix目标,因此我认为有人需要开发该端口。

    请注意,在浏览器中使用Swift -> Wasm几乎没有用处,因为Wasm没有DOM或DOM API访问权限,因此仍然需要JavaScript才能执行任何有意义的操作,因此问题是:为什么有人要费心制作这个端口?看起来JavaScript仍然是唯一的Web语言。如果你不喜欢JavaScript,最好忘记Web开发。

    很可能在Web上运行Swift之前,它将在Android上运行,因此坚持使用Swift / iOS,然后在可能时将其移植到Android。人们并不经常使用Web /浏览器。


    3
    是的,似乎支持将WASM作为Swift编译目标需要额外的开发。问题#2的要点是询问在哪里可以开始进行相关开发。可以想象,在没有直接DOM访问的情况下,WASM代码对Web开发仍然有用处。例如,验证函数可以用Swift编写,在服务器端和客户端使用,再加上一些JavaScript代码在客户端上调用验证函数即可。尽管如此,如果WASM具有DOM访问权限,它肯定会更加有用,但是一步一个脚印,不是吗? - Rob Mecham

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接