2012-04-22 12 views
8

Derleme Zaman İşlevi Değerlendirmesi (CTFE) nasıl çalışır? Derleyicinin, çalışırken, var olmayan bir şeyi (örneğin, bir işlev) nasıl oluşturduğunu ve çalıştırdığını anlamaya çalışıyorum. Kaynak kodun derleme yoluyla ikili bir dosya haline gelmesi fikrine alışkınım ve sonra ikili çalıştırılıyor. Öyleyse, bir kaynak kodu derleyicinin çalıştığı ve çalıştırılabildiği halde çalıştırılabilir bir şey haline nasıl gelir? Bir işlev gerçekten oluşturulup çalıştırılıyor mu, yoksa bir işlev çağrısının öykünmesi mi?CTFE nasıl çalışır?

cevap

11

CTFE, Python gibi yorumlanmış bir dilden beklediğiniz gibi derleyicide oluşturulan bir yorumlayıcı kullanır. Böyle bir şey derlerken:

bool not(bool arg) { 
    return !arg; 
} 
void main() { 
    enum compileTime = not(true); // not() called at compile time 
    bool runTime = not(true);  // not() called at runtime 
} 

derleyici vb tokenising/Lexing/ayrıştırma ve olağan aşamalardan geçer. Enum compileTime karşılaşıldığında (veya derleme zamanı değeri gerektiren herhangi bir başka yapı), ifadenin sağ tarafında neyin olduğunu değerlendirmeyi deneyecektir. Bir sabit durumunda, beklediğiniz şeyi yapar ve bir sabit tutar. Bir işlev çağrısı ile karşılaşırsa, CTFE yorumlayıcıyı başlatacaktır. Verilen örnekte, argümanların ne olduğunu ve fonksiyondaki ifadelerin ne yaptığını bilir, adım adım ilerler ve her birini yorumlar. Bildirimi derleme zamanında yorumlayamazsa, derleme zamanı hatası verir. Bu basit örnekte, sadece parametreyi geçersiz kılar, ancak CTFE, burada belgelenen yapıları, sınıfları, döngüleri ve çok daha fazlasını yorumlayabilir - http://dlang.org/function#interpretation.

+4

Tümünün (veya çoğunun) bir uygulama olduğunu unutmayın. tation detayı. Aynı uç etkisi olan herhangi bir uygulama da işe yarayacaktır. – BCS

1

bu temelde derleyici Zamanında gerçekleşmesi gerekmez böylece kullanılan değerlerin hesaplanması için çalışır constant folding gelişmiş bir şeklidir (derleme sırasında olamaz operasyonlar (IO, hafıza alloc, ...) neden olur o

CTFE o açık yapılabilmesi içinde() örneğin bir enum için atayarak özeldir ve kullanıcı tanımlı fonksiyonlar bu bir tercüman tarafından yapılır yapabilirsiniz pratikte

değerlendirmek etmeye çalışır) başarısız derleyicide derleme