Μετάβαση στο περιεχόμενο

Μεταπρογραμματισμός

Από τη Βικιπαίδεια, την ελεύθερη εγκυκλοπαίδεια

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

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

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

#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;
}

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

acct.deposit(100)

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

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

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

acct.deposit(100.euros)
  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. 3,0 3,1 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.