• WebAssembly 浏览器中运行c/c++模块


    今天,要给前端造点儿福利

    浏览器中能调用javascript,曾经我们以为够用了,够强大了,但是事实上是完全不够

    还好,mozilla的工程师提出了webassembly,目前是利用emsctripten把c/c++代码编译为wasm(web汇编)文件,供javascript调用。

    哈哈,想一想,你在历史上的C模块要在web浏览器上运行了,兴奋吧!

    *********************************************************************************************************************************

    因为浏览器前端自然windows为主战场,所以,以下过程我都是在windows上来做的。

    1. 安装WebAssembly SDK

     这个,网上都说麻烦,都没有按步骤细说,哈哈,我也不细说,因为也不是很懂啦,但我会给你详细的步骤,比

       他们厚道多了。哈哈哈哈

      1.1 下载windows git

        https://git-scm.com/

        

        单击这个图标去下载吧,然后就是安装了,这只要不是班上最后那个拉稀的家伙,我想都应该会吧,哈

      1.2 下载windows CMake

        https://cmake.org/download/

        

        下载,安装,没问题吧,哈哈哈

      1.3 下载windows python

        https://www.python.org/downloads/windows/

        

        你还行吧?

        行

        那好,我们继续

    2. 编译器安装

      2.1 Emscripten

        按网上说的,我也曾经安装包安装过,但我的经验告诉你,让他见鬼去吧

        下面,我们源码安装

        git clone https://github.com/juj/emsdk.git
        cd emsdk
        emsdk install sdk-incoming-64bit binaryen-master-64bit

      2.2 配置编译环境变量

        好吧,网上说的和管网上的说教,嘿嘿,那对对Linux的啦

        Windows上的环境就是保存不了啦,对了,也不叫保存不了,就是配置项太多了,没必要往长久环境里

        写了,我认为,编译前,先配置它一下,又有何妨

        所以,我给你提供了env.bat文件,你把它放到你的emsdk目录下吧

        //env.bat

        emsdk activate sdk-incoming-64bit binaryen-master-64bit
        emsdk_env.bat

        记住,编译前,先env.bat一下,当然,你要不退出,下次编译就免了

      2.3 开始我们的编程之旅

        我噻,你有环境了耶!

        嘻嘻!

        2.3.1

          一个网上的C代码

          

          // math.c

          int add (int x, int y){

            return x + y;
          }

          int square (int x) {
            return x * x;
          }

          编译吧

          emcc math.c -Os -s WASM=1 -s SIDE_MODULE=1 -o math.wasm

          没错吧?

          没有

          那就好,我们继续

          下面是web端的东西了,你离成功好近了,哈哈哈

        2.3.2

          一个js文件

          //loader.js

          function loadWebAssembly (path, imports = {}) {
            return fetch(path)
              .then(response => response.arrayBuffer())
              .then(buffer => WebAssembly.compile(buffer))
              .then(module => {
                imports.env = imports.env || {}

                // 开辟内存空间
                imports.env.memoryBase = imports.env.memoryBase || 0
                if (!imports.env.memory) {
                  imports.env.memory = new WebAssembly.Memory({ initial: 256 })
                }

                // 创建变量映射表
                imports.env.tableBase = imports.env.tableBase || 0
                if (!imports.env.table) {
                  // 在 MVP 版本中 element 只能是 "anyfunc"
                  imports.env.table = new WebAssembly.Table({ initial: 0, element: 'anyfunc' })
                }

                // 创建 WebAssembly 实例
                return new WebAssembly.Instance(module, imports)
              })
          }

          一个html

          <!DOCTYPE html>

          <html>
          <head>
            <meta charset="utf-8">
            <title>Compile C to WebAssembly</title>
            <script src="loader.js"></script>
          </head>

          <body>
            <h1>Compile C to WebAssembly</h1>
            <p>The test result can be found in console.</p>

            <script>
              loadWebAssembly('math.wasm')
                .then(instance => {
                  const square = instance.exports._square

                  console.log('2^2 =', square(2))
                  console.log('3^2 =', square(3))
                  console.log('(2 + 5)^2 =', square(2 + 5))
              })

            </script>
            </body>
            </html>

         2.3.3 执行

          2.3.3.1 web服务器

            你的有web服务器,好了,不多说了,tomcat有吧?

            没有,去死

            有,我们继续

            把math.wasm, loader.js, index.html都拷贝到tomcat工作目录下

          2.3.3.2

            下载最新的chrome浏览器,我下的是ChromeStandalone_60.0.3112.113_Setup.exe,我噻,名字够长啊,看来本事够大,哈哈

            然后,在地址栏里输入http://localhost:8080/math/index.html

            好了,我把结果给你看吧,哈哈哈

            

            以上,就是你想要的吧,哈哈

    Finally:

      这世界变化快啊,我要说的是这是一个非常非常新的技术,你值得拥有。

      你要是看不出这个技术有个球用,那就当我没说这件事,再会!

          

  • 相关阅读:
    Grid 网格布局
    final变量属性小记
    色温与光合作用
    自定义CheckBox
    关于final局部变量引用的研究
    面向空实现类继承
    Android tips tool 发现的性能问题(转载翻译)
    org.json与json-lib的区别(补充 FastJson)
    设计模式之禅——心得总结
    大学本科毕业论文——LanguageTool语法校正规则库的开发
  • 原文地址:https://www.cnblogs.com/woodzcl/p/7478792.html
Copyright © 2020-2023  润新知