突破2GB限制:在WebAssembly中使用异步I/O处理大型文件

2025-03-04
突破2GB限制:在WebAssembly中使用异步I/O处理大型文件

作者先前在WebAssembly中实现了setjmp,绕过了WASI libc对异常处理提案的依赖。但该方法限制在2GB以内。文章讲述了如何利用File API和Blob类型实现基于内存的文件系统,从而处理更大的文件。由于Web I/O是异步的,而系统语言通常是同步的,作者使用了Asyncify来桥接两种范式。过程中遇到了wasm-opt优化的问题,通过创建伪wasm-opt解决。最终,通过巧妙地使用volatile函数指针,成功绕过了Asyncify对`asyncjmp_rt_start`函数的错误假设,最终实现了对大型文件的异步处理。

阅读更多
开发

将Perl编译到WebAssembly:一个充满挑战的旅程

2025-02-11
将Perl编译到WebAssembly:一个充满挑战的旅程

作者在构建一个新的初创公司时,遇到了一个棘手的难题:如何在客户端提取文件元数据。ExifTool虽然强大,但其Perl语言特性导致难以在各种操作系统上进行静态编译和部署。作者尝试了各种方法,包括静态编译Perl,最终转向了WebAssembly。这个过程充满了挑战,包括与Perl的构建系统、Emscripten和WASI的斗争,以及对Perl源码的修改。最终,作者成功地构建了一个自包含的WebAssembly版本的Perl,并运行了ExifTool,但这个过程也暴露出WebAssembly运行时对异常处理的支持不足的问题。

阅读更多
开发 ExifTool

突破WebAssembly运行时限制:ZeroPerl的异步化实现

2025-02-11
突破WebAssembly运行时限制:ZeroPerl的异步化实现

作者先前因WebAssembly运行时缺乏对exnref的支持而导致ZeroPerl无法使用而感到沮丧。但他没有止步于抱怨,而是决定自己动手解决问题。通过使用Binaryen的Asyncify特性,作者从头实现了一个setjmp的替代方案,绕过了libsetjmp带来的兼容性问题。最终,经过移除官方库、编写汇编代码和使用wasm-opt优化后,ZeroPerl成功地在Wasmer、Wasmtime等多个WebAssembly运行时上运行。这标志着该项目取得了重大突破,实现了完全沙盒化且自包含的Perl WebAssembly模块。

阅读更多