Refleksje

2007-11-23 22:19

Dzisiaj zastanowimy się nad refleksjami. Nie, nie jest to wcale masło maślane. Mechanizm refleksji (reflection – odbicie) jest zwany też introspekcją i polega na tym, iż działający program “wie” o swojej wewnętrznej strukturze. Prostą odmianą jest tutaj dynamiczna informacja o typie (RTTI), czyli możliwość określenia faktycznego typu obiektu znanego poprzez wskaźnik lub referencję.
W bardziej zaawansowanej wersji, obecnej na przykład w języku Java i na platformie .NET, refleksje są jednak czymś więcej. Stanowią faktyczne ‘odbicie’ struktury programu w postaci informacji dostępnych w czasie wykonania. Przy ich pomocy można na przykład uzyskać dokładne informacje o polach, metodach i właściwościach każdej klasy oraz jej miejscu w hierarchii dziedziczenia, nie mówiąc już o możliwości tworzenia jej instancji. Dostępność takich informacji umożliwia łatwe stworzenie modułu serializacji lub bardziej zaawansowanego odśmiecania pamięci, bazującego na przechodzeniu grafu odwołań między obiektami.

Ale C++ posiada tylko bardzo proste RTTI, które do takich celów jest daleko niewystarczające. Czy można jednak naprawić tę przypadłość? Jest na to kilka sposobów:

  • Można spróbować odczytać informacje debugowania generowane przez nasz kompilator. To może dawać kompletne informacje o wszystkich typach użytych w programie, ale ma dwie zasadnicze wady. Po pierwsze, wymaga kompilacji programu przynajmniej z pewnymi ustawieniami trybu debugowania także w wersji wydaniowej. A po drugie, jest w oczywisty sposób nieprzenośnie pomiędzy różnymi kompilatorami. Poza tym nie wydaje mi się, żeby było to proste rozwiązanie.
  • Innym podejściem jest odczytanie wszystkich danych bezpośrednio, czyli samodzielne przeanalizowanie kodu źródłowego i wygenerowanie na tej podstawie koniecznych informacji. Najpewniej wynikiem byłyby dodatkowy kod poddawany normalnej kompilacji. Wadą jest tu stopień skomplikowania: parsowanie kodu C++ łącznie z rozwijaniem dyrektyw preprocesora zdecydowanie nie jest prostym zadaniem. Ponadto proces kompilacji projektu stałby się bardziej złożony.
  • Jeżeli ktoś byłby dostatecznie zdesperowany, mógłby teoretycznie… stworzyć własny kompilator C++, obsługujący refleksje natywnie. Nie da się ukryć, że potrzeba by sporej siły, by zamachnąć się motyką na takie słońce :)
  • Wreszcie możliwe jest, aby programista podawał niezbędne informacje – zwykle jako kombinacja dziedziczenia i makr preprocesora. To podejście jest (stosunkowo) najprostsze w implementacji, ale zapewne najbardziej nieporęczne w użytkowaniu. Może być też podatne na błędy. Jednocześnie jednak ma największe szanse być przenośne i… działające :)

Gdybym aczkolwiek kiedyś cierpiał na dużą nadwyżkę wolnego czasu, to pewnie rozważyłbym implementację rozwiązania drugiego (lub jakiejś kombinacji rozwiązania drugiego i pierwszego, na przykład zlecającej rozwijanie makr programowi kompilującemu). Do tego czasu jednak C++ już dawno będzie posiadał wbudowany system refleksji ;)

Tags: ,
Author: Xion, posted under Programming »


6 comments for post “Refleksje”.
  1. SirMike:
    November 23rd, 2007 o 23:40

    Nie, nie i jeszcze raz nie :) Potem ten kod bedzie wygladal jak kupa pomieszana z wymiocinami.
    Zadnych “proof of concept” w jezyku, ktory ma byc szybki :)

  2. RedHot:
    November 24th, 2007 o 14:23

    Zapewne chodziło ci o refleksy , nie refleksje : / Echh , a jednak stajemy się jak gęsi.

  3. Xion:
    November 24th, 2007 o 15:24

    Nie, są to z pewnością “refleksje” – tak nazywane są one chociażby w polskim wydaniu ‘Thinking in Java’.

  4. RedHot:
    November 24th, 2007 o 15:42

    Widać tłumacz biedny. Refleksja – jest to zadumienie / zamyślenie się nad czymś. Refleksy (np. świetle) to jak sam napisałeś odbicia . Problem w tym , że po ang. brzmią one tak samo – reflection. Jakkolwiek słowo reflector oznacza “odbłyśnik” (heh miałem takie słowo w jednym ze słowników który był pod ręką) co wyraźnie sugeruje ,że w tematyce odbijania piszemy refleksy. Wystarczy się nad tym chwile zastanowić.

  5. Xion:
    November 24th, 2007 o 18:09

    Ja się naturalnie zgadzam z tym wszystkim, ale zwyczajów się nie zmieni. Jeżeli wszyscy mówią ‘refleksje’, to nic na to nie poradzimy.

    A że ten wyraz ma też inne znaczenie… No cóż, ‘stringi’ też mają ;-)

  6. Crane:
    November 24th, 2007 o 20:51

    W Core Java 2 nazywano to mechanizmem odbicia…

Comments are disabled.
 


© 2017 Karol Kuczmarski "Xion". Layout by Urszulka. Powered by WordPress with QuickLaTeX.com.