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

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

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

Παραδείγματα[Επεξεργασία | επεξεργασία κώδικα]

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

C++[Επεξεργασία | επεξεργασία κώδικα]

Το παρακάτω παράδειγμα είναι παράδειγμα μεταπρογραμματισμού προτύπων (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;
}

Ruby[Επεξεργασία | επεξεργασία κώδικα]

Έστω ότι έχουμε μια κλάση 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). Εργαστήριο Γραφικών, Πολυμέσων & Γεωγραφικών Συστημάτων - Πανεπιστήμιο Πατρών. Ανακτήθηκε στις 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 (09 2013). All Programming is Metaprogramming (Αγγλικά) >00:00< Software as a Service διάλεξη στο μάθημα CS169 University of Berkley youtube (ανακτήθηκε 19 Μαΐου 2014)
  4. Flanagan, David. Matsumoto, Yukihiro (2008). The Ruby programming language (1st ed. έκδοση). Beijing: O'Reilly, σελ. 266. ISBN 978-0-596-51617-8. http://books.google.gr/books?id=jcUbTcr5XWwC&pg=PA266#v=onepage&q&f=false. 
  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. http://books.google.gr/books?id=Qx5oyB49poYC&pg=PA235&#v=onepage&q&f=false.