草庐IT

swift - 将 Swift 编译为 WebAssembly

coder 2023-07-14 原文

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 编译的受支持目标?

最佳答案

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) 功能来解决平台违规问题
  • 奖励:The Foundation 和 Dispatch 库
    • 如果您想使用现有的 Swift 代码,这两个库必不可少。

链接:

关于swift - 将 Swift 编译为 WebAssembly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46572144/

有关swift - 将 Swift 编译为 WebAssembly的更多相关文章

  1. ruby - 将 Ruby 2.1 编译为字节码 - 2

    同时Ruby1.9wascompilingtobytecode,它无法将预编译的脚本保存到磁盘。我们被告知期待Ruby2toallowsavingcompiledbytecode到磁盘,但我没有听到太多关于它的讨论,也没有看到无数的博客文章描述如何通过编译获得性能,我希望看到它是否真的在Ruby2.x的某个地方实现。AfocusedGooglesearch似乎没有返回任何有用的东西。在2.1(或更早版本)中可以吗?如果没有,这是否仍在路线图上? 最佳答案 有一半可能。从here下载扩展并编译它。需要库iseq.so好的,现在字节码的

  2. javascript - 如何将 Ruby 编译为 Javascript? - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭9年前。Improvethisquestion我正在研究一段我想在服务器和浏览器中表达的逻辑。类似于验证表单,其中必须根据已输入的内容在元素之间存在特定的逻辑关系。所以...如果我可以一次编写逻辑并以某种方式同时使用Ruby和Javascript,我可以只编写一次逻辑而不必担心确保

  3. ruby - 是否可以像 Python 一样将 Ruby 编译为字节码? - 2

    在Python中,如果我想发布一个没有源代码的应用程序,我可以将它编译成字节码.pyc,有没有办法在Ruby中做类似的事情? 最佳答案 我写了一个muchmoredetailedanswertothisquestion在问题“CanRuby,PHP,orPerlcreateapre-compiledfileforthecodelikePython?”中答案是:视情况而定。Ruby语言没有编译为字节码和/或运行字节码的规定。它也没有字节码格式的规范。原因很简单:如果语言实现者被迫使用特定的字节码格式,甚至根本不使用字节码,那么对语言实

  4. javascript - 如何使用 Webassembly (wasm) 访问和修改文档对象模型 (DOM)? - 2

    关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭6年前。Improvethisquestion我知道webassembly(wasm)仍处于起步阶段,但我想知道我是否以及如何使用它来更改DOM(就像我使用Javascript来更改DOM一样)更改DOM)。这是官方页面:WasmMVP

  5. javascript - 在 mac 上使用 cython 和 emscripten 将简单的 python 程序编译为 javascript - 2

    我正在尝试使用cython和emscripten从python生成javascript。你好.py:print'Helloworld.'然后我用cython把它编译成c>>>cython--embedhello.py-v这会生成一个hello.c文件,我用它来编译>>>gcchello.c-I/usr/include/python2.7/-lpython2.7这适用于gcc或clang。当我执行./a.out时,我得到了预期的输出>>>./a.out>>>Helloworld接下来我想使用emscripten将hello.c编译成javascript>>>emcchello.c-I/u

  6. javascript - 使用 Babel.js 将 ES6 箭头函数编译为 Es5 - 2

    在Mozilla文档中查看ES6箭头函数的文档时,我了解到箭头函数应用严格模式的所有规则,除了在link中描述的规则。varf=()=>{'usestrict';returnthis};varg=function(){'usestrict';returnthis;}console.log(f());//printsWindowconsole.log(g());//printsundefined//wecantestthisinfirefox!但是,Babel.js将箭头函数代码转换为ES5代码,返回undefined而不是Window(demolink)"usestrict";setT

  7. javascript - 如何使用 Brython 将 Python 编译为 Javascript(以与 nodejs 一起运行)? - 2

    如何使用Brython将Python编译成Javascript?我想在我的计算机上执行此操作,因此我可以使用nodejs运行Javascript,例如。$pythonhello.pyHelloworld$brythonhello.py-ohello.js$nodehello.jsHelloworldBrython网站上的示例仅解释了如何在浏览器中执行此操作http://www.brython.info/index_en.html 最佳答案 看起来它们非常面向浏览器,没有开箱即用的命令行选项。您可以尝试自己从node.js中使用他们的

  8. javascript - V8 引擎将 JavaScript 编译为机器代码。那么,为什么 node.js 不比 C 快? - 2

    根据languagebenchmarks,JavaScriptV8在regex-dna程序上比其他编程语言更快。那么,为什么node.js应用程序(即http服务器)不比C应用程序(即Nginx、Lighttpd)快? 最佳答案 因为V8应用程序是javascript应用程序。即使javascript最终被编译为机器代码,运行时特性也不同。例如,如果您在一个对象中调用一个函数,而该对象没有定义该函数,则运行时必须通过遍历原型(prototype)层次结构来定位该函数,该层次结构可以在程序的生命周期中随时更改。可以进行巧妙的优化,但开

  9. javascript - 从 JavaScript 调用 WebAssembly 中的 C 风格函数指针 - 2

    有什么方法可以访问WebAssembly模块中的函数指针吗?例如,给定以下编译为WebAssembly的“模块”:externvoidset_callback(void(*callback)(void*arg),void*arg);staticvoidcallback(void*arg){/*...*/}intmain(){set_callback(&callback,0);return0;}JavaScript中do_callback的实现是否可以调用回调而不必依赖中间C函数导出来执行实际函数调用?varinstance=newWebAssembly.Instance(module,

  10. javascript - Apache Cordova 可以编译为旧版 Windows 桌面应用程序(非 Metro)吗? - 2

    我需要开发一个应用程序来检索和保存与用户交互的数据,高度重视多平台支持和快速开发。该应用程序不需要繁重的图形或处理等。我正在考虑使用ApacheCordova。它能否在Windows上作为native桌面应用程序编译和运行(而不是作为WinRTmetro应用程序)?Windows7和XP怎么样? 最佳答案 有一个windows7cordovahttps://github.com/otcshare/cordova-win7更多信息:http://www.raymondcamden.com/2012/07/12/Windows-7-ve

随机推荐