问题标签 [webassembly]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
148 浏览

webassembly - 对 webassembly 的二进制代码结构感到困惑

我正在尝试根据 webassembly 的模块结构文档识别 wasm 二进制模块的每个部分。我已经完成了部分认可,如下所示:

截屏

红色代码被标记为“魔术代码”;

深橙色的代码被标记为“版本号”;

浅黄色的代码被标记为第一部分的“id”;

深绿色的代码被标记为“varuint7”格式的“payload length”;

我不确定如何识别接下来的部分,对哪个部分是“有效载荷数据”有点困惑?“最后一个当前部分的结尾必须与模块的最后一个字节重合”是什么意思。在官方文档中写道。

0 投票
4 回答
87070 浏览

python - 将 Python 编译为 WebAssembly

我已经读过可以将 Python 2.7 代码转换为 Web Assembly,但我找不到关于如何转换的权威指南。

到目前为止,我已经使用 Emscripten 及其所有必要组件将 C 程序编译为 Web Assembly,所以我知道它正在工作(使用指南:http ://webassembly.org/getting-started/developers-guide/ )

为了在 Ubuntu 机器上执行此操作,我必须采取哪些步骤?我是否必须将 python 代码转换为 LLVM 位码,然后使用 Emscripten 进行编译?如果是这样,我将如何实现这一目标?

0 投票
1 回答
91 浏览

webassembly - 为什么varuintN即使使用wasm二进制格式的LEB28编码,也有一个固定的位数“N”?

LEB128 是一个“变长整数”,这意味着如果我们有一个内部有很多零的数字,我们可以节省空间。像下面的例子:

对于特定数字12

uint32:00000000 00000000 00000000 00001100

leb128: 00001100

varuint32(带填充的 leb128):10000000 10000000 10000000 00001100(0x80 0x80 0x80 0x0b)

引用自官网:

一个 LEB128 可变长度整数,限制为 N 位(即值 [0, 2^N-1]),最多由可能包含填充 0x80 字节的 ceil(N/7) 个字节表示。

我是不是误会了什么?

0 投票
2 回答
11390 浏览

c - webassembly 上的 UDP 套接字

我正在尝试将我用 C 和 C++ 编写的桌面应用程序移植到 webassembly 平台,并正在调查是否有可能。该应用程序所做的重要事情之一是通过发送和接收 UDP 消息进行通信。我已经实现了最小的 UDP 客户端,它只创建 UDP 套接字并将数据包发送到服务器(它是本地构建的,并且在同一台机器上作为单独的可执行文件运行)。socket、bind 和 sendto API 没有返回错误,一切看起来都正常,但是服务器端没有接收到消息,wireshark 显示该端口上没有任何活动。

UDP 套接字只是在 webassembly libc 端口上存根,还是在某些 Web 标准连接(例如 WebRTC)之上实现?

客户端代码如下。我检查了本机构建是否正常工作。

我按照http://webassembly.org/getting-started/developers-guide/的说明构建和运行它。

提前感谢您的任何帮助或线索!

0 投票
1 回答
551 浏览

python - 将 C 代码转换为 Web 程序集时出错

我已经成功安装 Emscripten 并让它在Ubuntu 16.04虚拟机上运行。我还成功地将 helloworld.c 文件转换为 Web 程序集。目前,我正在尝试使用 emscripten 将 python 转换为 Web 程序集。问题是 emscripten 目前不支持 python,因此作为一种解决方法,我尝试使用 Cython 将 python 代码转换为 C,我成功地做到了。尽管尝试将 cython c 文件转换为 Web 程序集时出现错误。这是控制台日志:

根据pyport.h,产生这个错误是因为在一些32位系统中,LONG_BIT被错误地定义为64,而应该是32。我试过注释掉这一行,但这只允许程序静默运行,最后没有生成任何 Web 汇编代码,只有 html 和 javascript。

我在这里读过,这个问题是因为“cmake 正在为头文件选择一个版本的 python dylib 和一个单独的 python 版本”。这是有道理的,因为我最近从 Python 2.7.13-1 降级到 Python 2.7.11-1,因为 Python 2.7.13-1 与 python-dev 包不兼容。虽然,我不知道如何解决这个问题。

有谁知道该怎么做?

0 投票
3 回答
1940 浏览

webassembly - 如何在 Web Assembly 中打印文本

有什么方法可以直接在 Web 程序集中将文本打印到窗口上,而不必将字符串数据传递到 javascript 或打印到控制台?

0 投票
2 回答
311 浏览

node.js - node-chakracore 是否支持 WASM(Web 程序集)?

我可以将相同的 WASM javascript 模块部署到 node-chakracore,就像我可以部署到 nodejs v8 一样吗?

0 投票
1 回答
3461 浏览

javascript - WebAssembly & OpenGL - 单一上下文,多输出(到画布)

(OpenGL / Emscripten 的新手)

对于我正在构建的股票交易客户端应用程序,需要 40 多个开放图表。其中大约 50% 处于某种“自由绘制”状态,这意味着它们显示烛台以及其他线条/箭头/图像等。

在过去几个月尝试了很多选择之后,这就是归结为。

  • HighCharts:简单但缓慢;
  • CanvasJS:更快但不够快
  • WebAssembly + OpenGL:速度更快,但工作量很大(仍然值得)

我引导一个 WebAssembly 应用程序实例,并在其上调用函数,让 C++ 使用 OpenGL 创建图表,映射到 WebGL(2)。一切正常。

我选择 (WebAssembly + OpenGL) -> Emscripten 的原因是因为有很多数字运算,而 c++ 也适合这项工作:)

