锘??xml version="1.0" encoding="utf-8" standalone="yes"?>日韩天堂av,欧美涩涩视频,亚洲激情啪啪http://m.shnenglu.com/pwq1989/archive/2016/01/19/212688.html鍙沖腑鍙沖腑Tue, 19 Jan 2016 08:13:00 GMThttp://m.shnenglu.com/pwq1989/archive/2016/01/19/212688.htmlhttp://m.shnenglu.com/pwq1989/comments/212688.htmlhttp://m.shnenglu.com/pwq1989/archive/2016/01/19/212688.html#Feedback1http://m.shnenglu.com/pwq1989/comments/commentRss/212688.htmlhttp://m.shnenglu.com/pwq1989/services/trackbacks/212688.html0x0

鍓嶄簺澶╃粍閲岃佸徃鏈篅姊佸笇鍦╦vm鐨勯」鐩Θ騫叉満鍣ㄦц兘涔嬩綑錛屼負浜嗘鏌ヤ笅gcc緙栬瘧鍣ㄥ拰Intel Xoen CPU鐨勬紜э紝鍐欎簡涓緇勬祴璇曚唬鐮佹祴璇曚簡涓媘fence鎸囦護鐨勬晥鏋?/p>

`
mfence Opcode : 0F AE /6

Performs a serializing operation on all load-from-memory and store-to-memory instructions that were issued prior the MFENCE instruction. This serializing operation guarantees that every load and store instruction that precedes in program order the MFENCE instruction is globally visible before any load or store instruction that follows the MFENCE instruction is globally visible. The MFENCE instruction is ordered with respect to all load and store instructions, other MFENCE instructions, any SFENCE and LFENCE instructions, and any serializing instructions (such as the CPUID instruction).
Weakly ordered memory types can be used to achieve higher processor performance through such techniques as out-of-order issue, speculative reads, write-combining, and write-collapsing.
The degree to which a consumer of data recognizes or knows that the data is weakly ordered varies among applications and may be unknown to the producer of this data. The MFENCE instruction provides a performance-efficient way of ensuring load and store ordering between routines that produce weakly-ordered results and routines that consume that data.
It should be noted that processors are free to speculatively fetch and cache data from system memory regions that are assigned a memory-type that permits speculative reads (that is, the WB, WC, and WT memory types). The PREFETCHh instruction is considered a hint to this speculative behavior. Because this speculative fetching can occur at any time and is not tied to instruction execution, the MFENCE instruction is not ordered with respect to PREFETCHh instructions or any other speculative fetching mechanism (that is, data could be speculatively loaded into the cache just before, during, or after the execution of an MFENCE instruction).
`

綆鍗曟潵璇村氨鏄竴涓彲浠ュ湪CPU涔卞簭鎵ц涓繚璇佺湡瀹炵殑load/store欏哄簭鐨勬寚浠?br />

0x1
鑰佸徃鏈哄啓浜嗕竴涓皬紼嬪簭(娉細鏈夎鐗?
// file: order.c

#define _GNU_SOURCE
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

union p64 {
    int i;
    char padding[64];
    long align8;
};

volatile union p64 v1, v2;
int b;

void *
run1(void *ignore)
{
    for (;;) {
        while (!b);
        if (v1.i || v2.i) {
            puts("assert error 1");
            exit(-1);
        }
        v1.i = 1;
        asm ("sfence": : :"memory");
        v2.i = 1;
        asm ("sfence": : :"memory");
        b = 0; 
    }
}

int
main()
{
    pthread_t p;
    pthread_create(&p, NULL, run1, NULL);
    int cnt = 0;

    for (;; cnt++) {
        v1.i = v2.i = 0;
        asm ("sfence": : :"memory");
        b = 1;
        asm ("sfence": : :"memory");
        int icnt = 0;
        for (;; icnt++) {
            int i1 = v1.i;
            asm ("lfence": : :"memory");
            int i2 = v2.i;
            if (i1 && i2)   break;
            if (i1 < i2) {
                printf("assert error, cnt = %d, icnt = %d, i1 = %d, i2 = %d\n", cnt, icnt, i1, i2);
                exit(-1);
            }
        }
    }
    return 0;
}

澶ф閫昏緫鏄細 涓鍏辨湁3涓彉閲忥紝v1.iv2.ib ,璧蜂簡2涓嚎紼嬶紝涓涓『搴忓啓鍏1鍜寁2錛屼竴涓v1鍜寁2錛屼簰鐩擱氳繃鏀瑰彉b鐨勫兼潵閫氳錛岀劧鍚庝袱涓嚎紼嬩笉鍋滃驚鐜?/p>

榪欎釜紼嬪簭浼氭寕鍦?br />printf("assert error, cnt = %d, icnt = %d, i1 = %d, i2 = %d\n", cnt, icnt, i1, i2); 
榪欐潯鏂█涓婏紝鎰忔濇槸綰跨▼1鍦ㄩ『搴忓啓鍏1鍜寁2錛屼絾鏄富綰跨▼鍗村嚭鐜拌鍒?v1=0錛寁2=1鐨勬儏鍐點?br />

0x2

鐒跺悗鎴戝府蹇欏幓鐪嬩簡涓涓嬶紝瑙夊緱榪欑鍐欐硶鐢氭槸綺楁毚錛屼簬鏄師鏍風収鎼簡涓涓猚++11鐗?

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#include <atomic>
#include <thread>

using namespace std;

union p64 {
    atomic<int> i;
    char padding[64];
    long align8;
};

volatile union p64 v1, v2;
atomic<int> b;

void *
run1()
{
    int rcnt = 0;
    for (;; rcnt++) {
        while (!b.load());
        if (v1.i.load() || v2.i.load()) {
            puts("assert error 1");
            exit(-1);
        }
        v1.i.store(1);
        v2.i.store(1);
        b.store(0);
    }
}

int
main()
{
    // init
    v1.i.store(0);
    v2.i.store(0);
    thread t(run1);
    int cnt = 0;
    for (;; cnt++) {
        v1.i.store(0);
        v2.i.store(0);
        b.store(1);
        int icnt = 0;
        for (;; icnt++) {
            int b2 = b.load();
            int i1 = v1.i.load();       // *****
            int i2 = v2.i.load();       // *****
            if (i1 && i2)   break;
            if (i1 < i2) {
                printf("assert error, cnt = %d, icnt = %d, i1 = %d, i2 = %d\n", cnt, icnt, i1, i2);
                exit(-1);
            }
            if (i1 == 0 && i2 == 0 && b2 == 0) break;
        }
    }
    return 0;
}

鍥犱負鏄師鏍風収鎼紝鎵浠ヨ偗瀹氳繕鏄細鎸傦紝浣嗘槸姣曠珶璇箟涓婃洿濂界悊瑙d簡

鎴戜滑鍏堟潵鍒嗘瀽涓涓嬩負浠涔堜細鎸?/p>

  • 綰跨▼1瀵逛簬v1錛寁2鐨勫啓鍏ラ『搴忎竴瀹氭槸涓鑷寸殑
  • Memory Barrier涔熶繚璇佷簡浠栦滑鍐欏叆欏哄簭瀵瑰叾浠栫嚎紼嬬殑鍙鎬э紙寰堟湁榪鋒儜鎬х殑涓鐐癸級
  • 浣嗘槸涓葷嚎紼嬪嵈鍙互璇誨埌 v1=0,v2=1鐨勬儏鍐?/li>
  • 鎵浠ユ儏鍐靛氨鏄櫧鐒墮『搴忓啓鍏ヤ簡錛屼絾鏄埆鐨勭嚎紼嬫病鏈夌湅鍒版紜殑欏哄簭錛?/li>
  • Intel: 騫朵笉鏄紒
  • 鍘熷洜鏄悶閿欎簡鍥犳灉鍏崇郴錛屼粬鐪熸淇濊瘉鐨勯『搴忔槸褰撲綘璇誨埌v2鐨刵ew value鐨勬椂鍊欙紝閭d箞v1涔熶竴瀹氳鍐欏叆浜嗐?/li>
  • 瑙e喅鏂規灝辨槸浜掓崲涓婇潰浠g爜涓垜鐢?*鏄熷彿**鏍囨敞鍑虹殑涓よ
  • done

鍦ㄦ棫鍐欐硶涓紝鎸傛帀鐨勬儏鍐墊槸綰跨▼1鍐欏叆v1 = 1錛屼富綰跨▼璇籿1錛屾病鏈夎鍒幫紝閭d箞涓葷嚎紼嬭涓簐1鏄?錛岀劧鍚庣嚎紼?緇х畫鍐欏叆v2錛屼富綰跨▼璇誨埌浜嗭紝涓葷嚎紼嬭涓簐2鏄?銆?鐒跺悗鎸傚湪浜嗘柇璦涓娿?/p>

涓よ浜掓崲鍚庯紝涓葷嚎紼嬮鍏堣鍙杤2錛屽鏋渧2宸茬粡鏄?浜嗭紝閭d箞v1涔熶竴瀹氭槸1錛屽弽涔嬩害鐒躲?/p>

0x3

褰撶劧錛屾兂璁╄窇閫氶偅涓緥瀛愪笉闇瑕侀偅涔堝鐨刟tomic<>錛岀簿綆涔嬪悗鍒╃敤c++11鐨刴emory_order鍙互鍐欐垚濡備笅錛?br />

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#include <atomic>
#include <thread>

using namespace std;

union p64 {
    int i;
    char padding[64];
    long align8;
};

volatile union p64 v1, v2;
atomic<int> b;    // variable b as a guard

void *
run1()
{
    int rcnt = 0;
    for (;; rcnt++) {
        while (!b.load());
        if (v1.i || v2.i) {
            puts("assert error 1");
            exit(-1);
        }
        v1.i = 1;
        v2.i = 1;
        b.store(0, memory_order_release);
    }
}
int
main()
{
    // init
    v1.i = 0;
    v2.i = 0;
    thread t(run1);
    int cnt = 0;

    for (;; cnt++) {
        v1.i = 0;
        v2.i = 0;
        b.store(1, memory_order_release);
        int icnt = 0;
        for (;; icnt++) {
            int b2 = b.load(memory_order_acquire);
            if (b2 != 0) {
                continue
            }
            int i1 = v1.i;
            int i2 = v2.i;
            if (i1 && i2)   break;
            if (i1 < i2) {
                printf("assert error 2, cnt = %d, icnt =  %d, i1 = %d, i2 = %d\n", cnt, icnt, i1, i2);
                exit(-1);
            }
        }
    }
    return 0;
}

鍒╃敤鍙橀噺b鍦ㄤ袱涓嚎紼嬩箣闂村悓姝ワ紝濡備笅鍥?br />

 (Thead 1)

   v1.i = 1;
   v2.i = 1;
   
   b.store(0, memory_order_release) <---+
                                                             |
                                                synchronize with b
                                                 (happend before)
                                                             |
                                                            +----->  b.load(memory_order_acquire)
                                                                          
                                                                        i1 = v1.i
                                                                        i2 = v2.i

                                                                       (Thread 2)

鎴戜滑鏌ョ湅涓嬬敓鎴愮殑浠g爜
g++ -std=c++11 -pthread -g -O2 order.cpp

 v1.i = 1;
  400be6:       c7 05 d0 10 20 00 01    movl   $0x1,0x2010d0(%rip)        # 601cc0 <v1>
  400bed:       00 00 00 
        v2.i = 1;
  400bf0:       c7 05 86 10 20 00 01    movl   $0x1,0x201086(%rip)        # 601c80 <v2>
  400bf7:       00 00 00 
        memory_order __b = __m & __memory_order_mask;
        __glibcxx_assert(__b != memory_order_acquire);
        __glibcxx_assert(__b != memory_order_acq_rel);
        __glibcxx_assert(__b != memory_order_consume);

        __atomic_store_n(&_M_i, __i, __m);
  400bfa:       c7 05 5c 10 20 00 00    movl   $0x0,0x20105c(%rip)        # 601c60 <b>
  400c01:       00 00 00 
        b.store(0, memory_order_release);

  

  400a58:       8b 05 02 12 20 00       mov    0x201202(%rip),%eax        # 601c60 <b>
            int b2 = b.load(memory_order_consume);
            if (b2 != 0) {
  400a5e:       85 c0                   test   %eax,%eax
  400a60:       75 f3                   jne    400a55 <main+0x55>
                continue
            }
            int i1 = v1.i;
  400a62:       8b 0d 58 12 20 00       mov    0x201258(%rip),%ecx        # 601cc0 <v1>
            int i2 = v2.i;
  400a68:       44 8b 05 11 12 20 00    mov    0x201211(%rip),%r8d        # 601c80 <v2>

鐪嬫潵Intel鐨凷trong Memory Model宸茬粡淇濊瘉浜嗚繖涓鐐癸紝Memory Barrier閮戒笉闇瑕佷簡

錛堣櫧鐒舵爣棰橀噷闈㈡湁MemoryBarrier錛屼絾鏄唴瀹歸噷闈㈡牴鏈病娑夊強鐨勬牱瀛愩傘傦級



鍙沖腑 2016-01-19 16:13 鍙戣〃璇勮
]]>
systemtap + tengine lua 鎬ц兘嫻嬭瘯絎旇http://m.shnenglu.com/pwq1989/archive/2015/01/09/209448.html鍙沖腑鍙沖腑Fri, 09 Jan 2015 04:03:00 GMThttp://m.shnenglu.com/pwq1989/archive/2015/01/09/209448.htmlhttp://m.shnenglu.com/pwq1989/comments/209448.htmlhttp://m.shnenglu.com/pwq1989/archive/2015/01/09/209448.html#Feedback0http://m.shnenglu.com/pwq1989/comments/commentRss/209448.htmlhttp://m.shnenglu.com/pwq1989/services/trackbacks/209448.html搴忚█

