Friedrich-Alexander-Universität UnivisSuche FAU-Logo
Techn. Fakultät Willkommen am Department Informatik FAU-Logo
Logo I4
Lehrstuhl für Informatik 4
Betriebssystemtechnik
 
  Vorlesungsüberblick
  Voraussetzungen
  Vorlesungsfolien
  Übungen
  Tools
  Teamarbeit mit svn
  Schein, Prüfung
  Evaluation
Department Informatik  >  Informatik 4  >  Lehre  >  SS 2005  >  OSE  >  Übung

Betriebssystemtechnik (OSE) - SS 2005

Aufgabe 3: Erste Schritte mit AspectC++

In dieser Aufgabe soll die in Aufgabe 1 erstellte Implementierung der OSE-IOLib durch Aspekte verbessert werden. Die Bibliothek soll so umstrukturiert werden, dass sie das Prinzip der Trennung der Belange so gut wie möglich umsetzt. Idealziel ist eine Implementierung in der jeder Belang (hier: gefordertes Feature der IOLib) in einem eigenständigen Modul (hier: Klasse oder Aspekt) implementiert ist.

Ausgabetermin Vorgabe (spätester) Abgabetermin
12.05.2005 -- 30.05.2005 17:00 (verlängert)

Lernziele

  • Erste Erfahrungen mit AspectC++ und den zugrunde liegenden Tools
  • Erste Erfahrungen in der Konfiguration von Produktlinien mit Aspekten

Aufgabenstellung

Aufgabe ist es, ein vergleichbares Maß an Konfigurierbarkeit wie in Aufgabe 1 zu erreichen, jedoch diesmal ohne den Komponentencode mit #ifdefs zu "verschmutzen":

  • #ifdef ist nur noch erlaubt um ganze Übersetzungseinheiten einzuschließen oder auszuschließen, also z.B. für Include-Wächter oder um einen Aspekt komplett zu deaktivieren (siehe auch unten).
  • Weiterhin sollt ihr natürlich die Größe im Auge behalten! Die Verwendung von Aspekten ist nicht in jedem Fall vollständig overhead-frei (hängt von den verwendeten Features ab), so dass ich diesmal keine "harten" Grenzen für die zulässigen Größen vorgebe. In der nächsten Übung präsentiere ich jedoch wieder eine Bestenliste, ich hoffe mal, das ist Ansporn genug "klein zu bleiben" :-)
  • Die Aufgabe soll mit Eclipse bearbeitet werden.

Bearbeitung und Abgabe

Die Bearbeitung der Aufgabe soll in den im Rahmen von Aufgabe 2 gebildeten Gruppen Gruppe erfolgen. Die Abgabe der Aufgabe erfolgt wiederum bei Daniel im Büro durch ein Mitglied der Gruppe. Wir werden uns dann per SunRay im CIP Pool anmelden, wo eurer funktionstüchtiges Implement abgabereif liegen sollte.

AspectC++ und Eclipse Setup

