WebAssembly作为一种新兴的Web技术,相关的资料和社区还不够丰富,但其为web开发提供了一种崭新的思路和工作方式,未来是很有可能大放光彩的。

使用WebAssembly,我们可以在浏览器中运行一些高性能、低级别的编程语言,可用它将大型的C和C++代码库比如游戏、物理引擎甚至是桌面应用程序导入Web平台。

截至目前为止,我们已经可以在Chrome、Firefox中使用WebAssembly,Edge和Safari对它的支持也基本完成。这意味着很快,就能在所有流行的浏览器中运行wasm了。

在这篇文章中,我们将会演示如何将简单的C代码编译为wasm,并将其包含在网页中。在此之前,我们先来直观的了解下WebAssembly是如何工作的。

WebAssembly是如何工作的?

这里不涉及过多技术性的问题。我们知道,在今天的浏览器中,JavaScript是在虚拟机(VM)中执行的,该虚拟机能够最大化地优化代码并压榨每一丝的性能,这也使得JavaScript称为速度最快的动态语言之一。但尽管如此,它还是无法与原生的C/C++代码相媲美。所以,WebAssembly就出现了。

Wasm同样在JavaScript虚拟机中运行,但是它表现得更好。两者可以自由交互、互不排斥,这样你就同时拥有了两者最大的优势——JavaScript巨大的生态系统和有好的语法,WebAssembly接近原生的表现性能。