铏界劧nginx+lua寮鍙戜竴浜涘皬鐨剋eb鏈嶅姟綆鍗曞揩鎹鳳紝浣嗘槸鐢變簬縐嶇鍘熷洜錛岄厤濂楃殑宸ュ叿姣旇緝緙轟箯錛岀洃鎺у伐鍏峰拰鎬ц兘媯嫻嬪伐鍏風瓑絳夈傝屼笖lua浣滀負涓縐嶈窇鍦ㄨ櫄鎷熸満鐨勮剼鏈璦錛岃櫧鐒跺仛鐨勭煭灝忕簿鎮嶏紝浣嗘槸銆傘傘傚姛鑳藉拰鍙皟浼樼殑絀洪棿榪樻槸嬈犵己浜嗙偣銆?/p>

鍓嶆鏃墮棿浣跨敤鏄ュ摜鐨?a style="box-sizing: border-box; color: #428bca; text-decoration: none; background: transparent;">systemtap鑴氭湰瀵規垜鐨刲ua鏈嶅姟鍋氫簡涓嬫ц兘嫻嬭瘯錛岃繖閲岃褰曚竴涓嬫姌鑵劇殑鍘嗙▼

鍑嗗

systemtap鏄竴涓ц兘媯嫻嬪拰璋冭瘯璺熻釜鐨勫伐鍏鳳紝鏈寮濮嬫槸涓轟簡璋冭瘯鍐呮牳琚仛鍑烘潵鐨勶紝鍚庢潵娣誨姞浜嗙敤鎴鋒佽窡韙殑鍔熻兘銆?/p>

鎶樿吘璁板綍

鏄ュ摜鐨勮剼鏈姹俿ystemtap2.2浠ヤ笂錛屽叕鍙告祴璇曟湇鍔″櫒鑷甫鐨剆ystemtap鑴氭湰鐨勭増鏈偅鏄?.6錛岃繙榪滀笉澶燂紝鎵浠ュ繀欏繪墜鍔ㄧ紪璇戜竴涓備笅杞絪ystamtap鐨勬簮鐮侊紝鐒跺悗./configuare + make灝卞彲浠ョ洿鎺ョ紪浜嗐傛渶寮濮嬬鍒扮殑闂鏄叕鍙竐l5緋葷粺鐨勬湇鍔″櫒鐨別lfutil鐗堟湰澶綆錛屽緱鑷繁緙栬瘧涓涓珮鐗堟湰鐨別lfutil鐒跺悗鎸囧畾璺緞銆傘傘傘傛垜鎬曢夯鐑︼紝灝辨妸涓涓┖鐨勬祴璇曟満鍣ㄩ噸瑁呮垚el6錛宔lfutil鐨勭増鏈珛椹氨澶熶簡(鎴戠湡鏄お鏈烘櫤浜?銆?/p>

欏哄埄緙栬瘧鍑簊ystamtap涔嬪悗(涓旈亣鍒頒簡systemtap鐗堟湰涓嶅鏂板鑷寸殑絎﹀彿鎵句笉鍒扮殑bug)錛屽氨鏄痶engine鐨勫畨瑁咃紝鏃墮棿閮芥姌鑵懼湪榪欎笂闈簡銆傘傘傛垜浠」鐩敤鐨勬槸tengine-ads榪欎釜鐗堟湰錛岀洿鎺ョ敤tengine緙哄皯妯″潡錛屽氨璇蜂簡tengine緇勭殑鍚屽甯繖鎶婃ā鍧楃粰鎵撲簡榪涘幓銆傜敱浜庤璺熻釜lua鍐呴儴錛屾墍浠ヨ嚜甯︾殑luajit蹇呴』-g緙栬瘧銆傞偅杈圭殑鍚屽姣旇緝蹇欙紝鎴戝氨鍙兘鑷繁瑕佷簡鏈嶅姟鍣ㄦ潈闄愯窇涓婂幓鑷繁緙栵紝緙栦簡鍑犳涔嬪悗閭d釜嫻嬭瘯鏈嶅姟鍣ㄧ珶鐒剁鐩樻弧浜嗐傘傘傛諱箣灝辨槸鎶樿吘浜嗕竴鏅氫笂鍜屼竴鏃╀笂錛岀粓浜庢妸甯ebuginfo鐨則engine緇欒涓婁簡銆?/p>

鏁堟灉

鍚姩tengine鏈嶅姟錛屾妸鍘嬫祴紼嬪簭寮濂斤紝榪愯

./ngx-sample-lua-bt -p 29237 --luajit20 -t 200 -a '--vp 02 -R /home/wenqian.peiwq/systemtap-2.6/runtime -DSTP_NO_OVERLOAD --all-modules -DMAXSKIPPED=1024 ' > tmp.bt 

閲囨牱緇撴潫鍚庯紝鍒╃敤brendangregg鐨?a style="box-sizing: border-box; color: #428bca; text-decoration: none; background: transparent;">FlameGraph tools鍙互緇樺埗鏍堣皟鐢ㄧ殑鐏劙鍥撅紝濡備笅錛?/p>

flamegraph

閫氳繃榪欎釜鍥撅紝鍏堟槸绔嬮┈鍙戠幇浜嗕竴涓綆綰ч敊璇傘傘傦紙涓婇潰璐寸殑鍥句笂宸茬粡娌′簡錛夛紝鎴戞湁寰堝鎵撳嵃debug鐨勮鍙ワ紝鐢ㄤ簡榪欑被鐢ㄦ硶

_log.log("debug", "xxx", util.print_r(some_data)) 

蹇樿浜唋ua鐨勬眰鍊肩瓥鐣ワ紝铏界劧debug涓嬬殑榪欎釜璇彞鍦ㄧ敓浜х幆澧冧腑涓嶆墽琛岋紝浣嗘槸鐢變簬姹傚肩瓥鐣ワ紝util.print_r(some_data)浠嶇劧浼氬厛姹傚鹼紝瀵艱嚧浜嗗緢澶х殑鎬ц兘鎹熷け錛屾帴榪?/4銆?/p>

鍚屾椂涔熷彂鐜頒簡UUID鐨勭敓鎴愭墍鍗犵敤鐨勬椂闂翠篃榪囧垎鐨勯暱浜嗕竴浜涳紝鐒跺悗閲嶅啓浜嗚繖涓柟娉曪紝浣跨敤浜唕esty.string搴撲腑鐨剅andom妯″潡(鐩存帴璋冪敤浜唍gx_*鐨凜鍑芥暟)錛岀劧鍚庡埄鐢╯ystemtap瀵規瘮浜嗗墠鍚庣殑鏃墮棿錛屾彁鍗囦簡360%澶氾紝鍙榪樻槸寰堟湁鏁堟灉鐨勩?/p>

娉?

榪欎釜欏圭洰鏄熀浜庢垜涓婃鎵嬫捀鐨勫皬妗嗘灦dodolu錛屾牴鎹繖嬈$殑嫻嬭瘯緇撴灉錛屾鏋剁殑灝佽瀵規垜鐨勯」鐩犳垚鐨勬ц兘鎹熷け鍦?%浠ヤ笅銆?/p>

鍙沖腑 2015-01-09 12:03 鍙戣〃璇勮
]]>
鑷捀web灝忔鏋?dodolu(鍩轟簬nginx lua) + lua debuggerhttp://m.shnenglu.com/pwq1989/archive/2014/12/22/209273.html鍙沖腑鍙沖腑Mon, 22 Dec 2014 10:22:00 GMThttp://m.shnenglu.com/pwq1989/archive/2014/12/22/209273.htmlhttp://m.shnenglu.com/pwq1989/comments/209273.htmlhttp://m.shnenglu.com/pwq1989/archive/2014/12/22/209273.html#Feedback1http://m.shnenglu.com/pwq1989/comments/commentRss/209273.htmlhttp://m.shnenglu.com/pwq1989/services/trackbacks/209273.html鑳屾櫙

鍓嶆鏃墮棿欏圭洰闇瑕佷竴涓偣鍑繪湇鍔★紝澶ц嚧鏄鏍規嵁鐢ㄦ埛璇鋒眰鐨剈rl鍙婃暟鎹簱涓殑瑙勫垯錛屽尮閰嶅嚭涓涓粨鏋滃茍璁板綍鏃ュ織銆傛渶寮濮嬫槸涓涓緢灝忕殑闇姹傦紝緇撴灉涓氬姟瓚婃潵瓚婂鏉傦紝涓氬姟閫昏緫涓粡甯歌澶勭悊header澶村拰涓浜涘叾浠栫殑淇℃伅錛屽鑷翠唬鐮佽秺鏉ヨ秺娣蜂貢銆傚湪涓鏈熺粨鏉熶箣鍚庯紝鎶芥椂闂存妸榪欐鏃墮棿鐨勫伐浣滄娊璞″嚭浜嗕竴涓交閲忕駭妗嗘灦錛屽彧鍋氫簡閫傞噺鐨勫皝瑁咃紝鍔犲叆浜嗕唬鐮佺敓鎴愮殑妯″潡錛屽彲浠ュ府鍔╁紑鍙戣呰繀閫熷仛鍑轟竴涓彲鐢ㄧ殑web鏈嶅姟銆?/p>

浠嬬粛

dodolu妗嗘灦鍦板潃(Github)銆?/p>

璇ユ鏋跺彧鍋氫簡鏈灝忓寲鐨勫皝瑁咃紝鍑犱箮娌℃湁鎬ц兘鎹熷け錛屽茍鎻愪緵浜嗘牴鎹厤緗枃浠?meta.lua)錛岃嚜鍔ㄧ敓鎴恟oute妯″潡錛宯ginx.conf閰嶇疆錛宭ogger妯″潡鐨勫姛鑳斤紝鍑忚交浜嗗紑鍙戝伐浣滈噺錛岄伩鍏嶉噸澶嶆墜鍐欏ぇ閲忔槗閿欑殑閰嶇疆鎴栧瓧絎︿覆鍙橀噺錛屾湁鍔╀簬澶氫漢寮鍙戠粺涓椋庢牸銆?/p>

