Ο όρος **Μεταπρογραμματισμός** (Αγγλικά: *Metaprogramming*) χαρακτηρίζει τα προγράμματα υπολογιστών τα οποία μπορούν να τροποποιούν προγράμματα. Για παράδειγμα ένα πρόγραμμα μπορεί κατά την διάρκεια της μεταγλώττισης να παράγει κώδικα ο οποίος στην συνέχεια μεταγλωττίζεται και δημιουργείται το εκτελέσιμο αρχείο σε γλώσσα μηχανής.  Ο *μεταπρογραμματισμός* είναι όρος που χαρακτηρίζει τα «προγράμματα που παράγουν προγράμματα», δηλαδή προγράμματα τα οποία τροποποιούν/δημιουργούν πηγαίο κώδικα. Στην γλώσσα C++ ο μεταπρογραμματισμός συσχετίζεται με τον προγραμματισμό με χρήση πρότυπων *templates*.  Σε γλώσσες σεναρίων (scripting languages) όπως η Ruby ο μεταπρογραμματισμός αναφέρεται στην δυνατότητα να προσθέτουμε νέο εκτελέσιμο κώδικα ο οποίος τροποποιεί την συμπεριφορά του προγράμματος κατά την εκτέλεση (runtime).  Στην γλώσσα Ruby ο μεταπρογραμματισμός βασίζεται στο API που επιτρέπει ανάκλαση.

Παραδείγματα
------------

Παρακάτω παρουσιάζονται δύο παραδείγματα μεταπρογραμματισμού. Στην C++ ο κώδικας (template metaprogramming) δημιουργείται κατά την διάρκεια της μεταγλώττισης ενώ στην Ruby κατά της διάρκεια εκτέλεσης (runtime).

### C++

Το παρακάτω παράδειγμα είναι παράδειγμα μεταπρογραμματισμού προτύπων (template metaprogramming) στην γλώσσα C++. Ο κώδικας της συνάρτησης Factorial (υπολογίζει το παραγοντικό ενός αριθμού) γίνεται κατά την διάρκεια μεταγλώττισης του προγράμματος. 

```
#include<iostream>

template<unsigned N> struct Factorial {
 enum { value = N \* Factorial<N-1>::value };
};

template<> struct Factorial<0> {
 enum { value = 1 };
};

int main(){
 std::cout << Factirial<5>::value; // τυπώνει τον 5! = 120
 std::cout << Factorial<10>::value; // τυπώνει τον 10! = 3628800
 return 0;
}

```

### Ruby

Έστω ότι έχουμε μια κλάση *acct* στην Ruby η οποία υλοποιεί την λειτουργία ενός τραπεζικού λογαριασμού όπου με την μέθοδο *deposit* προσθέτουμε δολάρια στον λογαριασμό.

```
acct.deposit(100)

```

Στην Ruby όλα είναι αντικείμενα, ακόμη και ένας αριθμός βρίσκεται κάτω από την κλάση Numeric η οποία παρέχεται από την γλώσσα. Μπορούμε με βάση τον μεταπρογραμματισμό να ανοίξουμε την κλάση αυτή και να προσθέσουμε μια μέθοδο η οποία μετατρέπει τα ευρώ σε δολάρια :

```
class Numeric
 def euros
 # το 1.38 είναι η παράμετρος μετατροπής ευρώ => δολάρια
 self \* 1.38 
 end
end

```

Τώρα μπορούμε να καλέσουμε την *acct.deposit(100.euros)* και αυτόματα τα 100 ευρώ μετατρέπονται ως δολάρια πριν περάσουν μέσα στην μέθοδο *deposit*.

```
acct.deposit(100.euros)

```

Δείτε επίσης
------------

* Ανάκλαση (υπολογιστές)
* Beazley, David (23 Μαρτίου 2013). *Python 3 Metaprogramming* (στα Αγγλικά). Pycon US 2013. Συμβαίνει στα 00:00. Ανακτήθηκε στις 19 Μαΐου 2014.

Παραπομπές
----------

1. ↑  «Boost – MetaProgramming Library (MPL)» (PDF). Εργαστήριο Γραφικών, Πολυμέσων & Γεωγραφικών Συστημάτων - Πανεπιστήμιο Πατρών. Αρχειοθετήθηκε από το πρωτότυπο (PDF) στις 9 Μαρτίου 2014. Ανακτήθηκε στις 19 Μαΐου 2014.
2. ↑  Gurtovoy, David Abrahams, Aleksey (2004). *C++ template metaprogramming concepts, tools, and techniques from boost and beyond* ([Nachdr.]. έκδοση). Boston, MA: Safari Tech Books Online. σελίδες 3. ISBN 978-0321227256.
3. 1 2  Fox, Armando (25 Σεπτεμβρίου 2013). *All Programming is Metaprogramming* [*Κάθε προγραμματισμός είναι μεταπρογραμματισμός*]. *Software as a Service διάλεξη στο μάθημα CS169* (στα Αγγλικά). University of Berkley. Συμβαίνει στα 00:00. Ανακτήθηκε στις 19 Μαΐου 2014.
4. ↑  Flanagan, David· Yukihiro, Matsumoto (2008). *The Ruby programming language* (1η έκδοση). Beijing: O'Reilly. σελ. 266. ISBN 978-0-596-51617-8.
5. ↑  Meyers, Scott (2005). *Effective C++ : 55 specific ways to improve your programs and designs* (3rd ed. 1st print. έκδοση). Upper Saddle River, NJ [u.a.]: Addison-Wesley. σελ. 235. ISBN 0-321-33487-6.