Login
Newsletter
Werbung

Do, 28. April 2016, 12:42

Software::Entwicklung

GCC 6.1 freigegeben

Ein Jahr nach GCC 5.1 haben die Entwickler nun Version 6.1 der freien Compiler-Suite veröffentlicht. Neben zahlreichen Verbesserungen bei der Optimierung ist die wohl wichtigste Neuerung, dass C++ jetzt standardmäßig die Spezifikation C++14 nutzt.

gnu.org

Neue GCC-Versionen erscheinen einmal im Jahr - an dieses Schema halten sich die Entwickler seit GCC 3.0 im Jahr 2001, lediglich GCC 3.2 verspätete sich um einige Monate. So steht jetzt ein Jahr nach GCC 5.1 die Version 6.1 bereit. Seit dem letzten Jahr umfasst die Versionierung von GCC nur noch zwei Nummern statt drei, wobei Versionen, die auf .0 enden, weggelassen werden.

GCC 6 warnt vor zusätzlichen fragwürdigen Konstrukten, die erfahrungsgemäß oft Programmierfehler darstellen. So gibt der Compiler nun eine Warnung aus, wenn die Einrückung des Codes im Widerspruch zum tatsächlichen Programmfluss steht. Auch ein Vergleich eines Objekts mit sich selbst und ein Vergleich, der immer dasselbe Ergebnis liefert, werden jetzt beanstandet. Wenn ein Vergleich in einer if-else-if-Kette ein zweites Mal erscheint, ist das nun ebenfalls eine Warnung wert, ebenso wie das undefinierte Verhalten von Shift-Operationen mit negativen Zahlen und Überläufen von Links-Shifts. Eine eingehendere Code-Analyse produziert zudem in vielen Fällen, in denen potentiell NULL-Zeiger dereferenziert werden oder unzulässige NULL-Werte übergeben werden, eine Warnung.

Eine fragwürdige Verbesserung des Optimierers ist, dass er immer voraussetzt, dass der this-Zeiger in Methoden von Klassen nicht NULL ist, so dass entsprechende Tests eliminiert werden. Dies ist technisch gesehen korrekt, ignoriert aber die Tatsache, dass sich viele existierende Projekte wie Qt 5, Chromium und KDevelop darauf verlassen, dass der Test funktioniert. All diese Projekte werden mit GCC 6 fehlerhaft generiert, so dass sie früher oder später abstürzen, außer die Option -fno-delete-null-pointer-checks wurde gesetzt.

Der UndefinedBehaviorSanitizer kann jetzt mit der Option -fsanitize=bounds-strict dazu veranlasst werden, Array-Grenzen strikt zu prüfen, was natürlich eine Instrumentierung des Codes erfordert, die das Programm langsamer macht. Enum-Variablen können mit Attributen versehen werden. Ein neues internes Konzept sind »Rich Locations« im Code. Damit können Fehler- und Warnmeldungen auf einen Bereich des Codes statt auf einen bestimmten Punkt verweisen, was in einigen Fällen zu klareren Meldungen führt. Außerdem kann der Compiler Hinweise zur Korrektur geben. Auch bei falsch geschriebenen Kommandozeilenoptionen gibt GCC Hinweise, was gemeint sein könnte.

Unter x86/x86_64 gibt es nun die Möglichkeit, Variablen relativ zu einem bestimmten Segment zu deklarieren. Damit wird gezielt ein bestimmtes Segment-Register für den Variablenzugriff genutzt. Bisher mussten solche speziellen Zugriffe in Assembler codiert werden, unter anderem im Linux-Kernel.

Eine weitere Neuerung ist das target_clones-Attribut. Damit kann ein Programmierer angeben, dass eine Funktion mehrfach für verschiedene Befehlssätze compiliert werden soll. Zur Laufzeit wählt das Programm dann die Variante, die zum ausführenden Prozessor passt. In der Regel ist das die Variante, die auf diesem Prozessor am schnellsten läuft.

GCC 6 macht die Spezifikation C++14 statt C++98 zum Standard und hat »C++ Concepts« gelernt. Ferner beherrscht er bereits weite Teile des kommenden C++17, wobei einige Funktionalitäten neu und experimentell hinzukamen. Das Pragma scalar_storage_order ermöglicht es, bei Feldern einer Struktur anzugeben, in welchem Endian-Format sie gespeichert sind. Beim Zugriff werden automatisch die passenden Konvertierungsfunktionen aufgerufen, wo nötig.

Ferner gab es auch Verbesserungen beim Ausführen von Code auf spezialisierten Prozessoren. In GCC 5 war schon das Verteilen von Funktionen auf Intel MIC über OpenMP und auf NVidia-GPUs mittels OpenACC möglich. In GCC 6 kommt neben allgemeinen Verbesserungen auch die Möglichkeit der Nutzung von HSA hinzu, einer Spezifikation, die die Kombination von CPUs und Beschleunigern in einem System standardisiert. Die Implementation der Spezifikation OpenACC 2.0a wurde wesentlich verbessert. Zusätzlich wird jetzt auch Version 4.5 der OpenMP-Spezifikation für C und C++ unterstützt.

Unter Linux wurde Unterstützung für die C-Bibliothek musl hinzugefügt. Daneben bringt GCC 6 viele architekturspezifische Änderungen, darunter verbesserte Optimierung für Aarch64. Aufgegeben wurde die Unterstützung der SH5/SH64-Familie, bis jemand sie wieder belebt. Die Unterstützung für alte ARM-Architekturen wurde als veraltet markiert und verschwindet wohl in der nächsten Version.

Eine Liste aller Änderungen kann man im Änderungslog des Compilers finden. Der Quellcode von GCC 6.1 kann von zahlreichen Spiegel-Servern des GNU-Projektes heruntergeladen werden.

Werbung
Kommentare (Insgesamt: 6 || Alle anzeigen )
Re[3]: Was soll denn das? (von der Insel, Fr, 29. April 2016)
Re[2]: Was soll denn das? (naklar, Fr, 29. April 2016)
Re: Was soll denn das? (:D, Fr, 29. April 2016)
Re[2]: Was soll denn das? (Jan2, Fr, 29. April 2016)
Re: Was soll denn das? (Tommy2, Do, 28. April 2016)
Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung