Metaprogramlama, bir programın kendisi hakkında bilgi sahibi olduğu veya kendi kendini manipüle edebileceği çeşitli yolları ifade eder.
C # gibi dillerde yansıma, program kendisi hakkındaki bilgileri inceleyebildiği için bir metaprogramlama biçimidir. Örneğin, bir nesnenin tüm özelliklerinin bir listesini döndürmek.
ActionScript gibi dillerde, eval ("x" + i) gibi yeni programlar oluşturmak için çalışma zamanında işlevleri değerlendirebilirsiniz. DoSomething (), i 1 olduğunda x1 ve i 2 olduğunda x2 adlı bir nesneyi etkiler.
Son olarak, meta programlamanın diğer bir yaygın biçimi, programın önemsiz olmayan modalarda kendini değiştirebildiği zamandır. LISP bununla ünlüdür ve Paul Graham'ın yaklaşık on yıl önce savunduğu bir şeydir. Onun özel denemelerinden bazılarına bakmam gerekecek. Ancak fikir, programın durumuna bağlı olarak programın başka bir bölümünü değiştireceğidir. Bu, günümüzün en popüler dillerinde çok zor olan çalışma zamanında kararlar almak için bir esneklik düzeyi sağlar.
Düz montajda programlamanın güzel günlerinde, çalışma zamanında kendilerini değiştiren programların gerekli ve çok yaygın olduğunu da belirtmek gerekir.
Paul Graham'ın "Lisp'i Farklı Yapan Şey" makalesinden :
Birçok dilde makro denen bir şey vardır. Ancak Lisp makroları benzersizdir. Ve ister inanın ister inanmayın, yaptıkları parantezlerle ilgilidir. Lisp'in tasarımcıları, sırf farklı olsun diye tüm bu parantezleri dile koymadılar. Blub programcısına Lisp kodu tuhaf görünüyor. Ancak bu parantezlerin bir nedeni var. Lisp ile diğer diller arasındaki temel farkın dışa dönük kanıtıdır.
Lisp kodu, Lisp veri nesnelerinden oluşur. Ve kaynak dosyaların karakter içermesi ve dizelerin dil tarafından desteklenen veri türlerinden biri olması önemsiz anlamda değil. Lisp kodu, ayrıştırıcı tarafından okunduktan sonra, üzerinden geçebileceğiniz veri yapılarından oluşur.
Derleyicilerin nasıl çalıştığını anlarsanız, gerçekte olan şey Lisp'in tuhaf bir sözdizimine sahip olmasından ötürü Lisp'in sözdizimi olmadığı için. Diğer diller çözümlendiğinde derleyici içinde oluşturulan ayrıştırma ağaçlarına programlar yazarsınız. Ancak bu ayrıştırma ağaçlarına programlarınız için tamamen erişilebilir. Onları manipüle eden programlar yazabilirsiniz. Lisp'de bu programlara makro denir. Program yazan programlardır.
Program yazan programlar? Bunu ne zaman yapmak istersin? Cobol'da düşünürseniz çok sık değil. Lisp'de düşünürseniz her zaman. Burada güçlü bir makro örneği verebilseydim ve orada söyleyebilseydim daha uygun olur! Peki ya bu? Ama bilseydim, Lisp'i tanımayan birine anlamsız gelebilirdi; burada ne anlama geldiğini anlamak için bilmeniz gereken her şeyi açıklayacak yer yok. In Ansi Common Lisp ben geldiğince hızlı ileri gitmek çalıştı ve hatta bu yüzden sayfa 160 kadar makrolar alamadım.
Ama ikna edici olabilecek bir tür argüman sunabileceğimi düşünüyorum. Viaweb editörünün kaynak kodu muhtemelen yaklaşık% 20-25 makro idi. Makroları yazmak sıradan Lisp işlevlerinden daha zordur ve gerekmediklerinde bunları kullanmak kötü bir tarz olarak kabul edilir. Yani bu koddaki her makro, olması gerektiği için oradadır. Bunun anlamı, bu programdaki kodun en az% 20-25'inin başka bir dilde kolayca yapamayacağınız şeyler yaptığıdır. Blub programcısı, Lisp'in gizemli güçlerine dair iddialarıma kuşkuyla baksa da, bu onu meraklandırmalı. Bu kodu kendi eğlencemiz için yazmıyorduk. Rakiplerimizle aramıza teknik engeller koymak için elimizden geldiğince sıkı programlama yapan küçük bir girişimdik.
Şüpheli bir kişi, burada bir bağlantı olup olmadığını merak etmeye başlayabilir. Kodumuzun büyük bir kısmı diğer dillerde yapılması çok zor olan şeyler yapıyordu. Ortaya çıkan yazılım, rakiplerimizin yazılımının yapamadığı şeyleri yaptı. Belki bir çeşit bağlantı vardı. Bu konuyu takip etmenizi tavsiye ederim. Koltuk değneklerinde topallanan o yaşlı adam göründüğünden daha fazlası olabilir.