2009-05-03 28 views
6

Yıllar önce sıkı bir grafik üzerinde çalışırken G/Ç sorunu Tom Duff bir döngü açılır ve aşağıdaki gibi onun Duff's Device oluşturuldu: (. Bu eski tarz fonksiyon parametrelerini kullanır Not - Bu bir hata değil)Duff'un Cihazı başka dillerde çalışıyor mu?

dsend(to, from, count) 
char *to, *from; 
int count; 
{ 
    int n = (count + 7)/8; 
    switch (count % 8) { 
    case 0: do { *to = *from++; 
    case 7:  *to = *from++; 
    case 6:  *to = *from++; 
    case 5:  *to = *from++; 
    case 4:  *to = *from++; 
    case 3:  *to = *from++; 
    case 2:  *to = *from++; 
    case 1:  *to = *from++; 
      } while (--n > 0); 
    } 
} 

Bu kodlama, derleyicide ve C'deki kodlamada doğrudan düşünmekten kaynaklanır ve C'nin durum bildiriminin başarısız olmasına bağlıdır. Kontrol yapılarını birbirine karıştırmakta bu tür yaratıcılık başka dillerde de çalışabilir mi?

+0

"eski stil işlev parametreleri" nedir? –

cevap

4

Sen bilgisayarlı GOTO ifadeleri destekleyen herhangi bir dilde (Fortran, bazı temel, vs.) yapabilir

+0

ama eğer GOTO'un atlayacağı adresi dinamik olarak hesaplayamazsanız, o kadar hantaldır ki, artık buna değmez. Bu yüzden PHP gibi dinamik dillerde iyi bir fikir olacağını düşünmüyorum ... –

3

C++ ile çalışır.

Oluşturulan kodun derleyicinize bağlı olmasına dikkat edin. Özellikle, Duff cihazını ARM mimarilerini hedef alan GCC'yi kullanarak derlediğimde, ortaya çıkan ARM assembler herhangi bir optimizasyon seviyesinde sub-optimal (GCC'nin bir atlama tablosuna dönüştüğünü düşünüyorum) oldu.

Sadece derleyiciyi kodlamayı bitirdim.

+3

Evet, derleyiciler pek fazla optimizasyon yapmadığında (Duff ortaya çıktığında) iyi oldu. Sorun şu ki, her adımda hem düşme akışı hem de 'kasa' etiketi var ve yazmaçları temizlemenin gerekmediğini anlamak için çok iyi bir derleyici gerekiyor. Ve iyi bir derleyici muhtemelen iyi olacak. naif uygulamanın döngüsünü yine de çözebilir. Yine de iyi bir röportaj sorusu yapar :) –

2

Duff aygıtı olan esasen bir bilgisayarlı diğer birçok dilde yapılabilir goto - montaj (tabii ki) ve FORTRAN onları doğrudan destekleyen bir çift.

2

Büyük dizi işlemeyi hızlandırmak için JavaScript'te çok başarılı bir şekilde kullandım. Keşke C# 'da kullanabilseydim. bu biraz daha yavaş count küçük olacak

dsend(to, from, count) 
char *to, *from; 
int count; 
{ 
    int n; 
    for(n=0; n!=count/8; n+=8){ 
     *to = *from++; 
     *to = *from++; 
     *to = *from++; 
     *to = *from++; 
     *to = *from++; 
     *to = *from++; 
     *to = *from++; 
     *to = *from++; 
    } 
    for(; n!=count; n++) 
    { 
     *to = *from++; 
    } 
} 

Tabii ama biraz daha okunabilir, biraz daha taşınabilir karşısında dilleri ve çok üretir: bu şekilde kullanmak olamaz bile

+2

Yapabilirsiniz. Temizleme vakasının döngü ile aynı olmasına gerek yoktur. Kaybolan döngüyü n/8 kat, ardından da 7 koşullu adımı yapın. Büyük diziler için göz önüne alındığında, son 7'deki küçük bir verimsizlik gürültüde kaybolur. –

+3

Paul, temizleme durumu döngü ile aynı değilse, o zaman haklı olarak Duff'ın aygıtı olarak adlandırılabileceğini düşünmüyorum. Duff'un cihazı sadece döngüde gezinmekle ilgili değil. Açılmamış bir döngünün ortasına atlamak için bir 'switch' ifadesi kullanmakla ilgilidir. –

0

yine iki döngüler olabilir büyük count ile benzer yarar.

İlgili konular