然而,事情并不那么简单。看起来LLVM IR并非完全平台无关?无论幕后的原因是什么,当将Swift编译为LLVM IR时,必须指定一个目标架构,并且WebAssembly不可用。
那么我的两个问题是:
1)我是否正确地认为目前(截至2017年10月)没有办法将Swift编译为WebAssembly?
2)使WebAssembly成为支持Swift到LLVM IR编译的目标需要什么?
1) 我知道的最新情况是在2017年11月初,你说的是正确的:目前还没有普遍可用的方法将Swift编译为WebAssembly。也许有些富有创业精神的黑客已经做到了,但如果是这样的话,她还没有与我们分享她的代码。
2) 要启用Wasm支持,您可能需要对一些不同的部分进行修改。我认为,甚至不需要了解编译器内部的细节(例如解析器和优化器),但您需要学习工具链的工作原理以及它如何在运行时与平台集成。
通过研究Swift如何移植到Android,您可以学习到很多需要做的事情。幸运的是,Brian Gesiak发布了一篇非常详细的博客文章,介绍了这个移植是如何完成的(警告:需要小额Patreon捐款):
https://modocache.io/how-to-port-the-swift-runtime-to-android
真的,如果没有阅读那篇文章,您会疯掉并开始这个项目。
虽然我不是专家,但基于那个移植和我(基本的)对Swift的理解,我认为您需要修改的大致概述如下:
#if os(WebAssembly)
#if os(WebAssembly)
特性来解决平台不规则性问题。看起来有一种商业产品支持将Swift编译为WebAssembly。RemObjects是开发工具公司,他们的Elements编译器刚刚宣布支持WebAssembly,可以编译Java、Swift、C#和Oxygene。
WebAssembly目标就像LLVM的通用Unix目标,因此我认为有人需要开发该端口。
请注意,在浏览器中使用Swift -> Wasm几乎没有用处,因为Wasm没有DOM或DOM API访问权限,因此仍然需要JavaScript才能执行任何有意义的操作,因此问题是:为什么有人要费心制作这个端口?看起来JavaScript仍然是唯一的Web语言。如果你不喜欢JavaScript,最好忘记Web开发。
很可能在Web上运行Swift之前,它将在Android上运行,因此坚持使用Swift / iOS,然后在可能时将其移植到Android。人们并不经常使用Web /浏览器。