璇︽儏Github鐨凴EADME

鍔熻兘

鍖呮嫭涓変釜閮ㄥ垎錛屼竴涓槸web妗嗘灦錛屼竴涓槸浠g爜鑷姩鐢熸垚妯″潡錛屼竴涓槸欖旀敼鍑虹殑lua榪滅▼璋冭瘯鍣?/a>銆?/p>

web妗嗘灦閮ㄥ垎

鍙湁1k琛屼互涓嬬殑浠g爜錛岄泦鎴愪簡resty.template銆乺esty.cookie銆乁UID鐢熸垚絳夌涓夋柟妯″潡銆傛彁渚況equest銆乺esponse銆乧ontext銆乽til絳夊簱鏂逛究寮鍙戜漢鍛樹嬌鐢ㄣ?/p>

浠g爜鑷姩鐢熸垚閮ㄥ垎

鍙嚜鍔ㄧ敓鎴?

  1. 璺敱閰嶇疆
  2. 鏃ュ織璁板綍妯″潡
  3. nginx.conf

涓昏鐩殑鍦ㄤ簬瑙e喅nginx閰嶇疆涓巐ua浠g爜鐨勫垎紱婚棶棰?鍦ㄦ棩蹇楄褰曚腑灝や負涓ラ噸)銆?/p>

寮鍙戜漢鍛樻柊寤哄簲鐢ㄦ楠わ細鍦ˋpp鏂囦歡澶逛笅錛屾柊寤簂ua鏂囦歡錛岀劧鍚庡~鍏?code>do_get()鏂規硶鍗沖彲澶勭悊鐩稿簲鐨刧et璇鋒眰錛屾墍鏈夐厤緗湪meta/meta.lua閲岄潰銆?/p>

涓涓褰曟棩蹇楀茍榪斿洖1x1gif鐨勪緥瀛愶細

-- 榪欎釜鏂囦歡涓嬮潰瀛樻斁浣犵殑涓氬姟閫昏緫
-- 榪欎釜鏂囦歡涓嬮潰瀛樻斁浣犵殑涓氬姟閫昏緫
local app = {} function app.do_get(ctx)      local response = ctx.response     local request = ctx.request     local cookie = ctx.cookie
    response:set_content_type("text/html")     local url = request.uri     -- do some process
    ------------- write log ---------------     -- my_log 鏃ュ織妯″潡鏄牴鎹甿eta.lua鑷姩鐢熸垚鐨?     local logger = ctx.get_logger('my_log')       local log_data = { a = "xxx"}     logger.write(log_data, other_params)
    ------------- return empty gif -------     response:empty_gif()     response:close() end
function app.do_post(ctx) end function app.do_put(ctx) end function app.do_delete(ctx) end
return app

lua榪滅▼璋冭瘯鍣?/h3>

鏂囨。璇︾粏瑙?a >榪欓噷錛岃繖閲屽彧婕旂ず涓嬬敤娉曪細
sh debug.sh錛岀劧鍚庤繍琛岀敤鎴風▼搴忥紝鎴愬姛鍚?br />

Lua Remote Debugger
Run the program you wish to debug
Paused at file a.lua
Type 'help' for commands

涓嬩竴姝? n

n
Paused at file a.lua line 8
8: print("Start")


鏌ョ湅婧愮爜  l

> l  
source file: a.lua
2:   
3:   local tab = {
4:       foo = 1,
5:       bar = 2
6:   }
7:   
8:>> print("Start")
9:   
10:  local bb = require "b"
11:  bb.foo()
12:   
13:  for i = 1, 10 do
14:      print("Loop")


璁劇疆鏂偣   b <file>:<line>   鏌ョ湅    listb

> b a.lua:11
> listb 
a.lua: 11

鏌ョ湅灞閮ㄥ彉閲? local

> local {         ["tab"] = {                 {                         ["bar"] = 2,                         ["foo"] = 1,                 },                 "table: 0x2589ee0",         }, }

鏌ョ湅鍙橀噺   p tab

> p tab
{
        ["bar"] = 2,
        ["foo"] = 1,
}
緇х畫鎵ц錛岀洿鍒版柇鐐? r
> r Paused at file a.lua line 11




鍙沖腑 2014-12-22 18:22 鍙戣〃璇勮
]]>鍑芥暟寮忕紪紼嬭璦涓庡壇浣滅敤http://m.shnenglu.com/pwq1989/archive/2014/07/10/207540.html鍙沖腑鍙沖腑Thu, 10 Jul 2014 07:16:00 GMThttp://m.shnenglu.com/pwq1989/archive/2014/07/10/207540.htmlhttp://m.shnenglu.com/pwq1989/comments/207540.htmlhttp://m.shnenglu.com/pwq1989/archive/2014/07/10/207540.html#Feedback1http://m.shnenglu.com/pwq1989/comments/commentRss/207540.htmlhttp://m.shnenglu.com/pwq1989/services/trackbacks/207540.html

搴?/h3>

鍑芥暟寮忕紪紼嬭璦鏈夊緢澶氱瀹氫箟錛屽娉涚殑璁や負鏀寔楂橀樁鍑芥暟錛坔igher-order function錛夊氨綆楀嚱鏁板紡璇█鐨勮瘽錛屽ぇ澶氭暟鐜頒唬璇█閮芥槸鏀寔鍑芥暟寮忕紪紼嬬殑錛屼緥濡侰/C++錛宩ava錛孋#錛宭ua錛宲ython錛孞avaScript錛孲cala絳夌瓑銆傛敹绱т竴涓嬪畾涔夌殑璇濓紝鍔犲叆鍑芥暟寮忚璦瑕佹眰鐨勬ā寮忓尮閰嶃佹棤鍓綔鐢ㄧ瓑瑕佹眰錛岄偅涔堝墿涓嬬殑灝辨槸綰嚱鏁板紡璇█錛屾瘮杈冨父瑙佺殑鏈塇askell錛孋lean絳夈?/p>

鍓綔鐢ㄦ槸浠涔堝拰涓轟粈涔堟湁浜涜璦鎯沖湪璁捐涓婇伩鍏嶅壇浣滅敤榪欎釜闂錛実oogle鑳芥悳鍑哄ソ澶氬崥鏂囷紝榪欓噷灝變笉澶氳浜嗐傞伩鍏嶅壇浣滅敤鍙互甯︽潵涓浜涘疄闄呯殑濂藉錛屾瘮濡傚府浣犲ぇ閲忔敼鍐欎唬鐮佷粈涔堢殑錛堣錛夛紝鑰屼笖榪瀏cc閮芥湁 _ _ attribute _ _((pure/const))鐨勫嚱鏁版墿灞曞槢~銆傛瘮濡傚儚erlang榪欑渚濊禆浜庡壇浣滅敤緙栫▼鐨勮璦錛岃櫧鐒舵湁鐫鍙橀噺涓嶅彲鍙樿繖涓壒鎬э紝浣嗘槸浠嶇劧鍙互璇誨啓process鎼哄甫鐨勫叏灞鍙橀噺錛岃屼笖鍙堟病鏈変竴涓ソ鐨勭被鍨嬬郴緇燂紝鎵浠ュ湪緙栬瘧鐨勬椂鍊欎篃涓嶄細鎬庝箞澶ф敼浣犵殑浠g爜錛屽ぇ澶氳繕鏄洿璇戞垚瀛楄妭鐮併?/p>

娉細榪欑瘒鏂囩珷涓嶆槸**杞枃**錛屼笉浼氱敤涓猤(f(x))灝卞綋渚嬪瓙緇欏ぇ瀹惰鏃犲壇浣滅敤澶氫箞澶氫箞濂斤紝鍙紦瀛樼粨鏋滄媺(just a lie)~鍘熺敓鏀寔騫惰鎷?just another lie)錛岃繖浜涢兘鏄壇娣¤屼笖涓嶅疄闄呯殑銆傦紙鏈夋満浼氬啀鍐欎釜鍗氬涓撻棬璋堣皥榪欎釜錛?/p>

姝f枃

棣栧厛錛岀函鍑芥暟寮忕殑璇█寮鴻皟娌℃湁鍓綔鐢紝瀹冧笉浼氭敼鍙樹換浣曞疄闄呯殑涓滆タ錛屽綋鐒朵篃娌℃湁錛堝叏灞鐨勶級鐘舵侊紝榪欐牱鐨勭▼搴忓鏋滀笉閰嶄笂浠h〃鍓綔鐢ㄧ殑杈撳叆杈撳嚭褰撶劧鏄粈涔堥兘騫蹭笉浜嗙殑銆傞偅涔堝浣曟妸鍓綔鐢ㄥ祵鍏ュ埌鏈笉璇ユ湁鍓綔鐢ㄧ殑璇█璁捐涓偅錛熷綋鐒朵笉鑳界洿鎺ヨ祴鍊鹼紝涓嶇劧銆傘備笉鐒躲傘傚氨鍙樻垚鍛戒護寮忚璦浜嗭紝鑰屼笖鍑芥暟寮忚璦緙栬瘧涓紩浠ヤ負璞殑鍚勭浼樺寲pass鍑犱箮閮戒笉鑳界敤浜嗐傞偅涔堟妸鏈夊壇浣滅敤鐨勫嚱鏁版爣娉ㄥ嚭鏉ワ紵褰撶劧鏄竴涓姙娉曘傝繕鏈夊氨鏄妸鍓綔鐢ㄧ殑琛ㄨ揪寮忛兘鍖呭惈鍦╟ontext涓紝闅忕潃鍑芥暟浼犻掞紝淇濊瘉欏哄簭鑰屼笖瑕佷繚璇佸紩鐢ㄧ殑鍞竴鎬с?/p>

浣滀負綰嚱鏁板紡璇█鐨勪唬琛紝Haskell鍜孋lean瀵逛簬鍓綔鐢ㄧ殑璁捐瀹炵幇涓婂樊鍒緢澶э紝涓嬮潰灝辯畝鍗曡涓涓嬪畠浠殑瀹炵幇錛屽埁鏍圭┒搴曪紝鍏跺疄瀹冧滑鍋氱殑榪樻槸鍚屼竴浠朵簨鎯呫?/p>

haskell

