今天的Web应用程序远没有原生桌面应用程序响应快,但就是WebAssembly的承诺可以做到。
WebAssembly是一种低级、类汇于汇编语言,具有紧凑的二进制格式,在Web浏览器中以接近本机的性能运行。与此同时,WebAssembly为C/C++、C#、Rust、Go、Kotlin、Swift等编程语言提供了一个可移植的编译目标。
WebAssembly被誉为提高Web应用程序性能并允许在浏览器应用程序开发中使用JavaScript以外的语言的一种方式,它到了Google、Mozilla、苹果和微软的支持,这些公司都在浏览器引擎中使用这项技术。
WebAssembly开发了一系列新技术,包括利用其强大功能的全新编程语言。以下是在WebAssembly基础上开发的10个语言项目。
Binaryen
Binaryen是用于WebAssembly的编译器工具链基础结构库。Binaryen用C++编写,旨在使汇编语言易于编写、高效、快速。它在头文件中有一个CAPI,并且可以从JavaScript中使用。输入可以采用类似WebAssembly的形式,但是对于喜欢它的编译器的开发者来说,通用控制图也是可以接受的。
Binaryen的内部IR(中间表示)使用紧凑的数据结构,并利用所有CPU内核进行并行编码和优化。IR也可以很容易地编译成WebAssembly,因为它本质上是WebAssembly的一个子集。特定于WebAssembly的优化是,提高了代码数量和效率,使得Binaryen本身可以作为编译器后端使用。
BlazorWebAssembly
BlazorWebAssembly是一个框架,用于使用.NET构建交互式、客户端、单页web应用程序,并将这些应用程序托管在基于WebAssembly的.NET运行时上的浏览器(包括移动浏览器)中。不需要插件或将代码重新编译成其他语言。运行时允许.NET代码通过WebAssembly的JavaScriptAPI访问浏览器功能。
当BlazorWebAssembly应用程序在浏览器中运行时,C#代码文件和Razor文件将被编译成.NET程序集,这些程序集与.NET运行时一起下载到浏览器。由于.NET代码是在浏览器的JavaScript沙盒中的WebAssembly上执行的,所以它会受到保护,以防客户端计算机上的恶意操作。BlazorWebAssembly应用程序可以独立部署,也可以在服务器端支持下进行部署。
Cheep
LeaningTechnologies的Cheerp被定位为用于Web的企业级C/C++编译器,将C和C++编译为C++17,并将其集成到WebAssembly、JavaScript或两者的组合中。Cheerp集成到LLVM/Clang基础结构中,通过定制优化来提高性能并最小化编译输出的大小。Cheerp主要用于将现有的C/C++库和应用程序移植到HTML5,Cheerp也可以用来编写Web应用程序和WebSasMeLabess组件。Cheerp是在开源和商业许可下提供的。
CheerpJ
CheerpJ是基于被誉为“Web的Java编译器”的LLVM编译器上运行的,它可将任何Java客户端应用程序转换为WebAssembly、JavaScript和HTML,从而使Java客户端应用程序能够在浏览器中运行。CheerpJ使用三个组件:AOT编译器、WebAssembly和JavaScript中的运行时以及JavaScriptDOM互操作性API,从Java访问DOM。使用CheerpJ,可以使用AOT编译器编译JAR档案文件。CheerpJ不需要任何服务器端支持。
Emscripten
这个开源编译器工具链将C和C++或任何其他语言使用LLVM编译器技术编入WebBaseMalk中,用于部署在Web、NoDE.JS或WASM运行中。Emscripten编译器emcc还可以具有JavaScript的功能,为编译后的代码提供API支持。Emscripten已经被用来将代码库列表转换为WebAssembly,包括商业代码库,如UnrealEngine4游戏引擎和Unity3D平台。Emscripten支持C和C++标准库、C++异常和OpenGL/WebGL图形命令。用于安装Emscripten工具链(emcc、LLVM等)的EmscriptenSDK可以在Linux、MacOS和Windows上使用。
Forest
Forest是一种可编译为WebAssembly的函数式编程语言。开发人员NickJohnstone说,Forest背后的目标是提供一种语言,使创建复杂、交互式和功能性的web应用程序变得更加容易。
目前,Forest被描述为“pre-alpha、实验性、概念研究软件”,Forest具有静态类型、模式匹配、不可变的数据结构、多种语法和自动代码格式。开发中的第一个语法受到Elm和Haskell的启发。
Forest语言的设计原则包括易于协作、尽可能简单的测试以及在结构和语义上达成一致,同时在语法上达成一致。Johnstone努力使Forest反应足够快,以构建复杂的游戏,使普通的web应用程序变得“非常快”。
Binaryen
该项目网站称,Grain语言为21世纪带来了学术语言和功能语言的特点。通过Binaryen工具链和编译器基础设施编译到WebAssembly上,Grain可以在浏览器、服务器甚至任何地方运行。没有运行时类型错误,也不需要类型注释。Grain工具链具有CLI、编译器、运行时间和标准库,作为单个二进制文件提供。开发人员只需要从Node.js和Yarn的源代码上构建Grain,Linux、MacOS和Windows都可以使用二进制文件。
JWebAssembly
JWebAssembly是一种Java字节码到WebAssembly编译器,它以Java类文件为输入,并生成WebAssembly二进制格式(.wasm文件)或文本格式(.wat文件)作为输出。目标是使用WebAssembly在浏览器中本地运行。理论上,JWebAssembly可以编译任何可以编译为Java字节码的语言,例如Clojure、Groovy、JRuby、Kotlin和Scala,有待测试。
JWebAssembly尚未准备好生产。尽管JWebAssembly1.0版本所需的所有内容都已实现,但测试仍有待完成。版本1.0路线图要求提供诸如Java字节码解析器、测试框架和Gradle插件等功能。I-NetSoftware预计今年将发布JWebAssembly1.0。
Pyodide
Pyodide项目最近从Mozilla变成了到一个独立项目,它将Python和PythonScientific堆栈编译到WebAssembly,将Python3.8运行时间、NumPy、SciPy、Matplotlib、Scikit-learn以及其他几十个包架构到浏览器中。Pyodide提供了JavaScript和Python之间对象的透明转换,并允许Python访问WebAPI。Pyodide始于年,是Iodide项目的一部分,用于在浏览器中进行数据科学研究。Pyodide可以从浏览器中的REPL试用。
虚拟机(TeaVM)
TeaVM是Java字节码的一个提前编译器,它可以使出WebAssembly和JavaScript在浏览器中运行。但是,请注意,WebAssembly支持目前还处于试验阶段。与GWT(GoogleWebToolkit)一样,TeaVM允许开发人员用Java编写应用程序并将它们部署为JavaScript。与GWT不同,TeaVM使用编译后的类文件,而不是源代码。此外,TeaVM依赖于javac、kotlinc和scalac等现有的编译器,因此可以像编译Java一样编译Kotlin和Scala代码。TeaVM主要是一个Web开发工具;它不是为了在Java或Kotlin中获取大型代码基并生成JavaScript而设计的。TeaVM子项目Flavour可以作为编写单页web应用程序的框架。