Meta-programlama


10

Bir C ++ geliştiricisi olarak yolculuğuma yeni başladım ve son zamanlarda meta-programlama adı verilen bir konuyu araştırıyorum. Şimdiye kadar, konuyla ilgili birçok bilgi edindim ve birkaç sorum var.

  1. C ++ 'da Yansıma Kullanımı: Mümkün mü? Anladığım kadarıyla yansıma, bir programın durumunu manipüle etme yeteneğine sahip bir meta-programlama tekniğidir ve manipülasyonu içgözlem veya içe dönük olabilir.

  2. Yansıtıcı mimari ile meta düzey mimari arasındaki fark nedir? Meta programlama mimarisi hangi kategoriye giriyor?

  3. Meta programlama iki seviyede gelir: meta seviye ve taban seviye. Anladığım kadarıyla, nesne programı veya incelenmekte olan sistem temel düzeydir ve incelenen sistem üzerinde çalışacak meta program meta düzeyidir. Doğrumuyum?

Ayrıca, C ++ 'da şablon meta programlaması üzerinde çalışma hakkında bazı yönergeler sağlayarak bana yardımcı olun.
Bu programlama tekniğinde uygulamalı olmak için arayabileceğim bazı uygulanabilir örnekler önerebilir misiniz?


2
Bu soru yığın akışından ziyade programcılara ait olabilir. İlki daha teorik, daha sonra daha pratik. Bazı bölümler pratik bir bakış açısıyla kolayca cevaplanabilir C ++ yansıması yoktur , ancak diğerleri kodla ilgili değildir (örneğin yansıtıcı ve metalevel mimarileri arasındaki fark)
David Rodríguez - dribeas

Bu SO yanıtı, C ++ 'ın neden yansımasının olmadığını ele alır: stackoverflow.com/q/359237/120163 ve kötü simüle etmek için bazı zayıf C ++ teknikleri.
Ira Baxter

Metaprogramlama ile çok ilgileniyorsanız, bu noktada C ++ 'dan daha açık olan D diline bakmanızı öneririm.
deadalnix

Yanıtlar:


10

Meta programlama basitçe diğer kodu yazan kod yazma araçlarına sahip olduğunuz anlamına gelir (geniş anlamda). C ++ bunu temelde güvenli bir makro dili olan şablon mekanizması aracılığıyla yapar. Sadece şablon genişletme adımını uygulamak mükemmeldir ve sonuç şablon içermeyen C ++ kodu olacaktır.

Yansıma , bir programlama dilinin ve / veya çalışma zamanı ortamının çalışma zamanında kendi dil öğelerini denetleme (ve genellikle değiştirme) yeteneğidir. Yansıtıcı diller genellikle sınıflar, yöntemler, değişkenler, parametreler vb. Dil öğelerini temsil eden veri yapılarının yanı sıra bunları incelemek, değiştirmek ve oluşturmak için rutin veya sınıflar sunar. Değiştirme yeteneği yansımayı bir tür meta programlama yapar, çünkü diğer kodu üreten kod yazmanıza izin verir.

Diğer meta programlamaya örnek olarak kod üreteçleri, kendi kendini değiştiren ikili dosyalar (bunlar bugün yirmi yıl önce olduğu kadar popüler olmasa da), C makroları; körelme ve benzer fonksiyonel programlama tekniklerinin de bir tür metaprogramlama olduğu söylenebilir.


+1 Cevabınızı gerçekten seviyorum ve derleyiciyi C # gibi bir hizmet olarak kullanma veya çalışma zamanında oluşturulan kodu yürütmek için Java gibi bir komut dosyası altyapısı kullanma hakkında soru sormak istiyorum. Bu aynı zamanda bir tür meta programlama değil mi?
M.Sameer

Yani C'de bir Python tercümanı yapan herkes meta program mıdır? Nesne yönelimli bir dili SQL ile eşleştiren bir ORM'nin uygulanmasına ne dersiniz? Her web çerçevesi bir metaprogramlama örneği midir?
kojiro

1
  1. Hayır. Öyle değil. C ++ programları makine koduna derlenir ve sınıflar vb. İle ilgili tüm bilgiler kaybolur (.NET ortamı için C ++ / CLI kullanılmadıkça, ancak bu saf C ++ değildir).

2-3. Bilmiyorum - bu konuda yardımcı olan başka bir cevap bekleyin :-)

C ++ şablonlarını kullanarak meta programlama çok güçlü ancak aynı zamanda karmaşıktır. Şablon genişletme, C ++ 'ın kullandığı zorunlu programlama yerine işlevsel programlama tarzı gerektirir. Fonksiyonel programlama konusunda daha önce deneyiminiz yoksa, servis yolu seçmenizi ve temel lisp, haskell veya şemayı öğrenmenizi tavsiye ederim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.