Haskell涓湁涓涓緢閲嶈鐨勬蹇碉細Monad錛屽彇鍚嶈嚜鑼冪暣璁猴紝鍙互綺楁祬鐨勮涓哄畠灝辨槸瀹氫箟浜嗕竴緋誨垪鐨勮涓哄噯鍒欙紙>>= , return錛夈侶askell涓ぇ澶氭暟璇硶緋栭兘鏄負浜嗚繖涓彂鏄庢潵鐨勩侶askell鐨勬爣鍑嗗簱涓湁寰堝鍏充簬鍓綔鐢ㄧ殑綾誨簱灝佽錛屾瘮濡侷ORef錛孧Var錛孖OMonad絳夌瓑錛屼粬浠殑鍐呴儴瀹炵幇閮戒細褰掔粨鍒癝T Monad錛圫tate Thread Monad錛変笂錛屾鏄繖涓笌forall鍏抽敭瀛楃殑緇撳悎錛屼粠鑰屽湪璇硶涓婁繚璇佷簡鍓綔鐢ㄥ祵鍏ュ湪錛堢函錛塇askell涓殑姝g‘鎬с?br style="box-sizing: border-box;" />ST Monad閲岄潰涓昏鐨勫畾涔夋槸錛?/p>

 newtype ST s a = ST (STRep s a)
 type STRep s a = State# s -> (# State# s, a #)
 data STRef s a = STRef (MutVar# s a)

 runST :: (forall s. ST s a) -> a
 runSTRep :: (forall s. STRep s a) -> a

鍏朵腑鏈鍏抽敭鐨勬槸ST s a 涓?STref s a 榪欎袱涓暟鎹粨鏋勩?/p>

鍏堢湅鐪嬭繖涓敤娉曪紝let a0 = runST $ newSTRef 0錛屼細寮曞彂涓涓猼ype error銆傚洜涓簉unST鐨勭被鍨嬫槸(forall s.ST s a) -> a 錛屽弬鏁?code style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 14.5454540252686px; padding: 2px 4px; color: #c7254e; white-space: nowrap; border-radius: 2px; background-color: #f9f2f4;">(newSTRef 0)鐨勭被鍨嬫槸forall s. ST s (STRef s Int)錛屾渶鍚庢眰鍊煎悗鐨勭粨鏋滄槸a0::STRef s Int錛屾樉鐒秙鑴辯浜嗗師鏈殑瀹氫箟鍩燂紙涔熷氨鏄偅灞俧orall涔嬪錛宖orall鏄疕askell涓彁渚?*RankNType**鐨勫叧閿瓧錛夈備粠鑰岀敤鎴峰氨鍙兘浣跨敤涓嬮潰鐨勬柟寮忥細

sumST :: Num a => [a] -> a
sumST xs = runST $ do          
    n <- newSTRef 0             
    forM_ xs $ \x -> do        
    modifySTRef n (+x)     
    readSTRef n     

涓嶇敤鏍囧嚭鏍囧嚭鍏蜂綋瀹炵幇錛屽ぇ瀹跺氨鑳界湅鍑轟粬鍋氱殑浜嬫儏灝辨槸鍋氫簡涓灞倃rapper錛屽湪type checker涓婁繚璇佽box涔嬪悗涓嶄細琚敤鎴峰彇鍑烘潵涔辨敼銆傝嚦浜庡浣曞仛鍒癲estructive in-place update錛岃繖灝卞睘浜庣紪璇戝櫒鐨勯粦欖旀硶浜嗭紝璇█榪欏眰鍙渶淇濊瘉璇箟灝卞ソ銆傦紙**娉細**ghc鐨勫疄鐜頒腑錛孲T Monad鏍囧噯搴撶敤鍒頒簡ghc鐨剈nsafe鎵撳ご鐨勫唴緗嚱鏁幫級

Clean

Clean璇█鐢ㄧ殑絳栫暐鏄嚎鎬х被鍨嬬郴緇燂紙linear type system錛夛紝鏄疭ubstructural type sysytem鐨勪竴縐嶃傚湪Curry-Howard鍚屾瀯涓搴擲ubstructrual logic銆傝繖綾葷被鍨嬬郴緇熶腑錛屼笉浣嗗彲浠ュ喅瀹氫竴涓彉閲忔槸浠涔堢被鍨嬶紝榪樺彲浠ョ害鏉熻浣跨敤鐨勬鏁頒笌欏哄簭銆傚湪Mozilla鍑虹殑Rust璇█涓紝涔熷彲浠ョ湅鍒扮嚎鎬х被鍨嬬殑褰卞瓙銆?/p>

鍏堜婦涓牀瀛悀

transform :: (Int -> Int) *{#Int} -> *{#Int} 
transform f s | size s == 0 = s | otherwise = if (s.[0] == 0) {f i \\ i <-: s} {f i \\ _ <-: s & i <- [s.[0]..]}

錛堜笉瑕佸湪鎰忓鎬殑璇硶錛岋經锝濋噷闈㈠叾瀹炲氨鏄痩ist comprehension錛?/p>

鍏朵腑*灝辨槸uniqueness type鐨勬爣娉紝榪欎釜鍑芥暟鐨勭被鍨嬬敤haskell鍐欏嚭鏉ュ氨鏄?code style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 14.5454540252686px; padding: 2px 4px; color: #c7254e; white-space: nowrap; border-radius: 2px; background-color: #f9f2f4;">transform :: (Int -> Int) -> *[Int] -> *[Int]銆傝繖涓嚱鏁拌櫧鐒舵病鏈夊緢濂界殑鐪嬪嚭uniqueness type鐨勭壒鎬у拰浼犳挱鎬э紝浣嗘槸浣滀負綆鍗曠殑渚嬪瓙錛屽樊涓嶅灝辨槸榪欎箞鍥炰簨銆?br style="box-sizing: border-box;" />瀵逛簬uniqueness type鏈鐩磋鐨勭悊瑙e氨鏄甫鏈夎繖涓爣璇嗙殑綾誨瀷鏄笉鑳藉弬涓庡埌浠ュ悗Graph Reduction涓紝鑰屼笖浼氭嫻嬩細涓嶄細鏈夊涓?#8220;鍙橀噺”鎸囧悜浠栥備笂闈㈣繖涓嚱鏁頒腑灝變笉浼氬瓨鍦ㄥ涓猍Int]鍙婄浉鍏崇殑鍓湰絳夌潃琚洖鏀訛紝鑰屾槸浼氱洿鎺ュ湪錛圧eadWorld涓殑錛夊唴瀛樹笂鏇存柊鏁版嵁銆?/p>

鏈鍚?/h3>

鍏跺疄宸茬粡鐪嬪嚭錛屽湪涓婇潰Haskell涓嶤lean鐨勫仛娉曚腑錛屼竴涓槸鍒╃敤forall鍏抽敭瀛椾笌ST Monad+緙栬瘧鍣ㄩ粦欖旀硶錛屽彟涓涓槸build-in鍦ㄧ被鍨嬬郴緇熶腑錛屼絾鏄湰璐ㄩ兘鏄仛浜嗕竴浠朵簨鎯咃紝灝辨槸淇濊瘉RealWorld涓殑瀵硅薄涓嶄細瀛樺湪澶氫釜寮曠敤錛岃屼笖鍦℅raph Reduction涓笉浼氳緙栬瘧鍣ㄦ悶涔遍『搴忥紝榪欐牱灝辮兘铻嶅叆鍒版暣涓函鍑芥暟寮忕殑澶т綋緋諱腑浜嗐?/p>
鏈漢鍗氬鍦板潃錛坔ttp://m.shnenglu.com/pwq1989/錛?br />

鍙沖腑 2014-07-10 15:16 鍙戣〃璇勮
]]>綾誨瀷緋葷粺涓庡浘鐏靛畬鍏?/title><link>http://m.shnenglu.com/pwq1989/archive/2014/07/10/207536.html</link><dc:creator>鍙沖腑</dc:creator><author>鍙沖腑</author><pubDate>Thu, 10 Jul 2014 07:14:00 GMT</pubDate><guid>http://m.shnenglu.com/pwq1989/archive/2014/07/10/207536.html</guid><wfw:comment>http://m.shnenglu.com/pwq1989/comments/207536.html</wfw:comment><comments>http://m.shnenglu.com/pwq1989/archive/2014/07/10/207536.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://m.shnenglu.com/pwq1989/comments/commentRss/207536.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/pwq1989/services/trackbacks/207536.html</trackback:ping><description><![CDATA[     鎽樿: 搴忕被鍨嬬郴緇熷湪緙栫▼璇█涓槸鏋佷負閲嶈錛屼笉鍗曞崟鏄彁渚涗竴涓被鍨嬬殑鏍囨敞鎴栨槸鏂逛究緙栬瘧錛屾洿澶氭椂鍊欐槸鍑忓皯鍑洪敊鐨勫彲鑳姐傚綋綾誨瀷緋葷粺寮哄ぇ鍒頒竴瀹氱▼搴︼紝灝卞彲浠ヨ繘琛屾墍璋撶殑“瀵岀被鍨嬬紪紼?#8221;錛屾瘮濡傚湪Haskell涓彧瑕佺紪璇戝櫒涓嶆姤閿欙紝澶ц嚧涓婄▼搴忎篃鏄病浠涔坆ug鐨勩傚湪甯哥敤鐨勯潤鎬佺被鍨嬭璦涓紝C++/java/C#絳夛紝铏界劧鍦ㄦ柊鏍囧噯涓庢柊鐗堟湰涓敮鎸佺被鍨嬬殑鑷姩鎺ㄥ錛屼絾鏄綾誨瀷緋葷粺鍙婂叾鎺ㄥ榪樻槸緙哄皯鏇翠負鐩存帴鐨勬敮鎸併傚緢澶氬父鐢ㄨ...  <a href='http://m.shnenglu.com/pwq1989/archive/2014/07/10/207536.html'>闃呰鍏ㄦ枃</a><img src ="http://m.shnenglu.com/pwq1989/aggbug/207536.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/pwq1989/" target="_blank">鍙沖腑</a> 2014-07-10 15:14 <a href="http://m.shnenglu.com/pwq1989/archive/2014/07/10/207536.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>Haskell鍒壄鐨刌-Combinatorhttp://m.shnenglu.com/pwq1989/archive/2014/02/27/205964.html鍙沖腑鍙沖腑Wed, 26 Feb 2014 16:25:00 GMThttp://m.shnenglu.com/pwq1989/archive/2014/02/27/205964.htmlhttp://m.shnenglu.com/pwq1989/comments/205964.htmlhttp://m.shnenglu.com/pwq1989/archive/2014/02/27/205964.html#Feedback5http://m.shnenglu.com/pwq1989/comments/commentRss/205964.htmlhttp://m.shnenglu.com/pwq1989/services/trackbacks/205964.html
鏄ㄥぉ鍦ㄧ煡涔庝笂鐪嬪埌涓涓瘎璁烘彁鍒頒簡Haskell鐨刌C瀹炵幇錛屽氨鍘繪悳浜嗕竴涓嬶紝鐒跺悗灝辯湅鍒頒簡涓涓疄鐜幫細
1 newtype Mu a = Mu (Mu a -> a)
2 
3 y :: (a -> a) -> a
4 y f = (\h -> h $ Mu h) (\x -> f . (\(Mu g) -> g) x $ x)

鍡紝鐪熸槸鍒壄

鍙嶈涓涓嬪叾浠栬璦鐨刌C鍐欐硶錛屽氨璐翠竴涓猯ua鐨勬妸
1 Y = function (f)
2    return function()
3       return (function(x) return x(x) end)
                   (function(x) return f(function(y) return x(x)(y) end) end)()
4    end
5 end
铏界劧鐪嬭搗鏉ュ緢闀匡紝浣嗘槸瀹規槗鐞嗚В鐨勫錛岀敤λ琛ㄨ揪寮忓啓鍑烘潵灝辨槸錛?a target="_blank" title="wiki">wiki錛?br />λf. (λx. f (x x)) (λx. f (x x))
鐩殑灝辨槸鑳藉仛鍑?Y f = f (Y f) 榪欑鏁堟灉錛屼箣鎵浠ヨ繖涔堝啓錛屾槸涓轟簡涓嶅紩鍏ュ悕瀛楋紙寮曞叆浜嗗悕瀛楁槸鎭?錛?br />
瀵逛簬Haskell榪欑鐢℉M綾誨瀷緋葷粺鐨勮璦鏉ヨ錛屾渶澶х殑闂灝辨槸涓嶈兘閫掑綊鐨勫畾涔夌被鍨嬶紝鍚屾牱鏄潤鎬佺被鍨嬫鏌ワ紝姣斿C#錛屽氨鍙互涓嶈垂鍔涚殑鐢‵unc鍜宒elegate鍋氬嚭鏉ワ紝haskell 棰濓紝灝卞緱鎵洸鐨勫埄鐢╪ewtype Mu a = Mu (Mu a -> a) 鏉ョ粫榪囩被鍨嬫鏌ワ紙褰撶劧錛岃繖涓湪Haskell涓槸涓嶅彲鑳芥瀯閫犲嚭涓涓疄闄呯殑鍊肩殑錛夈?br />
鐪嬩笅浠栨槸鎬庝箞鍋氱殑錛屾垜浠潵鎶婁粬灞曞紑涓涓嬶細
鍘熷紡瀛愶細y f = (\h -> h $ Mu h) (\x -> f . (\(Mu g) -> g) x $ x)
甯﹁繘鍘伙細y f = (\x -> f . (\(Mu g) -> g) x $ x) $ Mu (\x -> f . (\(Mu g) -> g) x $ x)
鍐嶆潵涓閬嶏細y f = f . (\x -> f . (\(Mu g) -> g) x $ x) $ Mu (\x -> f . (\(Mu g) -> g) x $ x)

