Compilerbau 2

Nachdem ich letztes Semester schon Compilerbau 1 gehört habe, gibts dieses Semester die Fortsetzung. Nachdem wir einen Compiler gebaut haben, der eine Spielzeugsprache zerteilt, parsed, daraus Zwischencode generiert und letztendlich Code für eine spezifische Plattform (z.B. x86 oder die JVM) erzeugt, kommen jetzt die Optimierungen rein. Also Beispielsweise Umformungen auf dem Zwischencode, der unnötige Operationen spart. Zum Beispiel kann man es sich sparen den Index für ein Array zweimal auszurechnen, wenn sich der Offset nicht geändert haben kann.

int arr[31], b;
arr[30] = foo();
b = arr[30];

Hier würde ein naiver Compiler den Offset für das 30. Element (120 Byte offset) zweimal ausrechnen, ein optimiernder Compiler würde ihn erstens nur einmal ausrechnen, und zweitens schon zur Übersetzungszeit ausrechnen.

CPU Design

Eine extrem Spannende Vorlesung in der, man von Grund auf erklärt bekommt, wie man eine CPU baut und welche Probleme einem dabei begegnen werden. Es wird zunächst die Arithmetische Logische Einheit (ALU) gebaut, dann Speicher und es wird weitergehen zu Caches und Multi-Core Architekturen. Das wird also noch richtig spannend.

Das was diese Vorlesung für mich wirklich interessant ist, ist dass ich die Laborübungen dazu mache. Dabei baut man in einer kleinen Gruppe seine eigene CPU in VHDL, also einer Hardwarebeschreibungssprache. Dabei darf man keine angenehmen Sprachkonstrukte von VHDL (wie if oder so modernes Zeugs) benutzen, sondern muss alles diskret aus Gattern aufbauen und vor allem auf das Timing achten. Um davon mal einen Eindruck zu vermitteln, hier ein Stück VHDL aus unserer CPU, der ein Eingangswort negiert, falls ein Bit im Operationswort gesetzt ist:

-- negate the second input value, when bit 1 is set
sub_bitmask <= (others => operation(1));

-- Instanciate an XOR gate with 32 input pins, and negate it with 
-- the sub_bitmask. The output is connected to add_second_operand
negate_i2: entity work.op_xor
    generic map (width => 32)
    port map (
      i1 => i2, i2 => sub_bitmask, o => add_second_operand);

Die fertige CPU wird mit 333MHz laufen, wird Cache haben und gepipelined sein.

Organic Computing

Beim Organic Computing geht es darum, natürliche Gebilde zu betrachten, und aus der Betrachtung Algorithmen und Systeme abzuleiten, die sich gut an ihre Anforderung anpassen können, und nicht allzu spezialisiert sind.

Ein Beispiel, das wir bisher in der Vorlesung machen ist Partikelschwarmoptimierung. Der Partikelschwarm simuliert das Verhalten von irgendwelchen Tierschwärmen, die sich auf irgendeinen Punkt zum Landen einigen wollen. Die PSO ist eine Heuristik zur Lösung von kontinuierlichen Optimierungsproblemen. Also der Frage, wo liegt das Minimum für eine n-stellige Funktion.

Die Population an Partikeln die man erzeugt wird zunächst zufällig verteilt. In jeder Runde misst jedes Partikelchen, den Funktionswert an der Stelle, an der er gerade ist. Ist dieser Wert besser als der bisher beste Wert, den er selbst je besucht hat wird dieses lokale Optimumg geupdated. Ist der Wert auch noch besser als die lokalen Optima aller anderen Partikeln wird ein globales Optimum auch noch geupdated. Nachdem gemessen wurde, werden alle Partikel bewegt: Jedes Partikelchen hat eine aktuelle Geschwindigkeit, zudem wird er vom eignen lokalen Optimum und vom globalen Optimum angezogen. Das ganze noch mit ein bischen Zufall gewürzt und fertig ist der Partikelschwarm.

Es wird in der Vorlesung auch noch Ameisenalgorithmen, PageRank und Peer-to-Peer Netzwerke geben.

Mobile App Development

MAD ist ein Projekt bei dem eine Android App im Team entwickelt werden soll. Meine Gruppe ist ein sieben Köpfiges Team, das FASL weiterentwickeln soll. FASL, eine Skriptsprache für mobile Geräte, die letztes Semester schon von einer anderen Gruppe begonnen wurde. Jetzt soll FASL 0.2 auf Version FASL 1.0 gehoben werden.

Bei MAD geht es jedoch nicht nur die blose entwicklung, sondern auch um Agile Methoden zum Projekt Management. Es gibt also jede Woche einen Sprint, bei dem gewisse Tickets abgearbeitet werden sollen, um so die App jede Woche ein Stück vorwärts zu bringen.

Das Projekt ist bisher ganz lustig, und ich habe mit dem Backend Teil geschnappt und kann so meine Erfahrung aus Compilerbau 1 ganz gut einsetzen. Und wenns gut läuft muss ich nicht so viel GUI Code schreiben.

Advanced C++ Programming

Ein kleines Seminar mach ich auch noch. Hier geht es um gewissen Aspekte fortgeschrittener C++ Programierung, die man nicht jedem Anfänger in die Hand drückt. Ich werde 'C++ Meta Template Programming' und 'Continous Integration' machen. Also ein Sprachthema und ein Projektmanagementthema, wobei ich für beide Themen einen Vortrag halten werde.