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编译的受支持目标?
答案 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的基本理解,我认为你需要破解的粗略概述是:
#if os(WebAssembly)
#if os(WebAssembly)
功能解决平台违规问题答案 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运行时中运行,例如wasmtime,lucet或wasmer。
答案 3 :(得分:-4)
WebAssembly目标就像llvm的通用unix目标,所以我认为有人需要开发该端口。
请注意Swift - >浏览器中的WASM几乎没用,因为WASM没有DOM或DOM API访问权限,所以你仍然需要JavaScript来做任何有意义的事情,因此问题是:为什么有人会费心去做这个端口?看起来JavaScript仍然是唯一的网络语言。如果您不喜欢JavaScript,最好忘记Web开发。
有可能Swift会在Android上运行之前在Android上运行,因此坚持使用Swift / iOS,然后只要有可能就将端口设置为Android。无论如何,人们不会使用那么多的网络/浏览器。