https://github.com/bibibala/webassembly-sample
Use Cheerp or emsdk, from compiling to wasm to using cases.使用Cheerp或者emsdk,从编译为wasm到使用的案例
https://github.com/bibibala/webassembly-sample
cheerp emsdk wasm webassembly
Last synced: 6 months ago
JSON representation
Use Cheerp or emsdk, from compiling to wasm to using cases.使用Cheerp或者emsdk,从编译为wasm到使用的案例
- Host: GitHub
- URL: https://github.com/bibibala/webassembly-sample
- Owner: bibibala
- License: mit
- Created: 2024-11-20T08:58:53.000Z (about 1 year ago)
- Default Branch: main
- Last Pushed: 2025-01-16T08:34:00.000Z (12 months ago)
- Last Synced: 2025-03-02T09:14:44.786Z (11 months ago)
- Topics: cheerp, emsdk, wasm, webassembly
- Language: JavaScript
- Homepage: https://webassembly-sample.netlify.app/
- Size: 146 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
Cheerp 和 Emscripten(EMSDK 是 Emscripten 开发工具包)都是将 C/C++ 代码编译为 WebAssembly(WASM)的工具链,但它们的功能、设计哲学和适用场景有一些显著的区别。以下是它们的主要区别:
---
### **1. 基本定位**
| 特性 | Cheerp | Emscripten (EMSDK) |
| ------------ | -------------------------------------------------- | ------------------------------------------- |
| **目标** | 专注于将 C++ 编译为适合 Web 使用的高性能代码 | 更通用,支持生成 WebAssembly 和 asm.js 代码 |
| **生成目标** | 可生成纯 `.wasm` 文件,也支持带有桥接 `.js` 的输出 | 通常生成 `.js`(作为桥)和 `.wasm` 文件 |
| **设计哲学** | 轻量化、易集成 | 功能丰富,但文件较大,生成复杂 |
---
### **2. 输出文件差异**
| 特性 | Cheerp | Emscripten |
| -------------------------- | ------------------------------------- | --------------------------------------- |
| **生成的 JavaScript 文件** | 轻量化,基本上只提供 WebAssembly 桥接 | 较重,包含大量 runtime 和 Polyfill |
| **文件依赖性** | 更倾向直接使用 WebAssembly | 提供完整的 JS runtime,与 WASM 配合使用 |
| **运行时开销** | 更小(代码更简洁) | 更大(功能更全面,支持更复杂的场景) |
---
### **3. 支持的功能**
| 功能 | Cheerp | Emscripten |
| --------------------- | -------------------------------- | ------------------------------------------ |
| **WebAssembly 导出** | 支持,较轻量,但需要显式定义导出 | 完全支持,可通过 `EXPORTED_FUNCTIONS` 配置 |
| **多线程支持** | 部分支持 | 强大支持,内置对 WebWorker 的封装 |
| **文件系统模拟 (FS)** | 无内置文件系统模拟 | 提供 `MEMFS` 和 `NODEFS` 等文件系统模拟 |
| **标准库支持** | 支持常用 C++ 标准库 | 支持完整的 C/C++ 标准库(较大开销) |
| **异步 API 支持** | 部分支持,需手动实现 | 强大支持,提供 Asyncify 等工具 |
---
### **4. 适用场景**
| 场景 | Cheerp | Emscripten |
| --------------------- | ---------------------------------------------- | --------------------------------------------- |
| **轻量化应用** | 非常适合,生成代码更小,尤其适合小型 WASM 应用 | 较不适合,runtime 开销较大 |
| **复杂游戏/引擎移植** | 不太适合,缺少对复杂场景的直接支持 | 非常适合,广泛用于 Unity、Unreal 等引擎的移植 |
| **多线程/复杂 I/O** | 不太适合,需手动实现多线程支持和文件系统 | 非常适合,内置支持多线程和模拟文件系统 |
| **跨平台支持** | 针对 Web 优化,更适合直接在浏览器中运行 | 更通用,支持 Node.js 和多种平台 |
---
### **5. 性能和优化**
| 特性 | Cheerp | Emscripten |
| --------------- | ------------------------------------ | ---------------------------------------- |
| **性能优化** | 更注重生成小文件和直接调用 WASM 函数 | 注重兼容性,但生成代码更复杂,运行时较大 |
| **支持 asm.js** | 不支持 | 支持,可用于不支持 WASM 的浏览器 |
---
### **6. 使用方式**
- **Cheerp**:更简单,通常通过 `clang` 编译:
```bash
clang++ -target cheerp -o output.js your_code.cpp
```
或直接生成 `.wasm` 文件:
```bash
clang++ -target cheerp -cheerp-mode=wasm -o output.wasm your_code.cpp
```
- **Emscripten**:配置稍复杂,使用 `emcc` 编译:
```bash
emcc your_code.cpp -o output.js -s EXPORTED_FUNCTIONS=['_main']
```
---
### **7. 文件体积对比**
| 工具 | 简单 C++ 程序生成的文件大小 | 完整 WebAssembly 项目 |
| -------------- | -------------------------------- | --------------------- |
| **Cheerp** | 更小,通常只有几 KB | 文件较小,运行时轻量 |
| **Emscripten** | 较大,通常包含 100KB+ 的 runtime | 文件较大,功能更全面 |
---
### **8. 总结**
- **选择 Cheerp 的场景:**
- 希望生成小体积的 WebAssembly 文件。
- 不需要复杂的功能,例如文件系统模拟、多线程支持。
- 适合轻量化 Web 应用或工具。
- **选择 Emscripten 的场景:**
- 需要完整的 C++ 标准库支持。
- 希望移植复杂应用,如游戏引擎或多线程程序。
- 对文件体积要求不严格,但需要功能全面。
如果你的目标是浏览器端的轻量化 WASM 应用程序,**Cheerp 更适合**;如果你需要移植大型项目并希望获得更高的功能兼容性,**Emscripten 更强大**。