找回密码
 会员注册
查看: 8|回复: 0

WebAssembly生态及关键技术综述

[复制链接]

4

主题

0

回帖

13

积分

新手上路

积分
13
发表于 2024-9-30 07:59:26 | 显示全部楼层 |阅读模式
小编:本文由 WebInfra 团队姚忠孝,杨文明,张地编写。主要以全局视角论述 WebAssembly 技术生态发展情况以及其中涉及到的关键技术。是建立完整技术认知和体系的综述性文章,文章链接较多,建议在 PC 上访问阅读。WebAssembly 作为字节码和内存模型规范看起来非常简单且实现起来很有趣,随着WebAssembly 规范的演进,新技术不断涌现,在应用场景中构建自己的生态系统,并不断发展成为一个成熟的平台。按上图所示开发模式,开发者可以通过特定的语言生态开发、发布和执行应用; 那么选择WebAssembly 的动机是什么呢?社区有很多这方面的讨论,总结可能有如下几方面。首先,大型软件需要解决不同开发语言的协作问题(交互和集成),不同语言的交互一般需要语言特定的 FFI ,而没有统一的集成方式和接口(组合爆炸问题);交互过程中会引入额外的损耗(内存和性能)其次,不同的语言发布的程序采用各自的方式部署和运行,对安全性,隔离性,跨平台等方面都会各自面临相同的问题,而没有统一的机制解决。再次,对于开发者来说,为了满足项目中不同部分的需求,需要采用不同的语言来开发,开发者需要掌握多种不同类型的语言,技术栈负担重。最后,不同的语言是为解决特定的问题,会在其他方面做妥协(例如,脚本语言 JS , Ruby 开发者门槛低,但性能也低),对于已有模块的复用和迁移代价较大,无论是语言间相互转换( transcompile )还是重写都需要付出极大的代价。WebAssembly 作为一个可安全隔离,高效,体积小、跨平台,多语言支持的可移植二进制中间形式,可以很好的为解决如上几方面的问题提供可行的路径,不同的开发者可以根据需要利用 WebAssembly 的某一个或多个特性来满足业务需求。https://www.youtube.com/watchv=fh9WXPu0hw8如上图所示,对于 JS/Python 等脚本语言来说,为了追求更高的性能,可以将性能热点模块通过 WebAssembly 来实现,从而获取高性能执行的收益。对于 Rust 开发者来说,利用语言的特性可以获取高性能和高安全性,但为了让开发者获得更低的开发门槛,可以编译为 WebAssembly 模块提供给类似 JS , Python 等脚本语言使用,降低开发者门槛;对于 C++ 开发者来说,可以获得高性能,但 C++ 不完备的安全性机制可能会使应用存在安全隐患,可以将其编译为 WebAssembly 在轻量级安全沙箱中运行,从而使得安全机制做到开箱即用(安全性保障需要安全领域的专业支持,门槛很高)WebAssembly 生态包括开发者(开发语言),编译工具链,利于高性能执行和体积小的WebAssembly Binary 标准格式,与各种编程语言友好集成机制( binding ),以及高性能跨平台的执行引擎组成。WebAssembly Languages & ToolChains https://github.com/appcypher/awesome-wasm-langsWebAssembly 为了良好的开发者生态,支持越来越多的语言编译成 WebAssembly 。语言的支持程度取决于各自编译器的编译工具链的成熟度,如下部分将梳理相对成熟的几个可以编译成 WebAssembly 的语言及其编译工具链情况。1.1 C/C++WebAssembly 已经作为 LLVM 的一个默认支持的后端,通过 Clang 可以将 C/C++ 代码直接生成 WebAssembly 目标程序(https://zhuanlan.zhihu.com/p/339950505);Emscripten 工具链主要提供了常用的 C/C++ 库( sys-libs ),并在 LLVM 的基础上集成了Binaryen 的模块,对 WebAssembly 做进一步优化同时生成 JavaScript API 以便于宿主环境通过 JS 接口集成 WebAssembly 代码。sys-libs: https://github.com/emscripten-core/emscripten/tree/main/system/libEmscripten: https://github.com/emscripten-core/emscriptenBinaryren: https://github.com/WebAssembly/binaryenstandalone WebAssembly: https://v8.dev/blog/emscripten-standalone-wasm1.2 RustRust 语言是基于 LLVM 后端实现的编程语言。在编译器层面来说,Rust 编译器仅仅是一个编译器前端,它负责从文本代码一步步编译到LLVM中间码(LLVM IR),然后再交给LLVM来最终编译生成机器码或 WebAssembly 代码,所以对于 WebAssembly 代码生成利用的是LLVM编译后端。Rust 生态中,Cargo 和 wasm-bindgen 可以自动化编译过程,生成 WebAssembly 的主语言绑定代码,大大简化了 WebAssembly 模块的生成和使用成本。1.3 GOTinyGo 是基于 LLVM 后端实现的 Go 编译器。在编译器层面来说,TinyGo 仅仅是一个编译器前端,它负责从文本代码一步步编译到LLVM中间码(LLVM IR),然后再交给LLVM来最终编译生成机器码或 WebAssembly 代码(编译器结构参照 Rustc )。Go compiler for small places. Microcontrollers, WebAssembly, and command-line tools. Based on LLVM. https://github.com/tinygo-org1.4 JavaJava 是基于类的、面向对象的一种通编程语言。Java 以类为单位将程序编译为字节码在虚拟机上运行,从而实现“编写一次,随处运行”(WORA)。TeaVM - Java 字节码的静态编译器(AOT),它生成的 JavaScript 和 WebAssembly 可以在浏览器中运行。TeaVM 不需要源代码,只需要编译好的类文件,所以 TeaVM 可以处理任何可编译为 Java 字节码的语言,例如 Kotlin , Scala 等。https://github.com/konsoletyper/teavmBytecoder - 将 JVM 字节码解析并转换为中间表示。该中间表示通过优化器阶段传递并发送到后端实现以生成目标代码,其中 WebAssembly 后端( LLVM etc.)将中间表示转换为 WebAssembly 文本和二进制代码。https://github.com/mirkosertic/BytecoderCheerpJ - 是基于 LLVM 的 Java 字节码到 WebAssemlby/Javascript 的 AOT 编译器。可用于将Jar或单个.class 文件转换为WebAssembly或者JavaScript。https://github.com/leaningtech/cheerpj-metaJWebAssembly 将 Java 字节码编译为 WebAssembly 。它使用 Java 类文件作为输入,可以编译任何可以编译为 Java 字节码的语言,例如 Clojure、Groovy、JRuby、Jython、Kotlin 和 Scala。作为输出,它生成二进制格式(.wasm 文件)或文本格式(.wat 文件)。目标是使用 WebAssembly 在浏览器中本地运行 Java。与类似项目的不同之处在于,不需要移植具有完整 GC 和内存管理的完整 VM 。它更像是 1:1 的转换。生成的 WebAssembly 代码与原始 Java 类文件的大小相似。https://github.com/i-net-software/JWebAssembly1.5 Javascript/TypeScript/AssemblyScript1.5.1 Assemblyscripthttps://github.com/AssemblyScript/assemblyscript/blob/main/src/README.mdhttps://github.com/WebAssembly/binaryenAssemblyScript 是面向 WebAssembly 标准的严格类型化的 TypeScript 变体,通过 Binaryen 后端编译为 WebAssembly 。如下图所示,TypeScript 和对应的 lib 库通过编译器前端生成AssemblyScrip t,并集成 Glue 代码片段利用 Binaryen 后端生成 WebAssebmly Module。AssemblyScript 是面向 WebAssembly 标准设计和演进,随着 WebAssembly 2.0 标准演进(类型和指令扩展),AssemblyScript 也向着"通用"的方向演进(类型系统扩展,语法扩展)AssemblyScript 可以通过 TS 标准库的方式扩展能力,在其 low-level 低级功能(类型系统)之上提供类似 JavaScript 的"通用"标准库等。(https://www.assemblyscript.org/introduction.html#from-a-javascript-perspective)1.5.2 Assemblyscript
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-15 18:11 , Processed in 0.566120 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表