GCC

Die GNU Compiler Collection ist eine Sammlung von Compilern aus dem GNU-Projekt, dass von Richard Stallman (MIT-Labs) ins Leben gerufen wurde  Es handelt sich um eine Compilersammlung für unterschiedliche Plattformen und Zielsprachen. Die beinhalteten Sprachen umfassen neben dem klassischen C/C++ auch Java, Fortran, Objective C oder Ada.  Der GCC Compiler läuft auf vielen Plattformen, darunter auch: x86, Alpha, IA-64, AMD64, Motorola 68000 und Motorola 88000 sowie PowerPC, Sun SPARC oder VAX und PDP-11.  Ausserdem läuft er auf einigen Embedded Systems wie Intel i960, Microchip PIC24 und PIC32 (für C) oder MicroBlaze und MMIX. 
Der GCC-Compiler verfügt über 2,1 Millionen Programmzeilen und 25.000 Dateien. 

GCC-Compiling-Vorgang
Der Ablauf des GCC-Compiling-Vorganges ist wie folgt:

Schritt 1: Das GCC Hauptprogramm wird vom User aufgerufen
Schritt 2: Ein Kommandozeilen-Argument wird von GCC interpretiert
Schritt 3:  Die vorliegende Zielsprache wird identifiziert
Schritt 4: Aufruf des passenden Ziel-Compilers
Schritt 5: Übergabe der Ausgabe an den Assembler
Schritt 6: Aufruf des Binders (Linker)
Schritt 7: Die Ausführbare Datei wird erstellt und ausgegeben 

Arbeitsweise des GCC-Compilers: Prä-Prozessor, Register Transfer Language 
Der GCC Compiler arbeitet mit einem Prä-Prozessor der den Quell-Code vorbehandelt und auch den entstehenden Assembler-Code in dem Preprocessing Step bearbeitet. Bei diesem Pre-Processing werden Compilermakros und Header Dateien  (Prä-Prozessing-Dateien) in z. B. C- oder Assembler-Code umgewandelt. Das jeweilige Zielsprachen-Frontend dient als Parser der einen Syntaxbaum erzeugt und diesen an ein Backend übergibt, wo er in die GCC-eigene  Register Transfer Language (RTL) überführt wird. Anschliesend wird der Code effizienter gemacht durch verschiedene Code-Optimierungen und schliesslich der fertige Assemblercode für die Zielplattform erstellt.  Der GCC-Compiler verfügt über ein Front-, Middle- und Backend. Der GCC-Compiler ist hauptsächlich in C programmiert.                                   
Siehe auch:    GNU   Compiler   Parser   Linker   Interpreter   Programmiersprache-C   C-Plus-Plus   ADA   Java   SPARC

  C-Plus-Plus
C++ Insertion Sort C++ Insertion Sort
C++ ist eine Weiterentwicklung von C und wurde 1985 von Bjarne Stroustrup präsentiert. Basierend auf C ist C++ jedoch objektorientiert. Mit C++ ist sowohl eine maschinennahe als auch eine gut strukturierte  Entwicklungsarbeit möglich. 

C++ Merkmale und Datenabstrahierung, Konzepte der Objekt-orientierten Programmierung 
Prinzipien der Datenabstraktion als auch generische Programmierung sind in C++ implementiert. Weitere Merkmale sind: prozedurale und modulare Programmierung, virtuelle Funktionen,  Ausnahmenbehandlung, Namensräume, Templates, Inline-Funktionen, Boolesche Typen, Typumwandlungen, Referenzen, die Möglichkeit zum Überladen von Operatoren und die C++ Standardbibliothek.  Typische Elemente des Klassenkonzeptes wie Polymorphismus, Vererbung (Inheritance) oder Destruktoren und Konstruktoren sowie das OOP-Konzept sind Teil von C++. 

C++ Entwicklung begann 1979 bei AT&T 
Stroustrup begann schon 1979 bei AT&T C++ zu entwickeln. Er erweiterte später C um ein Klassenkonzept und liess seine Erfahrungen mit Simula mit einfliessen. C++ hat wiederum Ada, Java, PHP und C# beeinflusst. Implementierungen von C++ sind in der  GNU Compiler Collection vorhanden, sowie durch Microsoft Visual C++ oder Borland C++ Builder erhältlich.  C++ heisst nicht D, da es als Erweiterung von C um die Objekt-Orientierung gedacht war und dem User ersparen sollte, mit zu viel Code-Zeilen zu tun zu haben.  C++ extrahierte einige Aspekte der Objekt-Orientierung und das Klassenkonzept von Simula, von Ada die Templates und Exceptions. Mit C++ soll eine bessere Datenabstrahierung als mit C möglich sein. 

