*

şükela:  tümü | bugün
  • program yazan program yazma, yapay zeka tasarimi
  • "sablona ismarladim, t diye t diye." seklinde turkusu vardir. abi selam, "... diye turkusu vardir." entry'lerinin hala gideri var mi? bi bkz verip karsiya gececektim. bozuk kalmamis da. ://

    (bkz: template metaprogramming)
  • - beyler hadi, ust perdeden calicaz biraz. <klavyeyi kaldir>
    + abi hayirdir?
    - hadi hadi. <t diye, t diye>
  • allah'in yazdigi (yazdirdigi) kodlara istinaden de boyle denir (bazen).
  • metaprogramming zannedilenin aksine <meta> tag'i ile veya yapay zekayla ilgili bir mesele değildir.

    metaprogramming programın çalıştığı süre içinde kod yazmaya ve/veya manipüle etmeye yarayan programlama tekniklerinin bütünüdür.

    ilk olarak küçük ve daha sönük kalmış hali vardır ki buna reflection denir. reflection programın koduyla ilgili bilgiyi program çalışırken alma durumudur. buna örnek olarak kullandığı metodları öğrenme, class/instance variable'ları sıralama gibi meselelerdir. bunu her programlama diliyle yapmak mümkün değil çünkü compiled olan programlama dilleri compile olduktan sonra kaynak kodunu machine code'a çevirirler. dolayısıyla kaynak kodu sırasında yazılan şeyler kaybolmuş olur ve bunlara program çalışırken ulaşılamaz. c, c++ ve java bu dillere örnektir. öte yandan scripting dilleri denilen ruby, python, php, javascript gibi diller compile olmadan satır satır çalıştırıldıkları ve kaynak kodu kaybolmadığı için reflection sağlayabilirler. özellikle ruby'nin reflection yeteneği programla ilgili hemen hemen her şeye kolayca ulaşmanızı sağlar. yine de her compiled dil reflection sağlamayacak ya da her scripting dili reflection sağlayacak diye bir kaide yoktur.

    asıl kudretli metaprogramming ise program çalışırken programın içerğini değiştirebilmektir. mesela metaprogramming'i kullanarak kaynak kodunda tanımlanmamış bir metod çalıştırıldığında bu var olmayan kodun nasıl çalışması gerektiğini tanımlayabilirsiniz. bu güzel yapıldığı takdir de dinamik api wrapper'ları yazmak mümkündür.

    dinamik api örneği:
    mesela diyelim ki ekşisözlüğün şu anki api'ı için /entry?id=24234234 şeklinde bir url'si var* ve bu url json ya da xml olarak entry bilgisini programcıya geri veriyor. siz programınızda entry diye bir metod tanımlayıp api call yaparsanız entry'yi alırsınız. diyelim ki ekşisözlük daha sonra api'ını değiştirip /entry_al?id=24234234 yaptı. bu durumda sizin api'ınız eğer eski api hala desteklenmiyorsa artık çalışmacaktır ama metaprogramming teknikleriyle entry_al gibi var olmayan bir metodu yukardaki url'ye map edebilirseniz. daha henüz var olmayan bir api'la ilgili bir program yazabilirsiniz.

    class manipüle etmek:
    metaprogramming kullanarak programlama diliniz buna izin veriyorsa programın çalıştığı sırada var olan bir class'ı açabilir ve bunun içine yeni metodlar tanımlayabilirsiniz. dahası birbirine çok benzeyen metodları (örn: getter & setter) bir loop içinde class'ın içine tanımlayabilirsiniz. böylelikle programı debug ederek geçireceğiniz süre ve modifiye edilmesi gereken yer sayısı hızlıca azalır.

    peki metaprogramming gerekli midir? esasen değildir. metaprogramming bilmeden çok iyi bir programcı olabilirsiniz ve çok sofistike programlar yazabilirsiniz fakat metaprogramming size domain specific language yazmak ve var olan programlarınızı daha okunabilir ve güçlü hale getirmek ve daha yüzlerce yeni olasılık sunar.

    sonuç olarak bana kalırsa kullandığınız diller buna izin veriyorsa öğrenin.

    *ne yazık ki koskoca ekşisözlük'ün hala düzgün (hiç) bir public api'ı yok.

    ayrıca:
    (bkz: monkeypatching)
    (bkz: open class)
    (bkz: dynamic method)
    (bkz: dynamic dispatch)
    (bkz: macro)
    (bkz: blank slate)

hesabın var mı? giriş yap