当前位置:首页 > 技术分析 > 正文内容

从免费的c++online编译到跨平台WASM机制的学习

ruisui882个月前 (04-07)技术分析31

使用cplusplus.com的时候,你会发现demo 代码可以点击运行。

其运行的后端是https://cpp.sh/about.html

一个叫做cpp.sh的服务。

看描述,其是把c++代码上传到服务端执行编译,并生成web assmebly code 返回给浏览器。

然后我们的浏览器在本地帮我们运行这个代码,并把结果输出到了我们的浏览器ui上面。

C++ Shell v2, free online compiler, proudly uses emscripten to compile your code.

emscripten is a clang-based compiler toochain that produces WebAssembly code, which can run directly in most modern browsers.

Using cpp.sh, your code is compiled on the server, and its wasm-code equivalent is produced. This code is then safely run locally in a Web Worker on your own browser.

Please, note that due to the limitations of the target platform, certain system calls may fail.

Comments and error reports to: admin@cppshell.com

是不是玩的很6.

于是看了下wasm的生成例子,看看他多了些什么步骤。
https://emscripten.org/docs/getting_started/Tutorial.html。

发现其描述可以一个代码,生成wasm code后可以运行到浏览器,服务器,边缘设备,

而且cpu指令无感,可以是x86, arm,risc-v等。还是能节约不少效率。

继而咨询元宝-Deepseek-r1, 其反馈运行的时候有一个wasm解析器帮忙把wsm code最终翻译成运行时环境的机器吗。

哪这里有点意思了,因为我们知道这种类似的实现较多,但为什么还要搞出这个呢。

我们看看python javascript 这些都是跨平台的, 需要虚拟机支持。但是其效率会很差。

据wasm code反馈其效率接近c的代码效率。而且支持c c++ rust代码生成wasm code。
wasmcode支持沙箱隔离,可以限制宿主机的文件系统和网络的访问, 不过编译当然也可以打开。避免多线程应用的内存问题。内存隔离。

咨询AI后给了一个实际例子
其可以利用x86 c++代码的能力完成移植到arm risc-v
分步解释

是的,通过以下流程可以实现跨平台部署,但需满足运行时环境要求:


1. 跨平台编译流程

  • 步骤 1:在 CentOS x86 上编写 C++ 代码,通过 EmscriptenClang/LLVM 编译为 .wasm 文件。
    • 示例命令(使用 Emscripten):
    • bash
    • emcc main.cpp -o output.wasm
    • 关键点:此时生成的 .wasm 文件是平台无关的,不绑定 x86 或 ARM。
  • 步骤 2:将 output.wasm 文件部署到 CentOS ARM 服务器,无需重新编译。

2. ARM 服务器上的执行工具

要在 ARM 平台上运行 Wasm 代码,需安装 Wasm 运行时环境,常见选项包括:

选项 1:WasmEdge(推荐)

  • 安装方法(CentOS ARM):
  • bash
  • curl -sSL https://github.com/WasmEdge/WasmEdge/releases/latest/download/WasmEdge-<version>-manylinux2014_aarch64.rpm -o wasmedge.rpm sudo rpm -i wasmedge.rpm
  • 运行命令
  • bash
  • wasmedge output.wasm

选项 2:Node.js(内置 Wasm 支持)

  • 安装 Node.js
  • bash
  • curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - sudo apt-get install -y nodejs
  • 运行代码
  • javascript
  • // 创建 test.js 文件 const fs = require('fs'); const wasmBuffer = fs.readFileSync('output.wasm'); WebAssembly.instantiate(wasmBuffer).then(module => { module.instance.exports._start(); // 调用入口函数 });
  • bash
  • node test.js

选项 3:Wasmtime

  • 安装方法
  • bash
  • curl -sSf https://wasmtime.dev/install.sh | bash
  • 运行命令
  • bash
  • wasmtime output.wasm

3. 跨平台验证

  • 验证原理
    Wasm 的虚拟指令集(如 i32.add)在 ARM 服务器上由运行时动态编译为本机指令(ARM 机器码),无需开发者手动适配。
  • 示例场景
    在 x86 上编译的数学计算 Wasm 模块,可直接在 ARM 服务器上通过 WasmEdge 运行,结果一致。

4. 潜在限制与解决方案

限制 1:系统调用依赖

  • 问题:若 C++ 代码调用了 Linux 系统函数(如 open()、write()),需通过 WASI 接口实现跨平台。
  • 解决方案
    编译时启用 WASI 支持:
  • bash
  • emcc main.cpp -o output.wasm -s WASI=1
  • 运行时通过 --dir 等参数授权文件访问:
  • bash
  • wasmedge --dir=. output.wasm

限制 2:线程支持

  • 问题:Wasm 的线程模型依赖宿主环境实现。
  • 解决方案
    使用支持线程的运行时(如 WasmEdge 0.12+),编译时启用线程选项:
  • bash
  • emcc main.cpp -o output.wasm -pthread -s PROXY_TO_PTHREAD

总结

  • 跨平台能力:同一 Wasm 文件可在 x86/ARM 上运行,无需重新编译。
  • 依赖工具:目标平台需安装 Wasm 运行时(如 WasmEdge、Node.js)。
  • 系统交互:若涉及文件、网络等操作,需通过 WASI 标准化接口。
  • 工具链建议:优先使用 Emscripten + WasmEdge 组合,覆盖大部分 C++ 场景。










扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/3330.html

标签: readfilesync
分享给朋友:

“从免费的c++online编译到跨平台WASM机制的学习” 的相关文章

「Git迁移」三行命令迁移Git包含提交历史,分支,tag标签等信息

问题描述:公司需要将一个git远程服务器的全部已有项目迁移到一台新服务器的Gitlab中,其中需要包含全部的提交纪录,已有的全部分支与全部打tag标签,目前此工作已全部迁移完毕,特此记录一下操作步骤环境描述:1. 要迁移的远程Git:Gitblit2. 迁移目的Git:Gitlab3. 暂存代码的P...

佳能 EOS R8 深度评测

佳能 EOS R8 的定位是入门级全画幅无反光镜可换镜头相机。尽管在产品阵容中处于这一位置,R8 仍然是一个强大的相机,配备了先进的 R6 II 同款成像传感器、快速处理器和令人难以置信的自动对焦系统,体积小、重量轻、价格低。这款相机是发烧友、旅行者、家庭以及任何想要全画幅传感器相机的人的绝佳选择。...

慕课 SpringBoot2.X+Vue+UniAPP,全栈开发医疗小程序

本课程以业务驱动技术栈,打造业务相对完整的掌上医疗小程序,解决大家没有好的毕设项目或者求职项目的困境。本课程案例采用前后端分离架构,业务功能完善(既有WEB管理端,也有移动用户端),界面美观,无需艰涩的技术也能做出亮眼的作品。SpringBoot2.X+Vue+UniAPP,全栈开发医疗小程序 |...

基于微信小程序+springboot+vue技术构建的开源微信商城

介绍基于 微信小程序 + springboot + vue 技术构建 ,支持单店铺,多店铺入驻的商城平台。项目包含 微信小程序,管理后台。基于java后台语言,已功能闭环,且达到商用标准的一套项目体系。技术栈平台功能介绍小程序演示图管理后端演示图小程序体验码演示地址1.0版演示地址说明后台管理端演示...

一文看懂企业微信开发简易教程

为让开发者快速理解开发流程,本篇章展示如何一步步设计一个能与企业后台互动的自建应用。添加自建应用登录企业微信管理端 -> 应用与小程序 -> 应用 -> 自建,点击“创建应用”,设置应用logo、应用名称等信息,创建应用。创建完成后,在管理端的应用列表里进入该应用,可以看到agen...

微信将研发“应用号”体系 或成为App大杂烩应用

Akiha发表于 2016-01-11 18:11微信正在探讨一种新的公众号形态,即在现有的订阅号、服务号之外,再研发新的“应用号”体系。让用户不必去装各种 App,在微信里就能实现各种服务、功能;关注后,“应用号”平时不向用户发送消息,需要时,用户再去点开“应用号”等。目前,微信钱包内已有的服务,...