Um AspectC++ und Eclipse zu verwenden, muss euer Projekt aus Aufgabe 1 als sogenanntes "Standard Make Project" (Projekt mit externem, nicht von Eclipse verwaltetem Makefile) in einen Eclipse-Workspace importiert werden. Des weiteren muss das Makefile so angepasst werden, dass der Aspektweber aufgerufen wird. Wie das geht habe ich in der Übung gezeigt, hier noch einmal die wichtigsten Schritte in Kürze. Beachtet bitte auch die Hinweise auf der Tools Seite:

  1. Import in Eclipse: In Eclipse File->New Project wählen und dann C++ -> Standard Make C++ Project. Gebt dem Projekt einen Namen, z.B. IOLib, weitere Einstellungen sind nicht notwendig. Dann auf dem neuen Projekt [Kontextmenü]->Import und dann File System wählen. Im erscheinenden Dialog das Verzeichnis Eurer Aufgabe1-Lösung anwählen und markieren welche Dateien importiert werden sollen. (Den kompletten Ordner src, sowie Makefile, sections, config.h test?.cc.)
  2. Make-Targets definieren: Auf dem Projekt [Kontextmenü]->Build Make Targets wählen, um die Make-Aufrufe zu definieren (Add) bzw. Make mit einen Target aufzurufen. Am besten definiert ihr euch Ziele für test1, test2, sizes usw.
  3. Makefile anpassen: Das Makefile öffnen und den zu verwendeten C++-Compiler anpassen: Die Zeile
    CXX := g++
    muss geändert werden in
    CXX := ag++ --repository ac.repo
    (Ab jetzt wird für jede Übersetzungseinheit for dem g++-Lauf der Weber aufgerufen. Alle im Projektbaum vorhandenen Aspekte werden dabei automatisch gefunden und ausgewertet.)
  4. AspectC++ Repository im ACDT einstellen: Damit die Joinpoint-Visualisierung funktioniert, muss dem AspectC++ Eclipse-Plugin (ACDT) noch mitgeteilt werden, wo das vom Weber generierte Repository liegt. Dazu auf dem Projekt aufrufen: [Kontextmenü]->Properties->C++ Make Project und hier auf die Lasche AspectC++ Make gehen. Als Repository file muss hier der absolute Pfad auf die Datei ac.repo im Projektverzeichnis angegeben werden. (Falls das Projekt noch nie gebaut wurde, existiert die Datei noch nicht.)
  5. Testen mit einem einfachen Aspekt: Den folgenden Aspekt könnt ihr mal testweise als Test.ah speichern und (mit test1) ausprobieren ob der Weber und die Joinpoint-Visualisierung funktionieren:
    #ifndef __TEST_AH__
    #define __TEST_AH__
    
    #include "OutputStream.h"
    extern OutputStream out;
     
    aspect Test {
        advice execution( "% main(...)" ) : before() {
            out << "Hello from Aspect :-)\n";
        }
    };
    #endif // __TEST_AH__  
    

Noch ein paar Hinweise zu AspectC++

  • Aspektheader (.ah) sollten, genau wie normale Header, immer mit Include-Wächtern versehen werden, um zu verhindern, dass sie doppelt inkludiert werden.
  • Der Aspektweber webt grundsätzlich mit allen Aspekte, die im Projektbaum gefunden werden. Um konfigurationsabhängig einzelne Aspekte auszuschalten müsste man also die .ah-Dateien der deaktivierten Aspekte löschen oder umbenennen, so dass der Aspektweber sie nicht mehr analysiert. Da das auf Dauer doch ein wenig umständlich ist, könnt ihr #ifdefs verwenden, um komplette Aspekte konfigurationsabhängig zu aktivieren und deaktivieren. Wenn ihr z.B. die Ausgabe von Integerzahlen im Aspekt IntegerOutput implementiert habt, dann könnte das wie folgt aussehen:
    #ifndef __INTEGEROUTPUT_AH__	// include-guard
    #define __INTEGEROUTPUT_AH__
    
    #ifdef fameIntegerOutput
    
    aspect IntegerOutput {
        ...
        advice "ostream" : ...
        advice ...
        ...
    };
    
    #endif // fameIntegerOutput
    
    #endif // __INTEGEROUTPUT_AH__
    		
    	
  • around-advice bringt zur Zeit noch einen deutlich größeren Overhead mit sich als before/after.
  • Mit der zusätzlichen Kommandozeilenoption -v9 (Makefile) spuckt ag++ sehr detailierte Informationen darüber aus, was er gerade macht und welche Joinpoints gefunden wurden.
Weitere Informationen zu AspektC++ findet ihr auf der AspectC++ homepage sowie unter /proj/i4ose/docs. Dort gibt es unter anderem:
  Impressum   Datenschutz Stand: 2005-05-21 19:37   DL