哪些语言可以编译成 WebAssembly (Wasm)? [关闭]

Posted

技术标签:

【中文标题】哪些语言可以编译成 WebAssembly (Wasm)? [关闭]【英文标题】:What languages can be compiled to WebAssembly (Wasm)? [closed] 【发布时间】:2017-09-18 08:21:26 【问题描述】:

哪些语言可以编译成 WebAssembly (Wasm)?

我相信现在 C、C++ 和 Rust(实验性)可以通过 llvm 编译器后端编译为 WebAssembly,目前不支持 Java、Swift 和 C# 等语言,但可能是未来开发的候选者。

我不相信 javascript 可以编译成 Wasm。 https://github.com/WebAssembly/design/issues/219

【问题讨论】:

作为对任何阅读本文的人的说明,我最近通过 emscripten 将 C 和 C++ 用于 WASM,并且效果非常好。 【参考方案1】:

WebAssembly 支持不断发展。目前支持以下语言:

C / C++ - 通过EmScripten 或其他minimal LLVM-based toolchains 提供非常好的(生产就绪)支持

Rust - WebAssembly 是官方支持的目标,它周围有一个 highly active community。

Go - 将 now supports WebAssembly 作为官方的、实验性的目标

C# - 通过 Blazor 提供实验性支持,但是目前需要将 .NET 运行时嵌入到 Wasm 中。 Blazor 作为一项实验性技术被微软正式采用,recent preview release。

D - D 的“betterC”子集可以编译为 WebAssembly through LDC(LLVM 编译器)。

TypeScript - 来自 AssemblyScript,高度实验性,但势头强劲。

Java - 通过TeaVM 或Bytecoder

Haxe - just announced support

Kotlin - Kotlin/Native 0.4 gained experimental support 的 WebAssembly 和通过 TeaVM

Python - Pyodide 是 Python 到 WebAssembly 的一个端口,其中包括科学 Python 堆栈(Numpy、Pandas、matplotlib)的核心包。

PHP - 实验性的,但带有 working prototype

Perl - WebPerl 是 Perl 二进制文件到 WebAssembly 的端口,允许您在 Web 上运行 Perl 脚本。

Scala - 使用 Emscripten compiler 和 TeaVM

Ruby - 通过run.rb 项目

Swift - 使用SwiftWasm

也有商业解决方案:

RemObjects - 其中有 announced support for C#, Java, Swift and Oxygene

关于 JavaScript,它不太可能获得支持,因为 WebAssembly 是一种静态类型的汇编语言。

还有各种支持 WebAssembly 的更晦涩/业余爱好者的语言。更多详细信息可以在更详尽的Awesome WebAssembly Languages 列表中找到。

【讨论】:

商业 C#/Java/Swift 实现:blogs.remobjects.com/2018/01/12/…。另外:github.com/appcypher/awesome-wasm-langs 好点 - 我已将 RemObjects 添加为它自己的一个类别,因为它是多语言和商业的 但是Python是动态类型的! 它是强类型的 github 上有一个新项目允许将 TypeScript 编译为 WASM - (TypeScript Native Compiler) github.com/ASDAlexander77/TypeScriptCompiler【参考方案2】:

参见https://github.com/mbasso/awesome-wasm#compilers -- 目前只有 C/C++,其他都是实验性的,但“实验性”部分的数量在增加。

目前 WebAssembly 仅支持平面线性内存。这适用于 C/C++/Rust 和许多其他语言,但大多数流行的现代语言都需要垃圾收集器才能运行。这是 WebAssembly 的“后 MVP 功能”(参见 https://github.com/WebAssembly/design/issues/1079)。目前唯一的选择是使用一些自定义代码在 wasm 中实现垃圾收集器。

【讨论】:

值得补充的是,asm.js 可以很容易地编译成 wasm 和 asm.js is javascript。也就是说,编译 javascript 会/会更加困难,因为它通常缺少尽可能多的即时可用的上下文信息。【参考方案3】:

This repo

包含当前编译为 WebAssembly(wasm) 或将其 VM 包含在 WebAssembly(wasm) 中的语言列表

特点:

使用表情符号来展示每种语言目前的成熟程度 提供每种语言项目名称和选项的链接

【讨论】:

“使用表情符号来展示每种语言目前的成熟程度”给自己读了几遍……这是一个非常深刻的声明。 是的,简单直观的解释加上愚蠢的表达方式。 ? - 正在进行中。 ? - 不稳定但可用。 ? - 稳定的生产使用。【参考方案4】:

TeaVM 可用于将 JVM 字节码转换为 WebAssembly。您可以通过https://github.com/konsoletyper/teavm查看项目主页。

TeaVM 的核心可以将 JVM 字节码转换为 JS 和 WebAssembly。 WebAssembly 支持处于早期阶段,但有演示可用于比较简单的 JBox2D 模拟与 GWT、TeaVM(JS 输出)和 TeaVM(WASM 输出)的性能,这些都令人印象深刻。

请注意,WebAssembly 目前无法直接访问 DOM 或其他 JavaScript API。同样在当前的 MVP 中,不支持不透明数据类型甚至 GC。但是,可以使用一些 JS 技巧从 JS 到 WASM 进行向上/向下调用,然后再返回,如提到的演示中所示。

【讨论】:

以上是关于哪些语言可以编译成 WebAssembly (Wasm)? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

WebAssembly:随风潜入夜

我们用WebAssembly将Web App速度提升了20倍!

Blazor WebAssembly + Grpc Web=未来?

用 go 写 WebAssembly入门

再次 WebAssembly 技术探讨

记一次完整 C++ 项目编译成 WebAssembly 的实践