Ανάκλαση (υπολογιστές)

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

Στην πληροφορική, ο όρος ανάκλαση (αγγλ. reflection) αναφέρεται στη δυνατότητα ενός προγράμματος υπολογιστή να παρατηρεί και να μεταβάλλει τη δομή και τη συμπεριφορά του κατά την εκτέλεση.[1][2]

Σε στατικές γλώσσες όπως η C/C++ όταν γράφουμε το πρόγραμμα πρώτα το μεταγλωττίζουμε σε γλώσσα μηχανής και στην συνέχεια το τρέχουμε. Καθώς το πρόγραμμα εκτελείται δεν είναι δυνατό να τροποποιηθεί το πρόγραμμα και κάθε αλλαγή θα πρέπει να γίνει στο πηγαίο κώδικα ο οποίος στην συνέχεια θα πρέπει να μεταγλωττιστεί σε γλώσσα μηχανής και να εκτελεστεί. Η ιδέα της ανάκλασης είναι ότι κάνουμε αλλαγές στο κώδικα του προγράμματος την ώρα που αυτό εκτελείται. Για παράδειγμα αν έχουμε μια κλάση μπορούμε την ώρα που το πρόγραμμα τρέχει, μέσω της ανάκλασης, να πάρουμε πληροφορίες για την κλάση και να τροποποιήσουμε την λειτουργία της (π.χ. να τροποποιήσουμε τον κώδικα των συναρτήσεων-μεθόδων).[3] Η ιδέα είναι ότι οι εντολές του προγράμματος αποθηκεύονται σαν δεδομένα τα οποία μπορούν να τροποποιηθούν κατά την διάρκεια εκτέλεσης. Η δυνατότητα να προσθέτουμε νέο εκτελέσιμο κώδικα την ώρα που τρέχει το πρόγραμμα ονομάζεται μεταπρογραμματισμός (metaprogramming).[4]

Η ανάκλαση εφαρμόζεται συνήθως σε γλώσσες υψηλού επιπέδου που τρέχουν σε κάποια εικονική μηχανή όπως η Smalltalk και άλλες γλώσσες σεναρίων όπως η Ruby [3], και λιγότερο σε στατικές γλώσσες όπως η Java, η C, η ML ή η Haskell.

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

Έστω ότι έχουμε μια κλάση στην Ruby με όνομα Foo με μία μέθοδο μέσα, την hello' η οποία τυπώνει στην οθόνη το αλφαριθμητικό Hello!:

class Foo
   def hello
      puts "Hello!"
   end
end

Στο παρακάτω παράδειγμα παρουσιάζεται ο κλασικός τρόπος δημιουργίας στιγμιότυπου (instance) της κλάσης Foo καλώντας τον κατασκευαστή (constructor) της κλάσης χωρίς την χρήση ανάκλασης. Στην συνέχεια καλούμε την μέθοδο hello. Στο δεύτερο μέρος καλούμε την ίδια μέθοδο χρησιμοποιώντας ανάκλαση. Χρησιμοποιώντας τον Kernel Module [5] δημιουργούμε το στιγμιότυπο Foo και στην συνέχεια μέσω της μεθόδου send [6] ζητάμε την κλήση της μεθόδου hello. Επίσης καλούμε την ίδια μέθοδο χρησιμοποιώντας την eval [7]

# χωρίς ανάκλαση
obj = Foo.new
obj.hello
 
# με ανάκλαση
class_name = "Foo"
method = :hello
obj = Kernel.const_get(class_name).new
obj.send method
 
# χρησιμοποιώντας την eval
eval "Foo.new.hello"

Δείτε επίσης[Επεξεργασία | επεξεργασία κώδικα]

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

  1. «A Tutorial on Behavioral Reflection and its Implementation by Jacques Malenfant et al» (PDF). Αρχειοθετήθηκε από το πρωτότυπο (PDF) στις 22 Φεβρουαρίου 2016. Ανακτήθηκε στις 17 Μαΐου 2014. 
  2. Flanagan, David· Matsumoto, Yukihiro (2008). The Ruby programming language (1η έκδοση). Beijing: O'Reilly. σελ. 266. ISBN 978-0-596-51617-8. 
  3. 3,0 3,1 Cooper, Peter (2009). Beginning Ruby : from novice to professional (2η έκδοση). New York: Apress. σελίδες 129–130. ISBN 978-1-4302-2363-4. 
  4. Fox, Armando (25 Σεπτεμβρίου 2013). All Programming is Metaprogramming [Κάθε προγραμματισμός είναι μεταπρογραμματισμός]. Software as a Service διάλεξη στο μάθημα CS169 (στα Αγγλικά). University of Berkley. Συμβαίνει στα 00:00. Ανακτήθηκε στις 19 Μαΐου 2014. 
  5. «Kernel». Ruby Documentation. Ανακτήθηκε στις 19 Μαΐου 2014. 
  6. «Object». Ruby Documentation. Ανακτήθηκε στις 19 Μαΐου 2014. 
  7. «Kernel - eval». Ruby Documentation. Ανακτήθηκε στις 19 Μαΐου 2014. 

Βιβλιογραφία[Επεξεργασία | επεξεργασία κώδικα]