首页 > 编程语言 >web页面中直接调用c++/c/go代码?【wasm】

web页面中直接调用c++/c/go代码?【wasm】

时间:2024-08-07 19:17:37浏览次数:13  
标签:web 代码 c++ js test WASM go wasm

背景

最近在做rosbag的可视化工具,网上找了个源码参考(foxglove)。成功down下来,跑起来了。于是乎,开始研究前后端代码;结果居然花了一下午没找到后端代码,不明白为什么纯web页面就可以解析rosbag(以前都是用node.js或者c++代码解析的)。

过程

在找了一下午之后,又回到了老办法;看netork,果然还是除静态资源外没找到任何一条http请求,懵逼了;但是我看到一个很奇怪的东西image接下来,就开始查资料。推测解析bag的代码一定跟这个wasm有关联。

wasm介绍

WebAssembly(简称 WASM)是一种高效的、低级的字节码格式,用于在网页浏览器中运行代码。它是一种可移植的二进制格式,设计用来在Web环境中提供接近原生性能的执行速度。

WebAssembly 的特点包括:

  1. 高性能:WASM 可以在浏览器中接近原生代码的执行速度运行,适用于高性能计算任务,如游戏、图形处理和数据分析等。

  2. 可移植性:它是跨平台的,可以在任何支持 WebAssembly 的浏览器和环境中运行,不同操作系统和设备之间的兼容性很好。

  3. 安全性:WASM 运行在一个受限的沙箱环境中,与主机系统隔离,这样可以提高安全性,避免恶意代码对系统的破坏。

  4. 易于集成:它可以与 JavaScript 互操作,允许开发者将已有的 C/C++、Rust 等语言编写的代码编译为 WASM 模块,并在 Web 应用中调用这些模块。

  5. 快速加载:由于其紧凑的二进制格式,WASM 模块可以比传统的 JavaScript 代码加载得更快,提高了网页的响应速度。

使用场景:

  • 游戏开发:由于其高性能,WASM 适用于 Web 上的游戏和图形密集型应用。
  • 编译型语言的运行:可以将 C、C++、Rust 等编译成 WASM,从而在 Web 上运行这些语言的代码。
  • 计算密集型任务:如图像处理、数据分析等。

总的来说,WebAssembly 提供了在 Web 环境中实现高效、可移植的代码执行的能力,是现代 Web 开发的重要组成部分。

推测

解析rosbag部分的代码必是被打包成wasm,然后web页直接调用方法了。

实现一个wasm

本机正好用go环境,于是用go实现了一下。将go打包成wasm文件,html页面直接调用:

test.go

package main

import (
    "syscall/js"
)

func main() {
    c := make(chan struct{}, 0)
    js.Global().Set("test", js.FuncOf(func(this js.Value, p []js.Value) interface{} {
        return js.ValueOf("Hello, WASM!")
    }))
    <-c
}

打包命令

$env:GOARCH = "wasm"
$env:GOOS = "js"
go build -o test.wasm test.go

得到一个test.wasm文件

index.html

<!DOCTYPE html>
<html>
<head>
    <title>Go WASM Example</title>
</head>
<body>
<h1>Go WASM Example</h1>
<script src="wasm_exec.js"></script>
<script>
    const go = new Go();

    async function loadWasm() {
        try {
            // 加载并实例化 WASM 模块
            const wasmResponse = await fetch('test.wasm');
            const wasmBuffer = await wasmResponse.arrayBuffer();
            const result = await WebAssembly.instantiate(wasmBuffer, go.importObject);

            // 运行 Go 实例
            go.run(result.instance);

            // 调用 Go 导出的函数
            console.log(window.test());  // 这将输出 "Hello, WASM!"
        } catch (err) {
            console.error('Error loading WASM module:', err);
        }
    }

    loadWasm();
</script>
</body>
</html>

效果

image

感触

是不是以后一个静态文件就可以包含前后端的代码了?

标签:web,代码,c++,js,test,WASM,go,wasm
From: https://www.cnblogs.com/never404/p/18347693

相关文章

  • 使用Streamlit构建一个web模拟HTTP请求工具
    目录前言HTTP工具功能点:1.导入库: 2.设置页面配置:3.Markdown格式的说明文本:4.用户输入界面:5.发送请求按钮和逻辑:6.发送HTTP请求并计算请求细节:7.总结 前言    最初就是因为在微信看到一篇文章中,看到此http工具的制作因为觉得Streamlit有无限......
  • node.js: mysql sequelize in WebStorm 2023.1
    mysql:select*fromtutorials;#CREATETABLEIFNOTEXISTS`tutorials`(`id`INTEGERNOTNULLauto_increment,`title`VARCHAR(255),`description`VARCHAR(255),`published`TINYINT(1),`createdAt`DATETIMENOTNULL,`updatedAt`DATETIMENOTNULL,PRIMA......
  • 【QT】Qt中Websocket的使用
    一、WebSocket的定义        WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC6455,并由RFC7936补充规范。WebSocketAPI也被W3C定为标准。                WebSocket使得客户端和服务器之间的数据......
  • kmp算法(c++)
    kmp算法的简单介绍从主串中快速找到与要找的串的相同位置如果使用暴力算法去求解这个问题,时间复杂度为O(i*j)=>很大kmp算法则是对这类问题的优化因整理过于麻烦,,详细的介绍可以参照这篇博客,,花时间看完就明白了,写的很棒!!!kmp算法详细介绍下面是自己学习的一些注意的地......
  • 【C++】string类
    ......
  • 【C++】一文带你学完 C++【完整版-附代码示例】
    本文篇幅较长,几乎涵盖了权威C语言教程【CppPrimerPlus】的所有可用知识点,建议点赞收藏关注方便后续阅读。附注:建议学完一个知识点后,同步进行编程练习以便于巩固掌握知识点;编程学习是重理论更重实践的一个过程,唯有多写多练才能快速掌握C++全教程正文开始......
  • 搭建 Web 群集Haproxy
    案例概述        Haproxy是目前比较流行的一种群集调度工具,同类群集调度工具有很多,如LVS和Nginx。相比较而言,LVS性能最好,但是搭建相对复杂;Nginx的upstream模块支持群集功能,但是对群集节点健康检查功能不强,高并发性能没有Haproxy好。Haproxy官方网站是http://ww......
  • GitHub爆赞的Web安全防护指南,网络安全零基础入门必备教程!
    web安全现在占据了企业信息安全的很大一部分比重,每个企业都有对外发布的很多业务系统,如何保障web业务安全也是一项信息安全的重要内容。然而Web安全是一个实践性很强的领域,需要通过大量的练习来建立对漏洞的直观认识,并积累解决问题的经验。Web安全与防护技术是当前安全界关......
  • 腾讯云AI代码助手评测:如何智能高效完成Go语言Web项目开发
    腾讯云AI代码助手评测:如何智能高效完成Go语言Web项目开发......
  • C++进阶:1_C++中的继承
    C++中的继承一.继承的概念及定义1.继承的概念公共部分提取出来叫做:父类或者基类(正常类)继承父类的类叫做:子类或者派生类(派生类)继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产......