JavaScript ÊǸöÁé»îµÄ½Å±¾ÓïÑÔ£¬ÄÜ·½±ãµÄ´¦ÀíÒµÎñÂß¼¡£µ±ÐèÒª´«ÊäͨÐÅʱ£¬ÎÒÃÇ´ó¶àÑ¡Ôñ JSON »ò XML ¸ñʽ¡£
µ«ÔÚÊý¾Ý³¤¶È·Ç³£¿Á¿ÌµÄÇé¿öÏ£¬Îı¾ÐÒéµÄЧÂʾͷdz£µÍÁË£¬Õâʱ²»µÃ²»Ê¹Óöþ½øÖƸñʽ¡£
È¥ÄêµÄ½ñÌ죬ÔÚÕÛÌÚÒ»¸ö Ç°ºó¶Ë½áºÏµÄ WAF ʱ£¬¾ÍÓöµ½ÁËÕâ¸öÂé·³¡£
ÒòΪǰ¶Ë½Å±¾ÐèÒª²É¼¯²»ÉÙÊý¾Ý£¬¶ø×îÖÕÊÇÒþдÔÚij¸ö cookie ÀïµÄ£¬Òò´Ë¿ÉÓõij¤¶È·Ç³£ÓÐÏÞ£¬Ö»Óм¸Ê®¸ö×Ö½Ú¡£
Èç¹û²»¼Ù˼Ë÷¾ÍÓà JSON µÄ»°£¬¹âÒ»¸ö±ê¼Ç×ֶΠ{"enableXX": true} ¾ÍռȥÁËÒ»°ë³¤¶È¡£È»¶øÔÚ¶þ½øÖÆÀ±ê¼Ç true »ò false ²»¹ýÊÇ 1 ¸ö±ÈÌصÄÊ£¬¿ÉÒÔ½ÚÊ¡ÉÏ°Ù±¶µÄ¿Õ¼ä¡£
ͬʱ£¬Êý¾Ý»¹Òª¾¹ýУÑé¡¢¼ÓÃܵȻ·½Ú£¬Ö»ÓÐʹÓöþ½øÖƸñʽ£¬²ÅÄÜ·½±ãµÄµ÷ÓÃÕâЩËã·¨¡£
ÓÅÑÅʵÏÖ²»¹ý£¬JavaScript ²¢²»Ö§³Ö¶þ½øÖÆ¡£
ÕâÀïµÄ¡¸²»Ö§³Ö¡¹²»ÊÇ˵¡¸ÎÞ·¨ÊµÏÖ¡¹£¬¶øÊÇÎÞ·¨¡¸ÓÅÑÅʵÏÖ¡¹¡£ÓïÑԵķ¢Ã÷£¬¾ÍÊÇÓÃÀ´ÓÅÑŽâ¾öÎÊÌâµÄ¡£¼´Ê¹Ã»ÓÐÓïÑÔ£¬ÈËÀàÒ²¿ÉÒÔÓûúÆ÷Ö¸ÁîÀ´±àд³ÌÐò¡£
Èç¹û·ÇÒªÓà JavaScript ²Ù×÷¶þ½øÖÆ£¬×îÖÕ¾ÍÀàËÆÕâÑù£º
var flags = +enableXX1 << 16 | +enableXX2 << 15 | ...ËäÈ»ÄÜʵÏÖ£¬µ«ºÜ³óª¡£¸÷ÖÖÓ²±àÂë¡¢¸÷ÖÖλÔËËã¡£
È»¶ø£¬¶ÔÓÚÏÈÌìÖ§³Ö¶þ½øÖƵÄÓïÑÔ£¬¿´ÆðÀ´¾ÍÊ®·ÖÓÅÑÅ£º
union { struct { int enableXX1: 1; int enableXX2: 1; ... }; int16_t value; } flags; flags.enableXX1 = enableXX1; flags.enableXX2 = enableXX2;¿ª·¢ÕßÖ»Ð趨ÒåÒ»¸öÃèÊö¼´¿É¡£Ê¹ÓÃʱ£¬×Ö¶ÎÆ«ÒƶàÉÙ¡¢ÈçºÎ¶Áд£¬ÕâЩϸ½ÚÍêÈ«²»ÓùØÐÄ¡£
ΪÁËÄÜ´ïµ½ÀàËÆЧ¹û£¬ÆðÏÈ·â×°ÁËÒ»¸ö JS °æµÄ½á¹¹Ì壺
// ×î³õ·½°¸£º·â×°Ò»¸ö JS ½á¹¹Ìå var s = new Struct([ {name: 'month', bit: 4, signed: false}, ... ]); s.set('month', 12); s.get('month');½«Ï¸½Ú½øÐÐÁËÒþ²Ø£¬¿´ÆðÀ´¾ÍÓÅÑŶàÁË¡£
ÓÅÑŵ«²»ÍêÃÀµ«ÊÇ£¬Õâ×ܸоõ²»ÊÇ×îÍêÃÀµÄ¡£½á¹¹ÌåÕâÖÖ¶«Î÷£¬±¾¸ÃÓÉÓïÑÔÌṩ£¬Èç½ñÈ´ÒªÓöîÍâµÄ´úÂëʵÏÖ£¬¶øÇÒ»¹ÊÇÔÚÔËÐÐÆڼ䡣
ÁíÍ⣬ºó¶Ë½âÂëÊÇÓà C ʵÏֵģ¬ËùÒÔµÃά»¤Á½Ì×´úÂë¡£Ò»µ©Êý¾Ý½á¹¹»òÕßËã·¨±äÁË£¬µÃͬʱ¸üРJS ºÍ C£¬ºÜÂé·³¡£
ÓÚÊÇ×ÁÄ¥£¬ÄÜ·ñ¹²ÓÃÒ»Ì× C ´úÂ룬ͬʱÓÃÓÚÇ°¶ËºÍºó¶Ë£¿
Ò²¾ÍÊÇ˵£¬ÐèÒªÄܽ« C ±àÒë³É JS À´ÔËÐС£
ÈÏʶ emscriptenÄܽ« C ±àÒë³É JS µÄ¹¤¾ßÓв»ÉÙ£¬×îרҵµÄÒªÊý emscripten¡£
emscripten µÄʹÓ÷½Ê½ºÜ¼òµ¥£¬ºÍ´«Í³ C ±àÒëÆ÷²î²»¶à£¬Ö»²»¹ýÉú³ÉµÄÊÇ JS ´úÂë¡£
./emcc hello.c -o hello.html main() { time_t now; time(&now); printf("Hello World: %s", ctime(&now)); return 0; }
±àÒëÖ®ºó¼´¿ÉÔËÐУº
ºÜÓÐȤ°É~ ´ó¼Ò¿ÉÒÔ³¢ÊÔÏ£¬ÕâÀï¾Í²»¶à½éÉÜÁË¡£
ʵÓÃȱÏÝÈ»¶øÎÒÃǹØÐĵIJ»ÊÇÓÐȤ£¬¶øÊÇʵÓá£
ÊÂʵÉÏ£¬¼´Ê¹Ò»¸ö Hello World ±àÒë³öÀ´µÄ JS Ò²¹ýÍòÐУ¬¶à´ïÊý°Ù KB¡£¾ÍËãѹËõÔÙ GZIP£¬ÈÔÓм¸Ê® KB¡£
ͬʱ emscripten ʹÓÃÁË asm.js ¹æ·¶£¬ÄÚ´æ·ÃÎÊÊÇͨ¹ý ʵÏֵġ£
ÕâÒâζ×Å IE10 ÒÔϵÄÓû§¶¼ÎÞ·¨ÔËÐС£ÕâÒ²ÊDz»¿É½ÓÊܵġ£
Òò´Ë£¬ÎÒÃǵÃ×öÈçϸĽø£º
¼õÉÙÌå»ý
Ôö¼Ó¼æÈÝ
Ê×ÏȼÄÍÐ emscripten ±¾Éí£¬¿´¿´Äܲ»ÄÜͨ¹ýÉèÖòÎÊý£¬À´´ïµ½ÎÒÃǵÄÄ¿µÄ¡£
²»¹ýÒ»·¬³¢ÊÔÖ®ºó£¬²¢Ã»Óгɹ¦¡£ÄÇÖ»ÄÜ×Ô¼º¶¯ÊÖʵÏÖÁË¡£
¼õÉÙÌå»ýΪʲô×îÖսű¾»áÄÇô´ó£¬ÀïÃ涼·ÅÁËЩʲô£¿·ÖÎöÁËÏÂÄÚÈÝ£¬´óÖÂÓÐÕ⼸¸ö²¿·Ö£º
¸¨Öú¹¦ÄܱÈÈç×Ö·û´®ºÍ¶þ½øÖÆת»»¡¢Ìṩ»Øµ÷°ü×°µÈ¡£ÕâЩ»ù±¾¶¼ÊÇÓò»×ŵģ¬ÎÒÃÇ¿ÉÒÔ¸ø×Ô¼ºÐ´¸öÌØÊâµÄ»Øµ÷º¯Êý¡£
½Ó¿ÚÄ£ÄâÌṩÎļþ¡¢Öնˡ¢ÍøÂç¡¢äÖȾµÈ½Ó¿Ú¡£Ö®Ç°¼û¹ýÓà emscripten ÒÆÖ²µÄ¿Í»§¶ËÓÎÏ·£¬¿´À´Ä£ÄâÁ˲»ÉÙ½Ó¿Ú¡£
³õʼ»¯²Ù×÷È«¾ÖÄÚ´æ¡¢ÔËÐÐʱ¡¢¸÷ÖÖÄ£¿éµÄ³õʼ»¯¡£
ÔËÐÐʱº¯Êý´¿´âµÄ C Ö»ÄÜ×ö¼òµ¥µÄ¼ÆË㣬ºÜ¶à¹¦Äܶ¼ÒÀ¿¿ÔËÐÐʱº¯Êý¡£
²»¹ý£¬ÓÐЩ³£Óõĺ¯Êý£¬Æä±³ºóµÄʵÏÖÊǼ°Æ临Ôӵġ£ÀýÈç malloc ºÍ free£¬¶ÔÓ¦µÄ JS Óнü 2000 ÐУ¡
³ÌÐòÂß¼Õâ²ÅÊÇ C ³ÌÐòÕæÕý¶ÔÓ¦µÄ JS ´úÂë¡£ÒòΪ±àÒëʱ¾¹ý LLVM µÄÓÅ»¯£¬Âß¼¿ÉÄܱäµÃÃæÄ¿È«·ÇÁË¡£
Õⲿ·Ö´úÂëÁ¿²»´ó£¬ÊÇÎÒÃÇÕæÕýÏëÒªµÄ¡£
ÊÂʵÉÏ£¬Èç¹û³ÌÐòûÓÐÓõ½Ò»Ð©ÌØÊ⹦ÄܵĻ°£¬°ÑÂß¼º¯Êýµ¥¶À¿Ù³öÀ´£¬ÈÔÈ»ÊÇ¿ÉÒÔÔËÐеģ¡
¿¼Âǵ½ÎÒÃÇµÄ C ³ÌÐò·Ç³£¼òµ¥£¬ËùÒÔ¼òµ¥´Ö±©µÄÌáÈ¡³öÀ´£¬Ò²ÊÇûÎÊÌâµÄ¡£
C ³ÌÐò¶ÔÓ¦µÄ JS Â߼λÓÚ // EMSCRIPTEN_START_FUNCS ºÍ // EMSCRIPTEN_END_FUNCS Ö®¼ä¡£¹ýÂ˵ôÔËÐÐʱº¯Êý£¬Ê£ÏµľÍÊÇ 100% µÄÂß¼´úÂëÁË¡£
Ôö¼Ó¼æÈݽÓ׎â¾öÄÚ´æ·ÃÎʵļæÈÝÐÔÎÊÌâ¡£
Ê×ÏÈÁ˽âÏ£¬ÎªºÎÒªÓà TypedArray¡£
emscripten ÉêÇëÁËÒ»´ó¿é ArrayBuffer À´Ä£ÄâÄڴ棬Ȼºó¹ØÁªÁËһЩ HEAP ¿ªÍ·µÄ±äÁ¿¡£
ÕâЩ²»Í¬ÀàÐ굀 HEAP ¹²Ïíͬһ¿éÄڴ棬ÕâÑù¾ÍÄܸßЧµÄÖ¸Õë²Ù×÷¡£
È»¶ø²»Ö§³Ö TypedArray µÄä¯ÀÀÆ÷£¬ÏÔÈ»ÎÞ·¨ÔËÐС£ËùÒÔµÃÌṩ¸ö polyfill ¼æÈÝÏ¡£
µ«¾·ÖÎö£¬Õ⼸ºõ²»¿ÉÄÜʵÏÖ ¡ª¡ª ÒòΪ TypedArray ºÍÊý×éÒ»Ñù£¬ÊÇͨ¹ýË÷ÒýÀ´·ÃÎʵģº
(100); buf[(buf[0]); // get
È»¶ø [] ²Ù×÷·ûÔÚ JS ÀïÊÇÎÞ·¨ÖØдµÄ£¬Òò´ËÄÑÒÔ½«Æä±ä³É setter ºÍ getter¡£¿öÇÒ²»Ö§³Ö TypedArray µÄ¶¼ÊǵͰ汾 IE£¬¸ü²»Óÿ¼ÂÇ ES6 µÄÄÇЩÌØÕ÷¡£
ÓÚÊÇ×ÁÄ¥ IE µÄ˽Óнӿڡ£±ÈÈçÓà onpropertychange ʼþÀ´Ä£Äâ setter¡£²»¹ýÕâÑù×öЧÂʼ«µÍ£¬¶øÇÒ getter ÈÔ²»Ò×ʵÏÖ¡£
¾¹ýÒ»·¬¿¼ÂÇ£¬¾ö¶¨²»Óù³×ӵķ½Ê½£¬¶øÊÇÖ±½Ó´ÓÔ´Í·ÉϽâ¾ö ¡ª¡ª ÐÞ¸ÄÓï·¨£¡
ÎÒÃÇÓÃÕýÔò£¬ÕÒ³öÔ´ÂëÖеĸ³Öµ²Ù×÷:
HEAP[index] = val;
Ìæ»»³É:
HEAP_SET(index, val);
ÀàËƵģ¬½«¶ÁÈ¡²Ù×÷:
HEAP[index]
Ìæ»»³É:
HEAP_GET(index)
ÕâÑù£¬ÔÏȵÄË÷Òý²Ù×÷£¬¾Í±ä³Éº¯Êýµ÷ÓÃÁË¡£ÎÒÃǾÍÄܽӹÜÄÚ´æµÄ¶Áд£¬²¢ÇÒûÓÐÈκμæÈÝÐÔÎÊÌ⣡
È»ºóʵÏÖ 8¡¢16¡¢32 λÓÐÎÞ·ûºÅµÄ°æ±¾¡£Í¨¹ý JS µÄ Array À´Ä£Ä⣬·Ç³£¼òµ¥¡£
Âé·³µÄÊÇÄ£Äâ Float32 ºÍ Float64 Á½¸öÀàÐÍ¡£²»¹ý±¾´Î C ³ÌÐòÖв¢Î´Óõ½¸¡µã£¬ËùÒÔ¾ÍÔݲ»ÊµÏÖÁË¡£
µ½´Ë£¬¼æÈÝÐÔÎÊÌâ¾Í½â¾öÁË¡£
´ó¹¦¸æ³É½â¾öÁËÕâЩȱÏÝ£¬ÎÒÃǾͿÉÒÔÓä¿ìµÄÔÚ JS ÖÐʹÓà C Âß¼ÁË¡£
×÷Ϊ½Å±¾£¬Ö»Ðè¹ØÐIJɼ¯ÄÄЩÊý¾Ý¡£ÕâÑù JS ´úÂë¾Í·Ç³£µÄÓÅÑÅ£º
Êý¾ÝµÄ´¢´æ¡¢¼ÓÃÜ¡¢±àÂ룬ÕâЩµ×²ãÊý¾Ý²Ù×÷£¬Ôòͨ¹ý C ʵÏÖ¡£
±àÒëʱʹÓà -Os ²ÎÊýÓÅ»¯Ìå»ý¡£×îÖÕµÄ JS »ìÏýѹËõÖ®ºó£¬»¹²»µ½ 2 KB£¬Ê®·ÖСÇɾ«Á¶¡£
¸üÍêÃÀµÄÊÇ£¬ÎÒÃÇÖ»Ðèά»¤Ò»·Ý´úÂ룬¼´¿Éͬʱ±àÒë³öÇ°¶ËºÍºó¶ËÁ½¸ö°æ±¾¡£
ÓÚÊÇ£¬Õâ¸ö¡¸Ç°ºó¶Ë WAF¡¹¿ª·¢¾ÍÈÝÒ׶àÁË¡£
ËùÓеÄÊý¾Ý½á¹¹ºÍËã·¨£¬¶¼ÓÉ C ʵÏÖ¡£Ç°¶Ë±àÒë³É JS ´úÂ룬ºó¶Ë±àÒë³É lua Ä£¿é£¬¹© nginx-lua ʹÓá£
Ç°ºó¶ËµÄ½Å±¾£¬¶¼Ö»Ðè¹Ø×¢ÒµÎñ¹¦Äܼ´¿É£¬ÍêÈ«²»ÓÃÉæ¼°Êý¾Ý²ãÃæµÄϸ½Ú¡£
²âÊÔ°æÊÂʵÉÏ£¬»¹ÓеÚÈý¸ö°æ±¾ ¡ª¡ª ±¾µØ°æ¡£
ÒòΪËùÓÐµÄ C ´úÂ붼ÔÚÒ»Æð£¬Òò´Ë¿ÉÒÔ·½±ãµÄ±àд²âÊÔ³ÌÐò¡£
ÕâÑù¾ÍÎÞÐèÆô¶¯ WebServer¡¢´ò¿ªä¯ÀÀÆ÷À´²âÊÔÁË¡£Ö»ÐèÄ£ÄâһЩÊý¾Ý£¬Ö±½ÓÔËÐгÌÐò¼´¿É²âÊÔ£¬·Ç³£ÇáÁ¿¡£
ͬʱ½èÖú IDE£¬µ÷ÊÔÆðÀ´¸üÈÝÒס£
С½áÿһÃÅÓïÑÔ¶¼Óи÷×ÔµÄÓÅȱµã¡£½«²»Í¬ÓïÑÔµÄÓÅÊÆÏ໥½áºÏ£¬¿ÉÒÔ³ÌÐò±äµÃ¸üÓÅÑÅ¡¢¸üÍêÃÀ¡£
¡¡