C++-Literatur, Journale und Events 
Weiterführende Informationen über C++ findet man neben der Literatur von Stroustrup und anderen Autoren in eBooks, dem Journal of Object Oriented Programming (JOOP), den C++ Report oder dem C++ Users Journal oder in "Object".  Bekannte C++ Events sind die C++ World, Application Development, Object Technology, OOPSLA (Object-Oriented Programming, Systems, Languages, and Applications),  ECOOP (European Conference on Object-Oriented Programming) oder TOOLS (Technology of Object-Oriented Languages and Systems).  Im Bild ist der Sortieralgorithmus "Insertion Sort" in C++ wiedergegeben.                           
Siehe auch:    Programmiersprache-C   C-Sharp   Objektorientierte-Programmierung   GCC   Dot-NET   ASP-Dot-NET   Managed-C-Plus-Plus   C-Plus-Plus-CLI   Java   Sortieralgorithmus

  GNU

GNU (rekursives Akronym: GNU's not Unix) ist ein von der Free Software Foundation und Richard Stallman entwickeltes freies Betriebssystem im Rahmen des GNU Projektes.  GNU soll eine Alternative zu Unix sein und unterliegt der GNU GPL Lizenz. GNU basiert auf dem Mach Mikrokernel und den Diensten The HURD.  Hurd ist ein zweistufiges, indirektes Akronym: erste Stufe: HIRD of Unix-Replacing Daemons ("Herde Unix ersetzende Daemons"), HIRD bedeutet wiederum:  HURD of Interfaces Representing Depth ("Herde von Tiefe darstellenden Schnittstellen").  Zu GNU gehören der GNU C-Compiler und das Multiserverbetriebssystem GNU Hurd welches Multi-Threading-Fähigkeiten besitzt.  Bestandteile von GNU sind: GNU Mach (der Mikrokernel), GNU Hurd (Sammlung von Diensten die auch das Dateisystem, Datei-Zugriffs-Kontrollen und Netzwerkprotokolle beinhalten) und GNU Software (Software die den Kernel und die Dienste ergänzen:  GNU Compiler Collection, GNU Emacs und Bash (Bourne Again Shell)).  Innerhalb von GNU gibt es weitere Portierungen um die ins Stocken geratene Entwicklung Ende der 90er Jahre voranzutreiben: Debian GNU/Hurd nutzt Applikationen des Debian-Projektes die für GNU Hurd und GNU Mach nutzbar gemacht wurden.  Weiterhin wurde der GNU Mach-Mikrokernel auf dem L4 Mikrokernel der zweiten Generation portiert. Sowohl das L4 Hurd Projekt als auch Debian GNU/Hurd werden von Marcus Brinkmann vorangetrieben.                                         
Siehe auch:    GNU-Projekt   GPL   Mach-Mikrokernel   Mikrokernel   unix   Shell   Debian   Programmiersprache-C   Compiler   Multithreading

  Hyper-Threading

Hyper-Threading wurde von Intel entwickelt. Die Abarbeitung von Multithreaded Anwendungen werden optimiert indem die Ressourcen der CPU besser ausgenutzt werden.  Die Threads werden auf 2 logische Prozessoren aufgeteilt und vom Betriebssystem mit Hilfe von (S)MP-Verfahren (Symmetrisches Multiprozessorsystem) abgearbeitet. 

Hintergrund für die Einführung der Hyper-Threading-Technology
Verschiedene Möglichkeiten die Performance des Prozessors zu erhöhen wurden ausprobiert: Steigerung der Taktzyklen, Prefetching oder erweiterte  L1- bzw. L2- oder L3-Caches. Jedoch ergaben sich daraus einige Probleme: die mögliche Leistungssteigerung durch schnellere Taktzyklen erfolgt nicht linear zur Taktzahl sondern unterproportional und bedingt auch einen höheren Stromverbrauch und Abwärme.  Die Abwärmeproblematik bewog Intel dann auch zur Aufgabe der NetBurst-Architektur. Die 20 Pipeline-Stufen des Pentium 4 bewirken zudem eine wachsende Anzahl von Cache Misses (Cache Hit:  Daten sind bei der Anfrage im Cache vorhanden, Cache Miss: Daten sind bei der Anfrage nicht im Cache vorhanden) sowie Interrupts und fehlerhafte Sprung-Voraussagen. Eine Vergrösserung der Caches ist nicht wirklich effizient:  neben Kostensteigerungen in der Produktion wachsen mit grösseren L1- oder L2-Caches die Anforderungen zur Aufrechterhaltung höherer Taktzyklen oder geringerer Antwortzeiten.

Es wurde versucht, die Anzahl der Instruktionen pro Taktzyklus durch  Instruction-Level-Parallelism (ILP) zu erhöhen. Massnahmen dazu waren: Instruction Pipelining, Superskalarität, Out-of-Order-Execution, Registerumbenennung, Sprungvorhersagen und Speculative Execution.  Die parallele Ausführung mehrerer Threads wird durch replizierte Ressourcen bei modernen Prozessoren unterstützt, ist jedoch nicht immer sehr effektiv. Die Strategie der Out-of-Order Execution beispielsweise ermöglicht bei  superskalaren Prozessoren zwar Befehle ausserhalb der seriellen Reihenfolge auszuführen und damit die Pipelines besser auszulasten, bedingt jedoch, dass immer genügend Befehle zur Verfügung stehen, um die Prozessor-Ressourcen optimal auszulasten.  Die Tendenz, Errungenschaften aus dem Serverbereich auf den Desktopbereich zu übertragen trägt auch beim Hyper-Threading Rechnung: im Serverbereich wird schon länger mit zwei vollständigen Prozessoren (2-Prozessor-Systeme) gearbeitet, die in der Lage  sind, 2 Threads parallel abzuarbeiten.

Hyper-Threading-Technologie
Hyper-Threading wurde bei den Intel Prozessoren mit NetBurst Architektur eingeführt und ist eine Variante des hardwareseitigen Multithreading.  Die Hyper-Threading-Technology (HTT) funktioniert nur bei Multithreaded-Prozessoren (Mehrfädige Prozessoren). Dazu besitzt der Prozessorkern mehrere Registersätze und Programmzähler. Aus einem physischen Prozessor werden 2 logische Prozessoren, die  sich als solche auch beim Betriebssystem ausgeben. Beim Intel Pentium 4 Prozessor mit Northwood Kern wurden Hyper-Threading Ressourcen aktiviert (die auch schon beim Willamette-Kern vorhanden waren). Dabei handelt es sich um einen Trace Cache Next IP,  Instruction Streaming Buffers, ein Return Stack Predictor, Register Alias Tables, einen Next Instruction Pointer, ein Instruction TLB (Translation Lookaside Buffer) sowie Trace Cache Fill Buffers. Zudem verfügt jeder virtuelle Prozessorkern über  einen eigenen Interrupt Controller (Advanced Programmable Interrupt Controller). Der Trace Cache, die L1- und L2-Caches sowie die Instruction Queues, Memory Operation Queues und der Key Buffer werden aufgeteilt  (Ressourcen-Sharing). Ein Prozessorkern ist damit in der Lage, Threads simultan zu verarbeiten. Threads werden in mehrere Teilaufgaben zerlegt und durch parallel arbeitende Pipeline-Stufen abgearbeitet. Dazu  sind mehrere Registersätze und ein angepasstes Steuerwerk vorhanden. Ein Thread besitzt dazu einen eigenen Registersatz mit Stackpointer und Programcounter. Damit Hyper-Threading funktioniert, sollte das Betriebssystem SMP-Architekturen unterstützen.  Denn die CPU bzw. die Prozessorkerne sind beim Hyper-Threading softwaretechnisch ähnlich gesteuert wie ein SMP-System. Weiterhin sollte das Betriebssystem Multitasking-fähig sein und Kernel-Level-Threads unterstützen. 

Hyper-Threading Ressourcen werden unterteilt in:

1. Replicated Ressources: Replicated Ressources sind nachgebildete Ressourcen, bei denen die beiden virtuellen Prozessorkerne (Siblings - Geschwister) über einige der Ressourcen als eigene  Kopie verfügen. Dazu gehören ein vollständiger Registersatz mit Stackpointer und Programcounter (Befehlszählregister, Befehlszähler, Programmzähler, Instruction Pointer). 

2. Partitioned Ressources (unterteilte Ressourcen): die Ressourcen werden unter den Siblings aufgeteilt. Dazu gehören der Record Buffer, die Load/Store Buffer und die Instruction Queues. 

3. Shared Ressources (geteilte Ressourcen): die Siblings müssen sich Ressourcen mit anderen Siblings aufteilen. Oftmals können sie nur von einem Sibling gleichzeitig verwendet werden. Dazu zählen u.a. die ALU und die FPUs  (Floating Point Unit). Wenn das Betriebssystem die notwendigen Voraussetzungen erfüllt, können Standard-Anwendungen um bis zu 20% beschleunigt werden und entsprechend optimierte Anwendungen um bis zu 33%. 

Hyper-Threading Unterstützung durch Prozessoren und Betriebssysteme
Zu den Prozessoren, welche Hyper-Threading unterstützen gehören: Pentium 4 (ab Northwood mit 3066 MHz, Prescott, Prescott 2M und Cedar Mill),  Pentium Extreme Edition (Dual Core Prozessor Pentium D mit freigeschaltetem Hyper-Threading: Smithfield und Presler, Pentium EE) und die XEON 603/604.  Bei AMD: Athlon 64 X2, Opteron Dual Core Prozessoren und der Phenom. Betriebssysteme, welche Hyper-Threading unterstützen, sind: Windows XP, Windows Vista, Windows Server 2003, FreeBSD und Linux ab Kernel-Version 2.4.17.  Windows 2000 unterstützt zwar Hyper-Threading, kann es aber nicht effizient ausnutzen, da Windows 2000 nicht über eine Unterscheidung zwischen physikalischen und logischen Prozessoren verfügt.  Compiler, welche Hyper-Threading-fähigen Code erzeugen sind: die Intel-Compiler und die GNU Compiler Collection (GCC).  Voraussetzung ist jedoch, dass die Anwendungen parallelisierbar sind: die Abarbeitung eines Threads darf nicht abhängig sein vom Ergebnis eines anderen Threads.
Siehe auch:    Multithreading   Simultaneous-Multithreading   NetBurst   Mehrkernprozessor   Pipeline-Architektur   Superskalar   Thread   Register   ALU   SMP