问题是 WebGL 在 Chrome(59) 中的上下文限制约为 10。所以拥有 40-100 个 WebGL 上下文(图表)不是一个聪明的主意,我的直觉告诉我,拥有这么多几乎总是作为静态图像输出的上下文是浪费 OpenGL 资源,除非你滚动图表等。

有没有人有将单个 OpenGL 上下文渲染到随机画布元素(或任何其他元素,并不重要)的良好经验?

我的想法如下:

  1. 在另一个线程中使用屏幕外画布启动 c++ OpenGL, https://github.com/OleksandrChekhovskyi/emscripten-offscreen-canvas-test/blob/master/main.c#L35
  2. Javascript 告诉 c++ 渲染图形
  3. 通过共享的 Uint8Array 与 JS 共享/渲染 OpenGL 后缓冲区... SharedArrayBuffers 在 JS Worker 线程中由 C++ 填充,主(渲染)线程仅读取/转换以将图像写入 canvas/html 元素。

我似乎没有其他方法可以不创建许多 OpenGL 上下文。

问题是:这样做的性能如何,并且基本上将 OpenGL 缓冲区复制到 Javascript 等?它离轨道很远吗?

谢谢

在此处输入图像描述

ps 底部图(带有红色波浪线)现在由 WebAssembly 和 OpenGL(GLFW 等)渲染

- - - 更新 - - -

选项2:始终渲染到同一个画布,并使用JS将画布的上下文复制到另一个画布(但如果上下文更新,它可能会被删除..)

0 投票
6 回答
22743 浏览

c++ - 如何将 C++ 文件编译为 WebAssembly?

假设我有一个简单的、独立的 C++ 文件 ( math.cpp),如下所示:

我将如何将其编译为 WebAssembly ( math.wasm)?

注意:我使用的是 Clang 工具链。

0 投票
1 回答
171 浏览

c++ - 从主机环境“env”禁用/重命名导入

在将 C 或 C++ 编译为 Web 程序集 ( clang/llvm/binaryen ) 时,未定义的函数将从“env”中导入。

例如

编译为

我猜这行(import "env" "afunc" (func $afunc (result i32)))意味着它试图afunc 从主机环境请求函数。但是,我没有发现应该将主机环境命名为env.

是否可以对这些主机进口施加一些控制?具体来说,

  • 我可以将其重命名为 以外的名称env吗?
  • 是否可以禁用此行为,以便在未定义函数时出现链接器错误(可能除非它是已知在主机中可用的函数)?