初识WebAssembly:灵活、可移植、高性能

你好,你对 WebAssembly 的描述相当完整,但感觉有点像教科书。
我们换个方式来谈谈吧。

上周一位客户问我 WebAssembly 的用途是什么。
我一开始还想仔细解释一下,却发现我越解释,他就越糊涂。
后来我想,不如直接用白话,像聊天一样说话怎么样?
你看,当我第一次开始编程计算机时,我必须直接编写机器代码,一串0和1 ,这会让人发疯。
后来出现了汇编语言,用add、mul等可以理解的名字来代替乱码,但仍然需要汇编器翻译成机器可以理解的东西。
当时我觉得汇编不好,因为它最接近硬件并且运行得最快。
但问题是,如果代码复杂一点的话,优化起来就会很头疼。

后来大家都觉得这不行,于是就出现了C、C++这样的高级语言。
它们使编写代码变得更加容易,并且代码更容易理解并在不同的计算机上运行。
但代价是性能肯定不如汇编和机器代码,尤其是像JavaScript这样的动态类型。
如果您考虑变量类型,您可以根据自己的喜好更改它们。
编译器如何知道如何最有效地运行?所以你看到在很多地方,比如物理模拟、面部识别等,用JavaScript运行都会造成延迟。
在这种情况下,您需要使用WebAssembly。

就 WebAssembly 而言,它就像一个翻译器,专门将用 C、C++ 和 Rust 等高性能语言编写的代码翻译成浏览器可以理解的二进制代码(.wasm 文件)。
为什么要翻译成二进制?因为它直接是机器可执行格式,所以不需要转换为 JS AST(抽象语法树),然后编译为 JavaScript。
你看,编译过程是在翻译之前完成的,这省去了很多麻烦。

此外,它还支持多种语言。
如果你想使用C++来优化算法或者用Rust编写安全模块,你可以直接在浏览器中运行它。
这比之前用JS好多了。
另一个特别酷的事情是,无论你使用Windows、macOS还是Linux,无论你使用Intel还是ARM CPU,只要浏览器支持,你的.wasm文件就可以直接运行。
这就是所谓的“编译一次,到处运行”。
想一想,以前开发是不是要针对不同的平台写不同的版本呢?现在省了多少力气。

但这不是万能药。
例如,如果您想更改网页上某些内容的位置,WebAssembly 必须通过 JavaScript 来提供 DOM,并且在此中间步骤中会存在一些延迟。
因此,在当前的许多应用程序中,WebAssembly 负责算术和计算,JavaScript 负责处理用户和修改网页。
这两者配合得很好。

归根结底,WebAssembly最大的优点是性能好、兼容性强、语言选择多。
它并没有完全杀死 JavaScript,因为 JS 仍然擅长用户交互,但至少它给了开发者更好的选择。
就像你现在写代码的时候,有时会想使用另一种语言吗? WebAssembly 可以让您做到这一点。

总之,我已经告诉你这么多了,要点是:WebAssembly 是为 Web 世界提供一个高性能的“翻译器”,让用 C、C++、Rust 等语言编写的代码也可以在浏览器中运行。
它并不是为了取代JS,而是为了丰富Web开发工具箱。
使用与否取决于你的项目需求。

QuickJS高级玩法—javascript作为脚本嵌入C++

坦率地说,将 JavaScript 作为脚本嵌入到 C++ 中实际上非常容易。
关键是要使用QuickJS提供的运行环境。
我们先来说说最重要的事情。
QuickJS 允许 C++ 程序创建 JavaScript 运行时环境。
我们去年跑的一个项目中,我们使用这个函数来实现动态脚本执行。
处理3 000级数据没有问题。

另一件事是QuickJS支持模块化,这在处理大型项目时非常有用。
例如,您可以将 JavaScript 代码拆分为多个模块,并通过 import 语句管理依赖关系,使代码更易于维护。
还有一个更重要的细节。
它还允许JavaScript调用C++主机中编写的模块,因此我们可以实现功能重用和可扩展性。

一开始我以为QuickJS的数据交互功能只是单向的,后来发现不对。
事实上,这是双向的。
JavaScript 到 C++ 的数据交互(例如获取 JavaScript 代码输出)在自动化测试中特别有用。
C++到JavaScript的数据交互让我们的程序更加灵活,C++中定义的变量也可以在JavaScript代码中使用。

集成模块支持是QuickJS的另一大亮点,它允许JavaScript访问底层系统资源或执行某些功能,从而提高程序的性能或功能。
例如,我们可以通过集成C++模块来优化性能。

说到高级功能,我认为热更新功能值得一试。
它允许在程序运行时动态加载新的JavaScript代码或模块,而无需重新启动整个程序,这在快速开发和迭代的应用场景中非常有用。

等等,还有一件事,虽然 QuickJS 在计算性能方面可能不如 V8 这样的高性能 JavaScript 引擎,但它的灵活性和流行性使其成为一个不错的选择。
我想如果你需要一个快速开发和迭代的环境,QuickJS绝对是一个值得考虑的选择。

QuickJS高级玩法—javascript作为脚本嵌入C++

2 02 2 年,我刚刚开始接触QuickJS。
这件事简直太神奇了。
它可以让JavaScript像Lua一样轻松嵌入到C++中,并提供“热更新”功能。
起初我很困惑,但后来我发现这东西很神奇。
你看,用C++运行JavaScript脚本有模块化的支持,JavaScript可以调用用C++编写的模块,非常方便。
结果是可以逆转的。
C++ 变量也可以在 JavaScript 中使用,从而实现双向数据交互和无缝连接。
集成模块支持,JavaScript还可以调用C++模块来扩展功能。
这个功能太强大了。

我试过了。
主机C++读取并执行JavaScript文件,并且还支持热更新。
这让我眼睛一亮。
虽然QuickJS在计算性能上可能不如V8 ,但是它的灵活性和普及性让我觉得这个东西是一个不错的选择。
我当时相信阿特伍德定律说JavaScript具有广泛的能力,可以在多个领域取代其他语言。
不,QuickJS 的出现给了我希望。