Friedrich-Alexander-Universität UnivisSuche FAU-Logo
Techn. Fakultät Willkommen am Department Informatik FAU-Logo
Logo I4
Lehrstuhl für Informatik 4
Betriebssystemtechnik
 
  Vorlesung
    - UnivIS-Infos
    - Inhalt
    - Voraussetzungen
    - Prüfungen
    - Folien
 
  Übungen
    - Inhalt
    - Tipps
       * Teamarbeit mit svn
       * Tools
       * AOStuBS-System
    - Aufgaben
       * A 1
       * A 2
       * A 3
       * A 4
       * A 5
       * A 6
       * A 7
 
  Evaluation
Department Informatik  >  Informatik 4  >  Lehre  >  SS 2008  >  Betriebssystemtechnik  >  Übungen  >  Aufgabe 3

Aufgabe 3: AspectC++-I/O-Library

Lernziele

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

Aufgabenbeschreibung

In dieser Aufgabe soll die in Aufgabe 1 erstellte Implementierung der OSE-I/O-Library 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 I/O-Library) in einem eigenständigen Modul (hier: Klasse oder Aspekt) implementiert ist.

Ausgabetermin Vorgabe (spätester) Abgabetermin
08.05.2008 -- 21.05.2008, 12:00

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&aumml;ndig overhead-frei (hängt von den verwendeten Features ab), so dass diesmal keine "harten" Grenzen für die zulässigen Größen vorgegeben sind. Es wird jedoch wieder eine Bestenliste geben, das sollte hoffentlich als Ansporn genügen :).
  • Die Aufgabe soll mit Eclipse bearbeitet werden, um Erfahrungen mit dem ACDT zu bekommen, welches bei größen AspectC++-Projekten (wie AOStuBS) unerlässlich ist.

Bearbeitung und Abgabe

Die Bearbeitung der Aufgabe soll in den im Rahmen von Aufgabe 2 gebildeten Gruppen erfolgen. Die Abgabe der Aufgabe erfolgt wiederum bei Wanja im Büro durch ein Mitglied der Gruppe. Wir werden uns dann im CIP-Pool anmelden, wo euer 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, wird im Folgenden kurz beschrieben:

  1. Lest und beachtet zunächst bitte die Hinweise auf der Tools-Seite. Dort steht, wo die OSE-Tools liegen und wie Eclipse gestartet wird.
  2. Import in Eclipse: In Eclipse File -> New Project wählen und dann C++ -> Standard Make C++ Project. Gebt dem Projekt einen Namen, z. B. IOLibrary, 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).
  3. 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.
  4. Makefile anpassen: Das Makefile öffnen und den zu verwendenden C++-Compiler anpassen: Die Zeile
    CXX := g++
    muss geändert werden in
    CXX := ag++ --repository ac.repo
    (Ab jetzt wird für jede Übersetzungseinheit vor dem g++-Lauf der Weber aufgerufen. Alle im Projektbaum vorhandenen Aspekte werden dabei automatisch gefunden und ausgewertet.)
  5. AspectC++-Unterstützung für das Projekt aktivieren: Dazu auf dem Projekt die folgende Option wählen: [Kontextmenü] -> Enable/Disable AspectC++ Support.
  6. AspectC++-Repository im ACDT einstellen: Damit die Join-Point-Visualisierung funktioniert, muss dem AspectC++-Eclipse-Plugin (ACDT) außerdem noch mitgeteilt werden, wo das vom Weber generierte Repository liegt. Dazu auf dem Projekt (Projektknoten des im Workspace-Navigator dargestellten Baums) 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 (wird beim ersten Kompilieren erstellt) im Projektverzeichnis angegeben werden. (Falls das Projekt noch nie gebaut wurde, existiert die Datei noch nicht.)
  7. 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 Join-Point-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 Aspekten, 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__
    
  • Mit der zusätzlichen Kommandozeilenoption -v9 (Makefile) spuckt ag++ sehr detaillierte Informationen darüber aus, was er gerade macht und welche Join-Points gefunden wurden.

Weitere Informationen zu AspectC++ findet ihr auf der AspectC++-Homepage, sowie unter /proj/i4ose/docs. Dort gibt es unter anderem:

  Impressum Stand: 2008-05-14 12:23   DL, WH