大多数程序员会选择使用C语言来编写WebAssembly模块,并将其编译成.wasm文件。这些.wasm文件并不能直接被浏览器识别,所以它们需要一种称为JavaScript胶接代码(glue code,用于连接相互不兼容的软件组件,详见:http://whatis.techtarget.com/definition/glue-code)的东西来加载。

随着未来WebAssembly框架和本地wasm模块支持的发展,这一过程可能会有所缩短。

开发前准备

编写WebAssembly需要不少的工具,但作为一个程序员,下面的工具你应该大部分都已经有了。

1、支持WebAssembly的浏览器,新版的Chrome或者Firefox均可(可以在此查看各个浏览器对某项内容的支持情况:http://caniuse.com/#feat=wasm)。

2、C到WebAssembly的编译器,推荐使用Emscripten(https://kripken.github.io/emscripten-site/docs/getting_started/downloads.html),安装这个工具费时费力费空间,但没办法,这是目前为止最好的选择,请仔细阅读安装说明,需占用约1GB的硬盘空间。

3、一个C编译器/开发环境,比如Linux下的GCC,OS X下的Xcode,Windows下的Visual Studio。

4、一个简单的本地web服务器,Linux/OS X下使用python -m SimpleHTTPServer 9000命令即可,Windows下可安装IIS服务。

一、编写C代码

下面我们编写一个非常简单的C语言例子,它将会返回1-6的随机数,在你所使用的工作目录下,创建一个dice-roll.c文件。

#include

#include

#include

#include

// 一旦WASM模块被加载,main()中的代码就会执行

int main(int argc, char ** argv) {

printf("WebAssembly module loaded\n");

}

// 返回1-6之间的一随机数

int EMSCRIPTEN_KEEPALIVE roll_dice() {

srand ( time(NULL) );

return rand() % 6 + 1;

}

当我们将其编译为wasm并且在浏览器中加载时,main函数会自动执行,其中的printf将会被翻译成console.log。

我们想要roll_dice函数能够在JavaScript中随时调用,为此,我们需要在函数名前添加EMSCRIPTEN_KEEPALIVE标记以告诉Emscripten我们的意图。

二、将C编译为WebAssembly

现在我们已经有了C代码,接下来需要将它编译成wasm,不仅如此,我们还需要生成相应的JavaScript胶接代码以便能够真正运行起来。

这里我们必须使用Emscripten编译器,你会发现有大量的命令行参数和编译方法可选,经过实践,我们找到了下面这个最友好最实用的组合:

emcc dice-roll.c -s WASM=1 -O3 -o index.js

各个参数含义如下:

emcc——代表Emscripten编译器;

dice-roll.c——包含C代码的文件;

-s WASM=1——指定使用WebAssembly;

-O3——代码优化级别,3已经是很高的级别了;

-o index.js——指定生成包含wasm模块所需的全部胶接代码的JS文件;

三、在浏览器中加载WebAssembly代码

现在我们将回到熟悉的web开发领域,在当前文件夹创建index.html文件,引入相关的js文件与CSS文件。

WebAssembly 示例

点击以摇动筛子

c 浏览器语言,让C代码在浏览器中运行相关推荐

  1. C语言图形函数代码~持续更新中

    下面总结的是一些C语言图形函数代码~持续更新中 画三类圆 #include#include#include#include#includeint main(void) { initgraph(640, ...

  2. 浅谈嵌入式MCU软件开发之S32K1xx系列MCU启动过程及重映射代码到RAM中运行方法详解

    内容提要 注:本文摘自NXP工程师胡恩伟的微信公众号"汽车电子expert成长之路",大家感兴趣可以关注一下. 引言 1. S32K1xx系列MCU启动过程详解(startup_S ...

  3. 为什么单片机的代码在Flash中运行,单片机的代码运行位置跟电脑有什么不同?

    1. 单片机与电脑,在代码运行空间的区别 单片机与 电脑/Linux嵌入式 在代码运行的空间上不同.大多数单片机,代码都是在Flash中运行的.而电脑/linux嵌入式,是将代码从存储介质(可能是硬盘 ...

  4. java判断浏览器杂项_java简单代码判断浏览器代码

    java简单代码判断浏览器代码 import java.util.regex.Matcher; import java.util.regex.Pattern; public class BrowseT ...

  5. 浏览器自己检测php代码,一个浏览器检查类_php

    一个浏览器检查类 //原作者:epsilon7 //SonyMusic(sonymusic@163.net) class BrowserDetector  { var $UA =  "&qu ...

  6. Linux X64下汇编学习:C语言调用汇编代码,汇编中调用C语言函数

    Table of Contents hello world hello.asm makefile float circle_fpu_87c.c circle_fpu_87.asm makefile s ...

  7. c语言实现文档中字符串的替换,C语言 16行代码实现字符串中指定字符串替换

    支持: 1.等长字符串替换函数 2.长字符串替换为短字符串post 3.短字符串替换为长字符串测试 4.中文替换spa 注意:短字符串替换成长字符串要注意内存越界.net 函数代码 /* 功 能:将s ...

  8. python中函数提高代码执行速度吗_为什么Python代码在一个函数中运行得更快?

    匿名用户 除了局部/全局变量存储时间外,操作码预测使函数更快. 正如其他答案所解释的,该函数在循环中使用store_fast操作码.下面是函数循环的字节码:>> 13 FOR_ITER 6 ...

  9. r语言plotmds_科学网—在R中运行metaMDS - 梅卫平的博文

    中英文混合版. Function metaMDS performs Nonmetric Multidimensional Scaling (NMDS), and tries to find a sta ...

最新文章

  1. jquery autocomplete demo
  2. pandas使用dt.year(month/day/hour/minute/second)函数抽取dataframe日期数据列对应的年月日时分秒信息
  3. 查看linux中某个端口(port)是否被占用
  4. MATLAB | Matlab 2020a/202b/2018a/2019b安装教程及资源及matlab基本案例(图像练手教程)
  5. 从零开始数据科学与机器学习算法-逻辑回归-04
  6. 字节跳动---万万没想到之抓捕孔连顺
  7. 2018蓝桥杯省赛---java---B---2(方格计数)
  8. All men are brothers【并查集+数学】
  9. Spring + RocketMQ使用
  10. html图片自动替换图片,十种图片替换文本CSS方法
  11. Windows DWrite 组件 RCE 漏洞 (CVE-2021-24093) 分析
  12. 程序员面试谈薪的背后的事,你一定要看看
  13. 使用SPSS进行商业数据分析
  14. 境外业务性能优化实践
  15. selenium上传附件的两种方式(普通上传和借助AutoIt识别Windows上传窗口)
  16. Eclipse显示单词拼写错误The word ‘url‘ is not correctly spelled
  17. simpread-PCB 基本布线规范与设计原则
  18. java控制鼠标操作一些重复的事情
  19. 目标必须要符合SMART原则
  20. leetcode 将杂乱无章的数字排序

热门文章

  1. 从原理到实践 如何拍出高质量TEM照片
  2. canvas画布制作签名
  3. 什么是svn,以及svn的简单教程
  4. r语言 四格画图_临度科研|数据统计的理解和运用(四)列联表之卡方检验
  5. 《5G时代十大应用场景白皮书》,如何解锁VR技术发展潜力
  6. Dubbox简单入门
  7. 群晖第三篇-使用ActiveBackupForBusiness备份数据
  8. 【Java基础知识 12】java枚举详解
  9. kill不掉mysqld
  10. 虚拟机服务器警报设置,Veeam ONE