From Wikipedia, the free encyclopedia
Ο όρος Μεταπρογραμματισμός (Αγγλικά: 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)
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.