榪欐牱瀛愶紝鏈鍚庨偅涓紡瀛愮殑f. 鍚庨潰鐨勯偅閮ㄥ垎錛屾彁鍙?nbsp;(\x -> f . (\(Mu g) -> g) x $ x) 榪欎釜鍏洜寮?灝辯浉褰撲簬鏄?\h -> h $ Mu h) (\x -> f . (\(Mu g) -> g) x $ x)浜嗭紙寰堝儚鏁板鎶婏紝浣嗕篃娌″澶у叧緋伙級
鏈鍚庯紝灝卞彲浠ュ仛鍑簓 f = f . (y f)浜嗐?br />
鍏跺疄榪欎釜鍐欐硶鏈鍏抽敭鐨勬槸 newtype Mu a = Mu (Mu a -> a)鐨勪綔鐢紝浠栨槸濡備綍緇曡繃綾誨瀷媯鏌ワ紝浣嗘槸鍙堜笉鍦ㄨ繍琛屾湡鏋勯犱竴涓鹼紙鎯蟲瀯閫犱篃鏋勯犱笉鍑烘潵錛夈?br />
鏉ョ湅涓嬩粬鐨勭被鍨嬫帹瀵艱繃紼嬶紝y鐨勭被鍨嬫槸y :: (a -> a) -> a錛屾墍浠ラ噷闈灝辨槸 f :: a -> a錛屾墍浠 . (\(Mu g) -> g) x $ x 榪欎釜寮忓瓙鍙互鎺ㄥ嚭閲岄潰鐨剎鏄?x :: Mu a 鐒跺悗(\(Mu g) -> g) x 鍙栧嚭閲岄潰鐨?a錛岃繖鏍峰氨鎴愪簡
f a $ Mu a錛岃繖鏃跺橫u a = Mu (Mu a -> a) 閫掑綊瀹氫箟鐨勪綔鐢ㄥ氨鍙戞尌浜嗭紝涓轟簡綾誨瀷鐨勬帹瀵鹼紝緇х畫灝嗛偅涓孩鑹茬殑a 鎺ㄥ鎴?Mu a -> a錛岃繖鏍?f (Mu a -> a) 浼氳繑鍥炰竴涓狹u a -> a錛岀浠栧彨f'鎶婏紝榪欐牱 f' (Mu a) 灝辮繑鍥炰竴涓?a銆傛湁鏍規嵁鍓嶉潰鐨?\h -> h $ Mu h) 緇х畫璁蹭笂闈㈡彁鍒扮殑a鍙樻垚 Mu a -> a銆傚氨鏄妸Mu a 鍠傜粰浜?(Mu a -> a)錛屾渶鍚庤繕鏄繑鍥炰竴涓猘銆?br />(>_< 鍏跺疄涓婇潰榪欐鏄垜緙栧嚭鏉ョ殑錛屾垜緙栦笉涓嬪幓浜嗭紝鎴戜笉鐭ラ亾ghc鏄庝箞鍋氳繖涓簨鎯呯殑錛岀瓑鎴戞湁鐢熶箣騫寸湅瀹宻lpj-book-1987鍐嶆兂鎯?

鎴戜滑鏉ュ簲鐢ㄤ竴涓嬶紝榪斿洖涓涓樁涔橈細
y (\f n -> if n <= 1 then 1 else n * f (n - 1)) 5銆?
涓嶉毦鐪嬪嚭錛屾渶緇坹鐨勭被鍨嬭鐗瑰寲鎴愪簡 ((Int -> Int) -> (Int -> Int)) -> (Int -> Int)


鍙沖腑 2014-02-27 00:25 鍙戣〃璇勮
]]>
C++ 涔?Memory Barrier http://m.shnenglu.com/pwq1989/archive/2014/01/08/205228.html鍙沖腑鍙沖腑Tue, 07 Jan 2014 16:54:00 GMThttp://m.shnenglu.com/pwq1989/archive/2014/01/08/205228.htmlhttp://m.shnenglu.com/pwq1989/comments/205228.htmlhttp://m.shnenglu.com/pwq1989/archive/2014/01/08/205228.html#Feedback0http://m.shnenglu.com/pwq1989/comments/commentRss/205228.htmlhttp://m.shnenglu.com/pwq1989/services/trackbacks/205228.htmlhttp://m.shnenglu.com/pwq1989/ 


浠婂ぉ緹ら噷濮愬か鎺ㄨ崘浜嗕釜C++鐨凙ctor妗嗘灦 Theron錛屽氨鐪嬩簡涓嬫簮鐮侊紝娉ㄩ噴姣斾唬鐮佽繕澶氾紝涓氱晫鑹績銆?br />
婧愮爜鎴戣繕娌$湅瀹岋紝灝辯湅鍒頒簡浠栫殑涓涓彨StringPool鐨勭被錛岄噷闈㈤氳繃Ref鏉ョ敓鎴愬崟渚嬶紙Singleton錛夛紝鐪嬩簡涓?br />
static void Reference();榪欎釜鍑芥暟瀹炵幇鐨勬椂鍊欙紝紿佺劧鑴戞礊涓寮錛屼負鍟ユ病鏈塎emory Barrier(wiki)銆?br />
鍏堣創涓涓嬩粬鐨勪唬鐮侊細
 1 StringPool *StringPool::smInstance = 0;
 2 Mutex StringPool::smReferenceMutex;
 3 uint32_t StringPool::smReferenceCount = 0;
 4 
 5 
 6 void StringPool::Reference()
 7 {
 8     Lock lock(smReferenceMutex);
 9 
10     // Create the singleton instance if this is the first reference.
11     if (smReferenceCount++ == 0)
12     {
13         IAllocator *const allocator(AllocatorManager::GetCache());
14         void *const memory(allocator->AllocateAligned(sizeof(StringPool), THERON_CACHELINE_ALIGNMENT));
15         smInstance = new (memory) StringPool();
16     }
17 }

鎴戜滑鍏堜笉璁ㄨ榪欎竴孌典唬鐮侊紝鍏堢湅鐪嬩笅闈㈢殑錛?br />
澶у濡傛灉鐪嬭繃C++鐨凞ouble Check Lock涓嶅彲闈犵殑榪欑瘒paper(鍦板潃)錛屼綔鑰呯粰鍑虹殑瑙e喅鏂規鏄繖鏍風殑錛?br />
 1     // First check
 2     TYPE* tmp = instance_;
 3     // Insert the CPU-specific memory barrier instruction
 4     // to synchronize the cache lines on multi-processor.
 5     asm ("memoryBarrier");
 6     if (tmp == 0) {
 7         // Ensure serialization (guard
 8         // constructor acquires lock_).
 9         Guard<LOCK> guard (lock_);
10         // Double check.
11         tmp = instance_;
12         if (tmp == 0) {
13                 tmp = new TYPE;
14                 // Insert the CPU-specific memory barrier instruction
15                 // to synchronize the cache lines on multi-processor.
16                 asm ("memoryBarrier");
17                 instance_ = tmp;
18         }
19     return tmp;

鍏跺疄榪欎袱涓狹emory Barrier涓嶇敤鍏ㄥ睆闅滐紝絎竴涓敤璇誨睆闅渞mb()灝卞ソ浜嗐傜浜屼釜闇瑕佷竴涓啓灞忛殰wmb()銆?br />
鎴戜滑閮界煡閬搈b榪欎釜涓滆タ鏄負浜嗛槻姝PU綰у埆鐨勬寚浠や貢搴忚鍙戞槑鍑烘潵鐨勶紝錛堝彟涓涓槸緙栬瘧鍣ㄧ駭鍒殑錛屽拰鏈瘒鏂囩珷娌℃湁澶氬ぇ鍏崇郴錛屾湁鍏磋叮澶у鍙互鍘葷爺絀朵笅錛夛紝瀹炵幇涔熸槸鐢卞鉤鍙扮浉鍏崇殑鐗規畩鎸囦護(mfence榪欐牱鐨?緇勬垚鐨勩?br />
涔嬫墍浠ヨ鍐欐垚榪欐牱錛岀浜屼釜mb()鏄負浜嗛槻姝㈠湪鏋勯犲嚱鏁板畬鎴愪箣鍓嶆彁鍓嶅鐩爣璧嬪鹼紝浣哻tor榪樻病瀹屾垚錛屽氨琚寕璧鳳紝鐒跺悗絎簩涓嚎紼嬭闂殑鏃跺欙紝璁や負宸茬粡鏋勯犲畬姣曪紝榪涜屼嬌鐢ㄤ笉瀹屾暣鐨勬暟鎹紩鍙戝鎬殑閿欒銆?br />
(絎竴涓猺mb()鐨勪綔鐢ㄦ垜瑙夊緱鏄彲鏈夊彲鏃狅紝鍔犱笂鍙兘鏄負浜嗘晥鐜囨妸錛堢寽錛夛紝寮哄埗鍒鋒柊璇誨彇instance_鐨勫鹼紝闃叉榪涘叆絎竴涓猚heck鍘葷珵浜夐偅涓攣錛屼笉鍔犱篃鏄笉浼氭湁閿欑殑錛屽洜涓篜OSIX瑙勫畾mutex涔嬮棿蹇呴』淇濇寔鍐呭瓨鐨勫彲瑙佹э紝鎵浠ユ槸涓嶉渶瑕佹媴蹇冭鍒拌剰鏁版嵁) <-- 榪欐鏄釜浜烘剰瑙侊紝嬈㈣繋淇銆?br />
涓嬮潰灝辨槸鎴戣洞浜嗗崐涓嬪崍鎵嶆兂鏄庣櫧鐨勯棶棰樸傘傘備負鍟heron涓偅孌典唬鐮侊紙絎竴孌典唬鐮侊級涓嶉渶瑕佸湪lock涓坊鍔爉b()錛屽悗鏉ュ線涓嬬炕浜嗕笅錛屽彂鐜癝tringPool鐨勬瀯閫犲嚱鏁版槸絀虹殑銆傘傛牴鏈氨娌℃湁鍐呭瓨鐨勫啓鍏ワ紝褰撶劧灝變笉闇瑕亀mb()浜嗐?br />

鍙錛孋++鐨勫綰跨▼緙栫▼錛屽ソ闅?br />

鍙沖腑 2014-01-08 00:54 鍙戣〃璇勮
]]>
錛堜簩錛塋uajit涓殑濂借疆瀛怐ynASMhttp://m.shnenglu.com/pwq1989/archive/2013/11/30/204508.html鍙沖腑鍙沖腑Sat, 30 Nov 2013 04:49:00 GMThttp://m.shnenglu.com/pwq1989/archive/2013/11/30/204508.htmlhttp://m.shnenglu.com/pwq1989/comments/204508.htmlhttp://m.shnenglu.com/pwq1989/archive/2013/11/30/204508.html#Feedback0http://m.shnenglu.com/pwq1989/comments/commentRss/204508.htmlhttp://m.shnenglu.com/pwq1989/services/trackbacks/204508.htmlhttp://m.shnenglu.com/pwq1989/

