欢迎来到天天文库
浏览记录
ID:23193672
大小:167.28 KB
页数:9页
时间:2018-11-04
《在javascript中使用c程序》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、在JavaScript屮使用C程序JavaScript是个灵活的脚本语言,能方便的处理业务逻辑。当需要传输通信时,我们大多选择JSON或XML格式。但在数据长度非常苛刻的情况下,文本协议的效率就非常低了,这吋不得不使用二进制格式。去年的今天,在折腾一个前后端结合的WAF时,就遇到了这个麻烦。因为前端脚本需耍采集不少数据,而最终是隐写在某个cookie里的,因此可用的长度非常有限,只有几十个字节。如果不假思索就用JSON的话,光一个标记字段{"enableXX":true}就占去了一半长度。然而在二进制里,标记true或false不过是1个比特的事,可以节省上百倍的空间。同时,数据还要
2、经过校验、加密等环节,只有使用二进制格式,才能方便的调用这些算法。优雅实现不过,JavaScript并不支持二进制。这里的「不支持」不是说「无法实现」,而是无法「优雅实现」。语言的发明,就是用来优雅解决问题的。即使没有语言,人类也可以用机器指令来编写程序。如果非要用JavaScript操作二进制,最终就类似这样:varflags=+enableXXl<<16
3、+enableXX2〈〈15
4、...虽然能实现,但很丑陋。各种硬编码、各种位运算。然而,对于先天支持二进制的语言,看起来就十分优雅:1.union{2.struct{3.intenableXXl:1;4.intenableXX2
5、:1;5»•••6.};7.intl6_tvalue;8.}flags;9.9.flags.enableXXl=enableXXl;8.flags.enableXX2=enableXX2;开发者只需定义一个描述即可。使用时,字段偏移多少、如何读写,这些细节完全不用关心。为了能达到类似效果,起先封装了一个JS版的结构体:1.//最初方案:封装一个JS结构体2.vars=newStruct([3.{name:./emcchello.c-ohello.html2.11hello.c3-#include4•#include6.intmain(){7.time
6、_tnow;8•time(&now);month1,bit:4,signed:false},4.…5.]);6.s.set(1month1,12);7.s.get(’month’);将细节进行了隐藏,看起来就优雅多了。优雅但不完美但是,这总感觉不是最完美的。结构体这种东四,本该由语言提供,如今却耍用额外的代码实现,而且还是在运行期间。另外,后端解码是用C实现的,所以得维护两套代码。一旦数据结构或者算法变了,得同吋更新JS和C,很麻烦。于是琢磨,能否共用一套c代码,同时用于前端和后端?也就是说,需耍能将C编译成JS来运行。认识emscripten能将C编译成JS的工具有不少,最专业的要
7、数emscripten。emscripten的使用方式很简单,和传统C编译器差不多,只不过生成的是JS代码。9.printf(’’HelloWorld:%sn,ctime(&now));return010.}编译之后即可运行:0ElementsConsoleNetworkSourcesTimelineProfilesAuditsResources01:X(S>Vpre-«alnpreptime:8vsheUo»htwl:1245HelloWorld:SatJan2317:44:072016hello,htnl:1233>I很有趣吧~大家可
8、以尝试下,这里就不多介绍了。实用缺陷然而我们关心的不是有趣,而是实用。事实上,即使一个HelloWorld编译出来的JS也过万行,多达数百KB。就算压缩再G7JP,仍有几十KB。同时cmscripten使用了asm.js规范,内存访问是通过TypedArray实现的。这意味着1E10以下的用户都无法运行。这也是不可接受的。因此,我们得做如下改进:•减少体积•增加兼容首先寄托cmscripten本身,看看能不能通过设置参数,来达到我们的目的。不过一番尝试之后,并没有成功。那只能自己动手实现了。减少体积为什么最终脚本会那么大,里面都放了些什么?分析了下内容,大致有这几个部分:•辅助功能•
9、接口模拟•初始化操作•运行时函数•程序逻辑辅助功能比如字符申和二进制转换、提供回调包装等。这些基本都是用不着的,我们可以给自己写个特殊的回调函数。接U模拟提供文件、终端、网络、渲染等接口。之前见过用emscripten移植的客户端游戏,看来模拟了不少接口。初始化操作全局内存、运行时、各种模块的初始化。运行时函数纯粹的C只能做简单的计算,很多功能都依靠运行时函数。不过,有些常用的函数,其背后的实现是及其复杂的。例如malloc和free,对应的JS有近200
此文档下载收益归作者所有