Ανάκλαση (υπολογιστές): Διαφορά μεταξύ των αναθεωρήσεων

Περιεχόμενο που διαγράφηκε Περιεχόμενο που προστέθηκε
Χωρίς σύνοψη επεξεργασίας
+ ruby ex + αλλαγή κατηγορίας λήμματος + αφαίρεση διπλής βιβλιογραφίας
Γραμμή 1:
Στην [[πληροφορική]], ο όρος '''ανάκλαση''' ([[Αγγλική γλώσσα|αγγλ.]] '''reflection''') αναφέρεται στη δυνατότητα ενός [[Πρόγραμμα υπολογιστή|προγράμματος υπολογιστή]] να παρατηρεί και να μεταβάλλει τη δομή και τη συμπεριφορά του κατά την εκτέλεση. <ref>[http://www2.parc.com/csl/groups/sda/projects/reflection96/docs/malenfant/malenfant.pdf A Tutorial on Behavioral Reflection and its Implementation by Jacques Malenfant et al.]</ref>
 
Σε στατικές γλώσσες όπως η C/C++ όταν γράφουμε το πρόγραμμα πρώτα το μεταγλωττίζουμε σε γλώσσα μηχανής και στην συνέχεια το τρέχουμε. Καθώς το πρόγραμμα εκτελείται δεν είναι δυνατό να τροποποιηθεί το πρόγραμμα και κάθε αλλαγή θα πρέπει να γίνει στο πηγαίο κώδικα ο οποίος στην συνέχεια θα πρέπει να μεταγλωττιστεί σε γλώσσα μηχανής και να εκτελεστεί. Η ιδέα της ανάκλασης είναι ότι κάνουμε αλλαγές στο κώδικα του προγράμματος την ώρα που αυτό εκτελείται. Για παράδειγμα αν έχουμε μια κλάση μπορούμε την ώρα που το πρόγραμμα τρέχει, μέσω της ανάκλασης, να πάρουμε πληροφορίες για την κλάση και να τροποποιήσουμε την λειτουργία της (π.χ. να τροποποιήσουμε τον κώδικα των συναρτήσεων-μεθόδων). <ref name="reflexion_ruby">{{cite book|last=Cooper|first=Peter|title=Beginning Ruby : from novice to professional|year=2009|publisher=Apress|location=New York|isbn=978-1-4302-2363-4|pages=129-130|url=http://books.google.gr/books?id=A78bYfzYKZ4C&pg=PA129#v=onepage&q&f=false|edition=2nd ed.}}</ref> Η ιδέα είναι ότι οι εντολές του προγράμματος αποθηκεύονται σαν δεδομένα τα οποία μπορούν να τροποποιηθούν κατά την διάρκεια εκτέλεσης. Η δυνατότητα να προσθέτουμε νέο εκτελέσιμο κώδικα την ώρα που τρέχει το πρόγραμμα ονομάζεται μεταπρογραμματισμός (metaprogramming).
 
Η ανάκλαση εφαρμόζεται συνήθως σε γλώσσες υψηλού επιπέδου που τρέχουν σε κάποια εικονική μηχανή όπως η [[Smalltalk]] και άλλες [[Γλώσσα προγραμματισμού σεναρίων|γλώσσες σεναρίων]] όπως η [[Ruby]] <ref name="reflexion_ruby"/>, και λιγότερο σε στατικές γλώσσες όπως η [[Java]], η [[C (γλώσσα προγραμματισμού)|C]], η [[ML]] ή η [[Haskell]].
 
==Παράδειγμα==
 
Έστω ότι έχουμε μια κλάση στην [[Ruby]] με όνομα ''Foo'' με μία μέθοδο μέσα, την ''hello''' η οποία τυπώνει στην οθόνη το αλφαριθμητικό ''Hello!'':
 
<source lang="Ruby">
class Foo
def hello
puts "Hello!"
end
end
</source>
 
Στο παρακάτω παράδειγμα παρουσιάζεται ο κλασικός τρόπος δημιουργίας στιγμιότυπου (''instance'') της κλάσης ''Foo'' καλώντας τον κατασκευαστή (''constructor'') της κλάσης χωρίς την χρήση ανάκλασης. Στην συνέχεια καλούμε την μέθοδο ''hello''. Στο δεύτερο μέρος καλούμε την ίδια μέθοδο χρησιμοποιώντας ανάκλαση. Χρησιμοποιώντας τον Kernel Module <ref>{{cite web|title=Kernel|url=http://www.ruby-doc.org/core-2.1.2/Kernel.html|publisher=Ruby Documentation|accessdate=19 Μαΐου 2014}}</ref> δημιουργούμε το στιγμιότυπο Foo και στην συνέχεια μέσω της μεθόδου send <ref>{{cite web|title=Object|url=http://ruby-doc.org/core-2.1.1/Object.html|publisher=Ruby Documentation|accessdate=19 Μαΐου 2014}}</ref> ζητάμε την κλήση της μεθόδου ''hello''. Επίσης καλούμε την ίδια μέθοδο χρησιμοποιώντας την ''eval'' <ref>{{cite web|title=Kernel - eval|url=http://www.ruby-doc.org/core-2.1.2/Kernel.html#method-i-eval|publisher=Ruby Documentation|accessdate=19 Μαΐου 2014}}</ref>
 
<source lang="Ruby">
# χωρίς ανάκλαση
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"
</source>
 
==Παραπομπές==
{{παραπομπές}}
 
== Βιβλιογραφία ==
== Εξωτερικοί σύνδεσμοι ==
* [http://hdl.handle.net/1721.1/15961 Brian Cantwell Smith, Procedural Reflection in Programming Languages, Department of Electrical Engineering and Computer Science, Massachusetts Institute of Technology, PhD Thesis, 1982]
* [http://publications.csail.mit.edu/lcs/specpub.php?id=840 Brian C. Smith. Reflection and semantics in a procedural language. Technical Report MIT-LCS-TR-272, Massachusetts Institute of Technology, Cambridge, Mass., January 1982]
 
*{{cite book|last=Brian Cantwell|first=Smith|title=Procedural reflection in programming languages (PhD Thesis)|year=1982|publisher=Massachusetts Institute of Technology|url=http://dspace.mit.edu/handle/1721.1/15961}}
{{πληροφορική-επέκταση}}
 
[[Κατηγορία:Δομές δεδομένωνΠρογραμματισμός]]