收藏本站
51Code Android开发培训Banner
您所在的位置:51Code首页 > 资料精选 > 学习资料 > 【学习资料】如何在JavaScript中使用C程序

【学习资料】如何在JavaScript中使用C程序

      发布时间:2016年01月19日 18:00分    来源:51Code采编    关键词:c程序         | 上一篇 | 下一篇 |


 

      减少体积

 

      为什么最终脚本会那么大,里面都放了些什么?分析了下内容,大致有这几个部分:

 

      ●辅助功能

      ●接口模拟

      ●初始化操作

      ●运行时函数

      ●程序逻辑

      1.辅助功能

 

      比如字符串和二进制转换、提供回调包装等。这些基本都是用不着的,我们可以给自己写个特殊的回调函数。

 

      2.接口模拟

      提供文件、终端、网络、渲染等接口。之前见过用 emscripten 移植的客户端游戏,看来模拟了不少接口。

 

      3.初始化操作

      全局内存、运行时、各种模块的初始化。

 

      4.运行时函数
      纯粹的 C 只能做简单的计算,很多功能都依靠运行时函数。

 

      不过,有些常用的函数,其背后的实现是及其复杂的。例如 malloc 和 free,对应的 JS 有近 2000 行!

 

      5.程序逻辑

      这才是 C 程序真正对应的 JS 代码。因为编译时经过 LLVM 的优化,逻辑可能变得面目全非了。这部分代码量不大,是我们真正想要的。事实上,如果程序没有用到一些特殊功能的话,把逻辑函数单独抠出来,仍然是可以运行的!考虑到我们的 C 程序非常简单,所以简单粗暴的提取出来,也是没问题的。C 程序对应的 JS 逻辑位于 // EMSCRIPTEN_START_FUNCS 和 // EMSCRIPTEN_END_FUNCS 之间。过滤掉运行时函数,剩下的就是 100% 的逻辑代码了。

 

      增加兼容

 

      接着解决内存访问的兼容性问题。首先了解下,为何要用 TypedArray。emscripten 申请了一大块 ArrayBuffer 来模拟内存,然后关联了一些 HEAP 开头的变量。这些不同类型的 HEAP 共享同一块内存,这样就能高效的指针操作。然而不支持 TypedArray 的浏览器,显然无法运行。所以得提供个 polyfill 兼容下。但经分析,这几乎不可能实现 —— 因为 TypedArray 和数组一样,是通过索引来访问的。

 

      大功告成

 

      解决了这些缺陷,我们就可以愉快的在 JS 中使用 C 逻辑了。作为脚本,只需关心采集哪些数据。这样 JS 代码就非常的优雅:

 

如何在JavaScript中使用C程序

 

      ●数据的储存、加密、编码,这些底层数据操作,则通过 C 实现。

      ●编译时使用 -Os 参数优化体积。最终的 JS 混淆压缩之后,还不到 2 KB,十分小巧精炼。更完美的是,我们只需维护一份代码,即可同时编译出前端和后端两个版本。于是,这个「前后端 WAF」开发就容易多了。

 

      所有的数据结构和算法,都由 C 实现。前端编译成 JS 代码,后端编译成 lua 模块,供 nginx-lua 使用。前后端的脚本,都只需关注业务功能即可,完全不用涉及数据层面的细节。

 

      每一门语言都有各自的优缺点。将不同语言的优势相互结合,可以让程序变得更优雅、更完美。