涓婁竴綃囧Luajit鐨勪唬鐮佺粨鏋勫拰緙栬瘧榪囩▼鍋氫簡綆鍗曠殑鎻忚堪錛岃繖涓綃囧氨璁蹭竴涓媌uildvm鍦ㄧ涓姝ラ澶勭悊dasc鏂囦歡鐨勮繃紼嬪拰DynASM榪欎釜杞瓙銆?br />
瀹樻柟榪炴帴錛?a >http://luajit.org/dynasm.html

鏄負浜嗚浣犳洿浼橀泤鐨凜閲岄潰鎾告眹緙栫殑涓涓伐鍏鳳紝鎴戣寰椾互鍓嶇湅榪囦竴涓佸鐨刡log瀵規瘮榪囧悓鏍峰姛鑳界殑jit code generator鐨勮娉曪紝Luajit鐨勪綔鑰呮樉鐒跺搧浣嶈繕鏄緢楂樼殑銆?br />
鎴戜滑鍏堟潵鐪嬬湅濡傛灉涓嶇敤宸ュ叿紜敓鐢熸捀浠g爜鐨勮瘽浼氬彂鐢熶粈涔堛?br />1銆佷綘寰涓孌靛唴瀛橀噷闈㈠啓0xB8,0x00,0x01....
2銆佷綘鍦ㄦ枃浠墮噷瀹氫箟濂藉label錛屽啓涓猚opy section鐨勫畯寰鍐呭瓨閲岄潰澶嶅埗錛屼綘榪樹笉鑳界‘瀹氶噷闈㈠埌搴曟槸浠涔堛傦紙鍝︺傘傝繖涓殑鏈鍙玊hreaded銆傘傘傦級

鐒跺悗鍐嶅姣斾笅AsmJit鎴栬?a title="Xbyak" target="_blank">Xbyak鐨勪緥瀛愮湅鐪嬶紙浠栦滑鐨勫姛鑳藉樊涓嶅錛夛紝DynASM榪樻彁渚涗簡.marco瀹炵幇錛屽氨浼氬彂鐜拌娉曠湡鏄痵weeeet~

榪欐槸鎴戝啓鐫鐜╃殑涓涓崏娉ラ┈璇璲it瑙i噴鍣紙https://github.com/pwq1989/GMHjit錛夎娉曠湡鏄竻鏂拌嚜鐒跺晩錛屽鏋滀綘鎯崇湅宸ヤ笟綰х殑搴旂敤錛屽彲浠ョ湅鐪婫oogle鐨凥aberman鍐欑殑protobuf鐨剈pb搴擄紝閲岄潰鐢―ynASM榪涜浜唈it錛屽彿縐板揩浜嗗灝戝灝戯紙涓嶅幓鑰冭瘉浜嗭級錛屾垨鑰呮槸agentzh鍐欑殑sregex姝e垯搴擄紝涔熸槸鐢ㄥ畠鍋氫簡jit銆備竴鑸潵璇碊SL閰嶄笂jit鐨勮瘽涓瀹氫細蹇緢澶氬氨閿欎笉浜嗕簡銆?br />
涓嬮潰緇欎竴涓狣ynASM鐨凞emo紼嬪簭錛堟憳鎶勮嚜榪欎釜blog錛?br />
 1 // DynASM directives.
 2 |.arch x64
 3 |.actionlist actions
 4  
 5 // This define affects "|" DynASM lines.  "Dst" must
 6 // resolve to a dasm_State** that points to a dasm_State*.
 7 #define Dst &state
 8  
 9 int main(int argc, char *argv[]) {
10   if (argc < 2) {
11     fprintf(stderr, "Usage: jit1 <integer>\n");
12     return 1;
13   }
14  
15   int num = atoi(argv[1]);
16   dasm_State *state;
17   initjit(&state, actions);
18  
19   // Generate the code.  Each line appends to a buffer in
20   // "state", but the code in this buffer is not fully linked
21   // yet because labels can be referenced before they are
22   // defined.
23   //
24   // The run-time value of C variable "num" is substituted
25   // into the immediate value of the instruction.
26   |  mov eax, num
27   |  ret
28  
29   // Link the code and write it to executable memory.
30   int (*fptr)() = jitcode(&state);
31  
32   // Call the JIT-ted function.
33   int ret = fptr();
34   assert(num == ret);
35  
36   // Free the machine code.
37   free_jitcode(fptr);
38  
39   return ret;
40 }

棰勫鐞嗕箣鍚庨偅灝變細鍙樻垚榪欐牱瀛愶細
 1 //|.arch x64
 2 //|.actionlist actions
 3 static const unsigned char actions[4] = {
 4   184,237,195,255
 5 };
 6  
 7 // []
 8  
 9 //|  mov eax, num
10 //|  ret
11 dasm_put(Dst, 0, num);
dasm_put灝辨槸鎶妌um鍙傛暟鍜宎ctions[]涓璧鋒斁鍏ヤ簡Dst錛?define Dst &state錛夌殑鍒跺畾鐨勫唴瀛樹腑錛岃繖鏃跺欏凡緇忔槸鏈哄櫒鐮佺殑褰㈠紡浜嗐?br />涓嬮潰鏄浜巃citons[]鏁扮粍鍐呭鐨勮В閲婏細
184(B8)-- mov eax, [immediate] 鎸囦護鐨勭涓涓瓧鑺?br />237       -- 鍐呯疆鐨勬爣蹇桪ASM_IMM_D, 鎸囨槑搴旇鏀懼叆涓涓?瀛楄妭瀹藉害鐨勫弬鏁幫紝涓庝笂涓鏉℃寚浠ゅ畬鎴愪竴涓狹OV
195(C3)-- 瀵瑰簲ret鎸囦護
255       -- 鍐呯疆鐨勬爣蹇桪ASM_STOP

浠ヤ笂灝辨槸鏈綆鍗曠殑渚嬪瓙錛宒asm_growpc()鏄唴緗殑鍑芥暟錛岀敤鏉ュ闀縨axpc, 榪欐牱鍦ㄧ▼搴忛噷闈㈠氨鍙互鏂逛究鍐欏嚭jmp => label 榪欐牱鐨勬寚浠や簡銆?br />
鐢變簬DynASM鐨勬枃妗e緢灝戯紝騫鎬簭榪樻湁鍑犱釜渚嬪瓙錛岄櫎浜嗕緥瀛愬敮涓鑳界湅鐨勫氨鏄簮鐮佷簡錛屾墍浠ュ湪鐢ㄧ殑鏃跺欏嚭鐜伴棶棰樻槸寰堢棝鑻︾殑銆傘傚綋鏃跺啓GMHjit灝卞彂鐜頒簡铔嬬柤鐨刾re-process period bug錛屽悗鏉ョ粫榪囧幓浜嗐?br />
婧愮爜鏂囦歡鏈夎繖涔堝嚑涓?br />-- dynasm.lua
-- dynasm_proto.h
-- dynasm_*.lua
-- dynasm_*.h  // * x64  x86  ppc mips arm 絳塼arget

鐢ㄨ搗鏉ュ氨鏄痩ua dynasm.lua a.dasm > a.h 

涓嬮潰灝變粠dynasm.lua寮濮嬪垎鏋愪笅浠栫殑婧愮爜

鍏ュ彛鏄痯arseargs鍑芥暟錛岄噷闈㈢粰鐨刧_opt鍙傛暟璧嬮粯璁ょ殑鍊鹼紝涓涓猺epeat 涓皟鐢╬arseopt瑙f瀽鍙傛暟錛宱pt_map灝辨槸option瀵筧rgs鐨勫嚱鏁版槧灝勩?br />
鍑芥暟wline錛寃comment錛寃sync錛寃dumplines閮芥槸瀵硅緭鍑虹殑鐩爣鏂囦歡鐨勬搷浣溿?br />
鐪熸鐨勪富鍑芥暟鏄?translate錛屾妸input file鍙樻垚 output file錛屽湪readfile涓殑doline鍑芥暟鏄湡姝g殑澶勭悊榪囩▼錛岄噷闈㈠垽鏂槸鍚︽槸Assembler line涔嬪悗Emit C code錛岃皟鐢╠ostmt(aline)銆傞噷闈㈢戶緇湁map_coreop[*]鏉ュ鐞唖ection macro arch nop_ error_1 include  if endif elseif 絳夊叧閿瓧錛屾兂娣卞叆鐮旂┒鐨勫彲浠ヨ嚜宸卞幓鐪嬶紝鍏朵腑鍦╨oadarch涓牴鎹產rch鍔犺澆涓嶅悓鐨刲ua搴?br />
濡傛灉arch鏄痻64鐨勮瘽錛屾湰璐ㄨ繕鏄痳equire x86
鏉ョ湅dasm_x86.lua鏂囦歡

_M.mergemaps榪欐槸鍏抽敭鐨勬柟娉曪紝璁劇疆浜?涓狹ap鐨勫厓鏂規硶錛岀劧鍚庤繑鍥烇紝鐩稿綋浜庢槸鎶婃柟娉曠粦瀹氬湪table閲岄潰浼犻掍簡鍑哄幓銆傚鐞嗗悗鏂囦歡涓叧閿殑actionlist[]鏁扮粍鍜孌asm_put(Dst, ...)鐨勮緭鍑哄氨鏄繖涓猯ua鏂囦歡鐨勬柟娉曘?/div>閲岄潰鎻愪緵浜嗗緢澶歞ump鏂規硶錛屽彲浠ヤ緵鎴戜滑閬囧埌闂鏃跺欒皟璇曞鐞嗚繃紼嬨?br />
action_names灝辨槸浠ュ悗鐢熸垚鐨刟ction_list涓殑鍐呯疆鏍囧織瀹氫箟錛屽繀欏諱笌dasm_x86.h涓殑enum瀹氫箟涓鑷淬?/div>琛ㄦ槑浜嗕唬琛ㄧ殑鍙傛暟鍜岄暱搴︾瓑淇℃伅銆?br />榪欎釜鏂囦歡閲岄潰鎵鏈夌殑鍑芥暟灝辨槸鍋氫簡涓浠朵簨錛屾妸浣犵殑 |...  榪欐牱瀛愮殑浠g爜澶勭悊鎴愭暟緇勮緭鍑哄埌鐩爣鏂囦歡涓紙鎴戞槸姹囩紪娓f福錛岄噷闈㈣矊浼兼敮鎸丼SE2銆?銆?+錛岀湅涓嶆噦錛岀瓑鍒頒互鍚庣湅鍒皌raced jit鐨勬椂鍊欏啀鍘葷炕鎵嬪唽鎶婏級

棰勫鐞嗗畬鎴愪箣鍚庯紝灝辨槸#include "dasm_x86.h"錛岄噷闈㈡湁鏈鍏抽敭鐨刣asm_State緇撴瀯浣撶殑瀹氫箟錛屽嚑涔庨噷闈㈡墍鏈夌殑鍑芥暟閮芥槸瀵瑰鐨凙PI錛屾湁init,setup,free絳夌瓑錛岄櫎鍘誨垵濮嬪寲涓巉ree涔嬪錛屾湁涓変釜姝ラ鏄渶瑕佸嚭鐜板湪浣犻兘浠g爜涓細
1銆乨asm_put(Dst,...) 榪欎釜鏄嚜鍔ㄧ敓鎴愮殑錛屼笉鐢ㄦ垜浠搷蹇冿紝鏍規嵁actionlist[]鍜岃繍琛屾椂鐨勫弬鏁板啓鍏ュ埌Dst鎸囧畾鐨勫唴瀛橈紙Dst->section錛変腑.
2銆乨asm_link() 絎簩涓弬鏁版槸榪斿洖鐨勪唬鐮侀暱搴﹀ぇ灝忥紝榪欎釜鍑芥暟鎶妔ection鍚堝茍鍒頒竴璧鳳紝澶勭悊鍋忕Щ絳夌瓑銆?br />3銆乨asm_encode() 絎簩涓弬鏁版槸涓涓帴鍙梕ncode杈撳嚭鐨刡uffer鎸囬拡銆?br />
鐒跺悗灝卞彲浠ョ敤涓涓嚱鏁版寚閽堬紝姣斿澹版槑涓涓?int (*f)(*int), int ret = f(param) 鐩存帴榪愯鍒氬垰鐢熸垚鐨勬満鍣ㄧ爜浜嗐?br />







