2010-10-03 16 views

cevap

17

(Not: Ben "kod çözme ve sevk" tarafından bir anahtar tabanlı tercüman anlamına geldiğini varsayıyoruz.)

bir switch tabanlı ve bir dişli tercüman arasındaki fark en çalışma süresi, temel olarak, gerçekleştirilen sıçramaların sayısıdır. Anahtar tabanlı bir yorumlayıcıda, bazı merkezi konumlarda talimatlar çözülür ve kod çözme sonucuna bağlı olarak, kodu çözülen yönergeyi işleyen kod parçasına bir atlama yapılır. Bu kod parçası talimatı yorumlamayı bitirdiğinde, bir sonraki talimatla devam eden merkezi kod çözme koduna geri döner. Bu, yorumlanmış talimat başına en az iki sıçrama yapıldığı anlamına gelir. , Kod çözme kodu merkezileşmiş, daha ziyade bir talimatı işleyen kod her parçasının sonunda çoğaltılamaz olmayan bir dişli tercüman olarak

typedef enum { 
    add, /* ... */ 
} instruction_t; 

void interpret() { 
    static instruction_t program[] = { add /* ... */ }; 
    instruction_t* pc = program; 
    int* sp = ...; /* stack pointer */ 
    for (;;) { 
    switch (*pc++) { 
     case add: 
     sp[1] += sp[0]; 
     sp++; 
     break; 
     /* ... other instructions */ 
    } 
    } 
} 

: C aşağıdaki kod parçası gibi böyle bir tercüman görünebileceğini göstermektedir. Bu, bir komut yorumlandıktan sonra, bazı merkezi kod çözme kodlarına geri dönmek yerine yorumlayıcının bir sonraki talimatı çözmesi ve hemen ona atlaması anlamına gelir. ANSI-C'de işlenmiş kodun verimli bir şekilde uygulanması gerçekten mümkün değildir, ancak GCC'nin "hesaplanan goto" uzantısı bunun için çok iyi çalışır. İşte önceki tercüman bir dişli sürümü:

(bir sonraki talimata) çoğaltılır dolaylı atlama Modern CPU'lar daha iyi tahmin edilebilir, çünkü
void interpret() { 
    void* program[] = { &&l_add, /* ... */ }; 
    int* sp = ...; 
    void** pc = program; 
    goto **pc; /* jump to first instruction */ 
l_add: 
    sp[1] += sp[0]; 
    ++sp; 
    goto **(++pc); /* jump to next instruction */ 
    /* ... other instructions */ 
} 

dışında bir sıçrama kaydetmesini, böyle dişli tercümanlar da daha verimlidir. Anton Ertl'in, özellikle yukarıdaki kod parçalarının uyarlandığı "Verimli Tercümanların Yapısı ve Performansı" adlı his home page numaralı ilginç makaleleri bulunmaktadır.

İlgili konular