鍙沖腑 2013-11-30 12:49 鍙戣〃璇勮
]]>錛堜竴錛夊垵璇哃uajithttp://m.shnenglu.com/pwq1989/archive/2013/11/28/204487.html鍙沖腑鍙沖腑Thu, 28 Nov 2013 11:23:00 GMThttp://m.shnenglu.com/pwq1989/archive/2013/11/28/204487.htmlhttp://m.shnenglu.com/pwq1989/comments/204487.htmlhttp://m.shnenglu.com/pwq1989/archive/2013/11/28/204487.html#Feedback4http://m.shnenglu.com/pwq1989/comments/commentRss/204487.htmlhttp://m.shnenglu.com/pwq1989/services/trackbacks/204487.htmlhttp://m.shnenglu.com/pwq1989/

絎竴綃囧Luajit鍋氫竴涓ぇ姒傜殑浠嬬粛錛屾垜鐩墠涔熸鍦ㄦ參鎱㈢殑璇婚氭簮鐮佷腑錛屼互鍚庡彂鐜頒簡鏂頒笢瑗垮氨琛ュ厖鍦ㄨ繖閲屻?br />
澶у鍙互浠庡畼緗戜笅杞藉埌婧愮爜錛?a >http://luajit.org/錛夛紝涔熷彲浠ヤ粠Github錛?a >https://github.com/LuaDist/luajit錛塪own涓嬫潵錛岄『渚胯繕鍙互鐪嬩笅commit璁板綍銆?br />
澶у瀵圭潃luajit鐨剋iki緇撳悎婧愮爜鐪嬬殑璇濅細鏇村ソ浜涳紝鍥犱負銆傘傛枃妗eお鐗逛箞灝戜簡錛侊紒

鐩綍緇撴瀯錛?br /> -- src
    -- host
    -- jit
    *.c
    *.h
    *.dasc
絳夌瓑錛屽埆鐨勪笉鏄緢閲嶈

鏈寮濮嬫垜鏄粠main鍑芥暟寮濮嬬湅鐨勶紝鐒跺悗銆傘傜浜嗕竴榧誨瓙鐏幫紝鍚庢潵鐮旂┒涓嬩粬鐨刴akefile錛屽彂鐜頒粬鏄繖鏍峰瓙鐨勭紪璇戠殑錛岃創涓涓嬪叧閿殑msvcbuild.bat鐨勪唬鐮侊紙榪欎釜鏇村鏄撶湅鎳傦級
 1 :X64
 2 minilua %DASM% -LN %DASMFLAGS% -o host\buildvm_arch.h vm_x86.dasc
 3 @if errorlevel 1 goto :BAD
 4 
 5 %LJCOMPILE% /I "." /I %DASMDIR% host\buildvm*.c
 6 @if errorlevel 1 goto :BAD
 7 %LJLINK% /out:buildvm.exe buildvm*.obj
 8 @if errorlevel 1 goto :BAD
 9 if exist buildvm.exe.manifest^
10   %LJMT% -manifest buildvm.exe.manifest -outputresource:buildvm.exe
11 
12 buildvm -m peobj -o lj_vm.obj
13 @if errorlevel 1 goto :BAD
14 buildvm -m bcdef -o lj_bcdef.h %ALL_LIB%
15 @if errorlevel 1 goto :BAD
16 buildvm -m ffdef -o lj_ffdef.h %ALL_LIB%
17 @if errorlevel 1 goto :BAD
18 buildvm -m libdef -o lj_libdef.h %ALL_LIB%
19 @if errorlevel 1 goto :BAD
20 buildvm -m recdef -o lj_recdef.h %ALL_LIB%
21 @if errorlevel 1 goto :BAD
22 buildvm -m vmdef -o jit\vmdef.lua %ALL_LIB%
23 @if errorlevel 1 goto :BAD
24 buildvm -m folddef -o lj_folddef.h lj_opt_fold.c
25 @if errorlevel 1 goto :BAD

鍏堝垱寤轟簡涓涓猙uildvm.exe鐨勪腑闂村伐鍏鳳紝鏉ヨ嚜鍔ㄧ敓鎴愪唬鐮侊紝鍒嗗埆鐢熸垚浜?span style="font-size: 13.333333015441895px; background-color: #eeeeee;">lj_vm.obj錛?/span>lj_bcdef.h錛?/span>lj_ffdef.h 錛?/span>lj_recdef.h 錛?/span>jit\vmdef.lua錛?/span>lj_folddef.h錛?lj_libdef.h

鍏朵腑lv_vm.obj鏄緷璧栦簬host\buildvm_arch.h鐨勶紝榪欎釜鏄敤DynASM棰勫鐞唙m_x86.dasc鐢熸垚鐨勶紝榪欎釜宸ュ叿鐨勫叿浣撳垎鏋愪細鍦ㄤ笅涓綃囧崥瀹㈡彁鍙娿?br />
鍏堟潵鐪嬩笅涓婇潰鑷姩鐢熸垚鐨勪唬鐮侊細
lj_bcdef.h:
 1 LJ_DATADEF const uint16_t lj_bc_ofs[] = {
 2 0,
 3 71,
 4 142,
 5 213,
 6 284,
 7 
 8 };
 9 
10 LJ_DATADEF const uint16_t lj_bc_mode[] = {
11 BCDEF(BCMODE)
12 BCMODE_FF,
13 BCMODE_FF,
14 BCMODE_FF,
15 BCMODE_FF,
16 BCMODE_FF,
17 
18 };

lj_bc_ofs[]鍙兘鏄痓c鍦╲m浠g爜孌典腑鐨勫亸縐婚噺錛堣繖涓垜榪樻病娣卞叆榪涘幓璋冭瘯涓涓嬶級錛寁m鐨勪竴閮ㄥ垎鏄敤DynASM鐩存帴鎾告眹緙栨捀鍑烘潵鐨勶紝wiki涓篃鏈夋彁鍒頒笅涓姝it鍖栫殑opcode絳夌瓑銆?br />
lj_bc_mode[]鐨勭敤鏉ユ牴鎹帇緙╁悗鐨刡ytecode鏋勯狅紝鍒嗙鍑烘搷浣滄暟錛岀涓琛岀殑涓や釜瀹忕殑瀹氫箟鏄?br />
#define BCMODE(name, ma, mb, mc, mm) \
  (BCM##ma|(BCM##mb<<3)|(BCM##mc<<7)|(MM_##mm<<11)),
#define BCMODE_FF 0

#define BCDEF(_) \
  /* Comparison ops. ORDER OPR. */ \
  _(ISLT, var, ___, var, lt) \
  _(ISGE, var, ___, var, lt) \
  _(ISLE, var, ___, var, le) \
  _(ISGT, var, ___, var, le) \
...
鎬諱箣灝辨槸鍏呮枼鐫鍚勭鎷兼帴璧鋒潵鐨勫畯

lj_ffdef.h:
1 FFDEF(assert)
2 FFDEF(type)
3 FFDEF(next)
4 FFDEF(pairs)
5 FFDEF(ipairs_aux)
6 
FFDEF鐨勫畾涔夋槸鍦?br />
1 /* Fast function ID. */
2 typedef enum {
3   FF_LUA_ = FF_LUA,    /* Lua function (must be 0). */
4   FF_C_ = FF_C,        /* Regular C function (must be 1). */
5 #define FFDEF(name)    FF_##name,
6 #include "lj_ffdef.h"
7   FF__MAX
8 } FastFunc;
宸笉澶氬氨鏄敤FF_##name鎶婁笂闈㈢殑鍚嶅瓧鎷兼帴璧鋒潵錛岀劧鍚庣敓鎴愬湪enum閲岄潰錛岃繖鏍峰氨鑳藉綋鎴愭槸鏁板瓧錛屽湪鏁扮粍涓繀閫熸壘鍒板叆鍙d簡

vmdef.lua:
榪欎釜閲岄潰鍐呭灝變笉璐翠簡錛屽寘鎷琤cname,irname,irfpm,irfield,ircall 鐨勫畾涔夛紝鍦╦it鏂囦歡澶逛笅闈紝鐢ㄤ簬璋冭瘯絳夛紝姣斿鍦╠ump.lua涓氨鏈夌敤鍒?br />
local jit = require("jit")
assert(jit.version_num == 20002, "LuaJIT core/library version mismatch")
local jutil = require("jit.util")
local vmdef = require("jit.vmdef")  // ← ← ← ←

褰撲綘鐢╨uajit -jdump鐨勬椂鍊欙紝灝辨槸璋冪敤鐨刲ua鐨刯it搴撻噷闈㈢殑lua鍑芥暟

lj_recdef.h:
 1 static const uint16_t recff_idmap[] = {
 2 0,
 3 0x0100,
 4 0x0200,
 5 0x0300,
 6 0,
 7 0,
 8 0x0400,
 9 
10 };
11 
12 static const RecordFunc recff_func[] = {
13 recff_nyi,
14 recff_c,
15 recff_assert,
16 recff_type,
17 recff_ipairs_aux,
18 
19 };
鍏朵腑recff_func[]鏄娉ㄥ唽鐨勮traced jit 璺熻釜鐨勫嚱鏁幫紝鍏蜂綋鍙槸鍦╨j_ffrecord.c閲岄潰鐪嬪埌
recff_idmap[]琚敤鍦╨j_ffrecord_func榪欎釜鍑芥暟涓紝鏈変竴涓叧閿殑鏁版嵁緇撴瀯RecordFFData錛岀敤鏉ヨ褰曞湪trace榪囩▼涓璋冪敤鍑芥暟鐨勫弬鏁板拰榪斿洖鍊間釜鏁幫紝鍜屼竴浜涜緟鍔╂暟鎹紝opcode錛宭iteral絳夌瓑銆傞氳繃recff_idmap[]淇濆瓨鐨勫兼潵鍖哄垎鍑芥暟錛堝緟浠旂粏鐮旂┒錛?br />

lj_folddef.h:
 1 static const FoldFunc fold_func[] = {
 2   fold_kfold_numarith,
 3   fold_kfold_ldexp,
 4   fold_kfold_fpmath,
 5   fold_kfold_numpow,
 6 
 7 };
 8 
 9 static const uint32_t fold_hash[916] = {
10 0xffffffff,
11 0xffffffff,
12 0x5b4c8016,
13 
14 };
鐢ㄥ湪FOLD optimization涓紝瑙乴j_opt_fold.c錛屼富瑕佸湪
1 if ((fh & 0xffffff) == k || (fh = fold_hash[h+1], (fh & 0xffffff) == k)) {
2       ref = (IRRef)tref_ref(fold_func[fh >> 24](J));
3       if (ref != NEXTFOLD)
4     break;
5     }
鏄牴鎹暟緇勫亸縐昏幏鍙栧嚱鏁幫紝鐩存帴鎵ц銆?br />錛堣繖涓狾ptimation鐣ュ鏉傦紝浠ュ悗鐨勫崥鏂囦腑鍐嶈錛?br />
----------------------------------------鍒嗗壊綰?------------------------------------------

浠ヤ笂灝辨槸buildvm鐢熸垚浠g爜錛屽湪寰堝.c鐨勬枃浠朵腑錛屼粬鍔犲叆浜嗕竴浜涙棤鎰忎箟鐨凪ARCO錛岀洰鐨勬槸涓轟簡鑳借buildvm璇嗗埆鍑?br />
涓嬮潰璇磋src鏍圭洰褰曚笅闈㈢殑鏂囦歡錛?br />
lauxlib.h錛?br />鐢ㄦ埛寮鍙戞墿灞曞拰涓嶤浜や簰鐨勬椂鍊欑殑澶存枃浠?br />
lib_*.h /.c:
欏懼悕鎬濅箟錛屽氨鏄埄鐢↙uaAPI鍐欑殑鍐呴儴鏍囧噯搴擄紝浼氬湪鏂規硶涓婅〃鏄庢槸鍚︿細琚玹race ( LJLIB_REC(.) )銆?br />
ljamalg.c:
鏂囦歡鐨勫悎騫?br />
lj_alloc.h /.c:
瀹氬埗鐨凪emory Allocator

lj_api.c:
Public Lua/C API.

lj_arch.h:
Target architecture selection

lj_jit.h:
jit緙栬瘧鍣ㄩ噷闈㈡暟鎹粨鏋勭殑瀹氫箟

lj_asm.h/ .c  lj_asm_*.c lj_emit_*.h lj_target_*.h/.c :
灝咺R緙栬瘧鎴怣achine Code錛屽叧閿殑鏁版嵁緇撴瀯ASMState錛岀嚎鎬ф壂鎻忕殑O(n2)鍒嗛厤綆楁硶

lj_bc.h/ .c錛?br />Luajit瀛楄妭鐮佺殑瀹氫箟鍜屽唴瀛樺竷灞

lj_bcdump.c lj_bcread.c  lj_bcwrite.c:
鍥寸粫鐫瀛楄妭鐮佺殑鎿嶄綔

lj_carith.c:
C瀹炵幇鐨勪竴浜涙暟瀛楄繍綆?/div>
lj_ccall.h/ .c  lj_ccallback.h / .c :
FFI C璇█鍑芥暟璋冪敤鍜屽洖璋冪粦瀹?br />
lj_debug.h/.c :
璋冭瘯涓庤嚜鐪佺敤

lj_def.h:
榪欎釜寰堥噸瑕侊紝閲嶈鐨勭被鍨嬪拰涓浜涘畯瀹氫箟鍦ㄨ繖閲?br />
lj_c*.h/ .c:
鍜孋璇█鍏堝叧鐨勶紝姣斿綾誨瀷杞寲錛宑har綆$悊錛屾暟鎹鐞?br />
lj_frame.h:
Luajit鐨勬爤甯х鐞?br />
lj_func.h/.c:
Function handle鍜岄棴鍖呮湁鍏崇殑upvalue鏁版嵁緇撴瀯

lj_gc.h/.c:
GC鐩稿叧錛孏C鍙互鐪嬩笅luajit鐨剋iki錛岄噷闈㈡秹鍙婁笉灝戝閲忓紡GC鐨刾aper鍜屼綔鑰呯殑鐪嬫硶

lj_gdbjit.h/.c :
瀵筭db鐨勬敮鎸?br />
lj_ir*.h/.c:
SSA錛孖R鐩稿叧錛堣繖涓拰bytecode榪樻槸涓嶄竴鏍風殑錛夋搷浣滃拰浼樺寲

lj_lex.h/.c  lj_parse.h/.c:
lexer鍜宲arser

lj_mcode.h/.c:
Machine Code綆$悊

lj_opt_*.h:
鍚勭bytecode灞傞潰涓婄殑浼樺寲

lj_snap.h/.c:
蹇収鏀寔

lj_state.h/.c:
LuaState鍜孲tack鐨勬搷浣?br />
lj_str*.h/.c  lj_tab.h/.c:
鍘熺敓綾誨瀷string鍜宼able鎿嶄綔

lj_udata.h/.c:
綾誨瀷user data鐨勬搷浣?br />
lj_vm.h/.c  lj_vmevent.h/.c:
vm鐨凙PI鍜屼簨浠舵敞鍐岋紙lj_vmevent_send錛?br />
lj_vmmath.h/.c錛?br />瀵箆m鏀寔鐨刴ath搴?br />
lua.h:
luaState絳夊熀鏈殑Lua緇撴瀯

lualib.h:
鍜孡ua涓鏍鳳紝鏍囧噯搴撶殑API

luajit.h:
luajit 鐨刾ublic API

vm_*.dasc:
緙栬瘧鏈熻DynASM棰勫鐞嗙殑婧愭枃浠訛紝涓嬩竴綃囪DynASM鏃跺欎粙緇峝asc鏂囦歡

wmain.c:
windows涓嬮潰鐨刴ain鍏ュ彛

鍜孴race鐩稿叧鐨勶細
lj_crecord.h/.c  錛?C鎿嶄綔鐨則race record
lj_dispatch.h/.c :  鎸囦護鍒嗗彂錛岃皟鐢ˋSMFuction錛屽鐞嗘寚浠ゅ墠鐨刪ook鍜岃褰晅race鐢ㄧ殑hot count錛屾湁涓涓噸瑕佺殑鏁版嵁緇撴瀯 GG_State
lj_ff*.h/.c: 涓婇潰璁瞝j_ffdef.h鐨勬椂鍊欐彁榪囷紝trace鐨勬椂鍊?璁板綍Fast Function鐨勮皟鐢ㄨ鏁?br />lj_trace.h/.c: trace鐨勫叿浣撹繃紼?br />lj_traceerr.h : trace error


鍙沖腑 2013-11-28 19:23 鍙戣〃璇勮
]]> 青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              欧美成人小视频| 亚洲国产欧美不卡在线观看| 国产美女一区| 国产精品日韩精品欧美精品| 国产精品草草| 国产精品青草综合久久久久99 | 欧美亚洲综合另类| 欧美一区二区三区四区视频| 久久蜜臀精品av| 另类图片综合电影| 亚洲国产精品一区二区www| 亚洲肉体裸体xxxx137| 一区二区av| 久久精品亚洲国产奇米99| 麻豆成人在线观看| 国产精品久久国产三级国电话系列| 国产精品视频区| 亚洲成人自拍视频| 亚洲一级特黄| 美女脱光内衣内裤视频久久网站| 亚洲免费av网站| 久久国产欧美| 欧美日韩免费网站| 国产一区二区三区奇米久涩| 亚洲另类在线一区| 欧美在线视频一区| 亚洲大胆人体视频| 亚洲自啪免费| 欧美88av| 国产精品亚洲成人| 最新日韩av| 欧美中文在线视频| 一区二区欧美日韩| 能在线观看的日韩av| 国产日韩欧美一区二区三区四区 | 欧美激情片在线观看| 日韩写真在线| 午夜精品免费在线| 欧美成人国产一区二区| 亚洲一区二区三区在线视频| 美乳少妇欧美精品| 国产亚洲一区在线| 亚洲一区二区免费| 欧美国产欧美亚洲国产日韩mv天天看完整 | 国产裸体写真av一区二区| 亚洲美女区一区| 男女激情久久| 欧美在线影院| 国产日韩欧美精品综合| 午夜精品国产精品大乳美女| 亚洲人线精品午夜| 免费一级欧美片在线播放| 国产乱码精品一区二区三区av| 一本久久综合亚洲鲁鲁| 欧美寡妇偷汉性猛交| 久久婷婷蜜乳一本欲蜜臀| 国产精品日韩久久久久| 中日韩午夜理伦电影免费| 亚洲黄色免费| 欧美成人免费小视频| 在线观看欧美| 蜜桃久久av一区| 久久激情五月激情| 精品成人国产| 久久久久久亚洲精品杨幂换脸 | 欧美午夜寂寞影院| 在线亚洲国产精品网站| 亚洲黄色免费电影| 久久久99免费视频| 欧美一区二区福利在线| 国产亚洲午夜高清国产拍精品| 欧美一区二区三区四区高清 | 一区二区三区成人| 国产精品久久久久久影院8一贰佰| 亚洲视频免费看| 中文在线不卡| 国产日韩在线亚洲字幕中文| 久久久噜久噜久久综合| 两个人的视频www国产精品| 久久久久久一区二区三区| 亚洲级视频在线观看免费1级| aaa亚洲精品一二三区| 欧美激情免费观看| 艳妇臀荡乳欲伦亚洲一区| 一区二区三区鲁丝不卡| 国产精品嫩草99av在线| 久久久天天操| 欧美成人一区二区三区| 艳女tv在线观看国产一区| 中国成人黄色视屏| 国内精品久久久久久久97牛牛| 久久人体大胆视频| 久久av一区二区三区亚洲| 亚洲精品美女在线观看| 国产精品99久久久久久有的能看| 国产欧美日韩伦理| 亚洲高清免费视频| 国产精品久久波多野结衣| 老司机午夜精品视频| 欧美色图五月天| 久久久久国产精品一区二区| 欧美极品aⅴ影院| 亚洲一区精品电影| 欧美在线视频一区二区三区| 亚洲国产高清视频| 亚洲精品资源| 国精品一区二区三区| 欧美丰满高潮xxxx喷水动漫| 欧美日韩国产欧| 久久久五月天| 欧美日韩综合另类| 欧美国产日韩视频| 国产日韩视频一区二区三区| 另类激情亚洲| 国产精品永久免费观看| 亚洲精品一区在线观看| 91久久精品日日躁夜夜躁欧美| 亚洲欧美日韩在线一区| 中文av字幕一区| 欧美激情一区在线观看| 美女视频黄a大片欧美| 国产亚洲福利一区| 亚洲欧美三级在线| 亚洲欧美激情在线视频| 欧美日本中文| 亚洲黑丝一区二区| 亚洲免费电影在线| 欧美另类99xxxxx| 亚洲日本电影| 一本一本久久| 欧美日本韩国一区| 亚洲欧洲在线免费| 亚洲美女精品成人在线视频| 欧美成人午夜视频| 亚洲区一区二区三区| 亚洲精品在线观| 欧美jizzhd精品欧美巨大免费| 久久免费视频在线观看| 国产一区二区三区久久悠悠色av| 性久久久久久久久| 久久精品最新地址| 极品少妇一区二区| 久久免费高清视频| 亚洲成色www久久网站| 最新国产拍偷乱拍精品| 欧美精品在线极品| 亚洲最黄网站| 欧美一区二区播放| 久久经典综合| 欧美插天视频在线播放| 欧美高清影院| 亚洲视频网在线直播| 国产精品久久| 欧美一级大片在线观看| 久久久国产精品一区| 一区二区三区自拍| 欧美1区3d| 在线亚洲+欧美+日本专区| 午夜天堂精品久久久久| 国产日韩欧美制服另类| 免费久久精品视频| 一本不卡影院| 久久精品国产99国产精品澳门| 激情综合色综合久久| 欧美69视频| 一区二区三区精品视频| 久久久久综合网| 一区二区不卡在线视频 午夜欧美不卡'| 欧美日韩中文字幕在线| 久久精品国产综合| 99精品福利视频| 久久亚洲精品中文字幕冲田杏梨| 亚洲精品在线电影| 国产一级一区二区| 欧美日韩精品伦理作品在线免费观看| 亚洲一区在线播放| 欧美激情影院| 久久精品一二三区| 中文精品一区二区三区| 国内精品久久久久久影视8| 欧美成人在线免费视频| 亚洲欧美国产制服动漫| 亚洲第一页在线| 久久久精彩视频| 一本久久a久久免费精品不卡| 国产亚洲精品bt天堂精选| 欧美日韩成人网| 久久精选视频| 亚洲一区二区三区国产| 亚洲国产精品久久精品怡红院| 欧美影视一区| 妖精成人www高清在线观看| 激情综合色综合久久| 国产欧美一区二区视频| 欧美日韩小视频| 欧美精品一区二区三区高清aⅴ| 久久久久久久综合| 欧美亚洲在线视频| 亚洲欧美日本在线| 亚洲一区二区视频|