Sortie de GCC 7.1

La sortie de la nouvelle version majeure du compilateur GCC du projet GNU a été annoncée le 2 mai. Écrit à l’origine par Richard Stallman, le logiciel GCC (GNU Compiler Collection) est le compilateur de référence du monde du logiciel libre. Il accepte des codes sources écrits en C, C++, Objective-C, Fortran, Java, Go et Ada et fonctionne sur une multitude d’architectures.

La suite de la dépêche vous propose une revue de certaines améliorations et nouvelles fonctionnalités de cette nouvelle version.

GCC

Sommaire

Mais que veut dire GCC ?

En août 1987, GCC signifiait GNU C Compiler (Compilateur C de GNU) car il ne prenait en charge que le langage de programmation C. Mais dès décembre 1987, la prise en charge expérimentale du C++ a été intégrée (stabilisée avec GCC 2 publié en 1992). Six autres langages de programmation seront pris en charge progressivement (Objective-C, Objective-C++, Fortran, Java, Ada, et Go).

Le fork EGCS a commencé à avoir du succès. Après une longue période de négociation, les deux projets se sont finalement réunifiés en avril 1999 pour donner un nouveau nom : GNU Compiler Collection en conservant le même acronyme que le projet original. La première version du nouveau projet fut GCC 2.95.

Donc, depuis 1999, GCC signifie GNU Compiler Collection et prend en charge neuf langages de programmation (et bien d’autres expérimentalement ou avec des extensions) :

Collection de langages de programmation

  1. C avec gcc ;
  2. C++ avec g++ ;
  3. Objective-C ;
  4. Objective-C++ ;
  5. Fortran avec gfortran ;
  6. Java avec gcj (qui est mort);
  7. Ada avec GNAT ;
  8. Go avec gccgo
  9. OpenMP (c’est un langage qui étend d’autres langages de programmation) ;
  10. Cilk Plus ;
  11. OpenACC ;
  12. Unified Parallel C avec le GCC UPC compiler (expérimental).

Des logiciels tiers (third parties) permettent la prise en charge d’autres langages :

  1. Pascal avec gpc ;
  2. Modula (2 et 3) ;
  3. PL/I ;
  4. D avec gdc ;
  5. VHDL avec ghdl.

Schéma de version

Le projet GCC a modifié son schéma de version en août 2014 pour faire coïncider l’année 2015 à la version GCC 5 et ainsi de suite pour donner 2016 -> GCC 6 puis 2017 -> GCC 7. Attention, nous devrions donc avoir GCC 10 en 2020.

Détail des versions avec le nouveau schéma :

Branche de
développement      (2014-04-11) 
de GCC 4.10
 |
 |
GCC 4.10 renommée  (2014-08-13)
GCC 5.0
 |
 |
Branche de
développement
de GCC 5
 | 
 +-------- Branche de livraison
 |         GCC 5.x (2015-04-12)
 |                 |
 |                 v
 |         GCC 5.1 (2015-04-22)
 |                 |
 |                 v
Branche    GCC 5.2 (2015-07-16)
de dév.            |
GCC 6              v
 |         GCC 5.3 (2015-12-04)
 |                 |
 |                 v
 |         GCC 5.4 (2016-06-03)
 |\
 | \
 |  `----- Branche de livraison
 |         GCC 6.x (2016-04-15)
 |                 |
 |                 v
 |         GCC 6.1 (2016-04-27)
 |                 |
Branche            v
de dév.    GCC 6.2 (2016-08-22)
GCC 7              |
 |                 v
 |         GCC 6.3 (2016-12-21)
 |\
 | \
 |  `----- Branche de livraison
 |         GCC 7.1 (2017-05-02)
 |                 |
 v                 |
Branche            v
de dév.    Branche de correction
GCC 8        de bugs sur GCC 7

timeline

Nouveautés spécifiques à un ou des langages

  • Ada
    • Sur les plateformes les plus courantes, les programmes Ada n’ont plus besoin que la pile soit exécutable pour fonctionner correctement.
  • BRIG (HSAIL)
    • Support de BRIG 1.0. BRIG est un format binaire pour HSAIL (Heterogeneous System Architecture Intermediate Language).
  • Famille C/C++
    • En cas d’erreur (de frappe) sur le nom d’une variable membre, GCC 6 pouvait déjà suggérer un nom correct. GCC 7 va encore plus loin et détectant des noms mal orthographiés de fonctions, macros, types, énumérations…
    • Le pré-processeur suggère aussi une correction si une directive est mal écrite.
    • ajout des contrôle de débordement pour les opération arithmétiques, __builtin_add_overflow_p,__builtin_sub_overflow_p et __builtin_mul_overflow_p. Contrairement à leurs équivalents sans le _p final, ceux-ci ne demandent pas d’argument pour ranger le résultat de l’opération.
  • C
    • -fopenmp comprend le mot-clé _Atomic de C11.
    • Ajouts des types flottants étendu, FloatN et FloatNx. La disponibilité de ces types dépend de l’architecture utilisée.
  • C++
    • prise en charge expérimentale de C++17 (-std=c++1z)
    • l’ordre d’évaluation des expressions peut être activé hors C++17 (-fstrong-eval-order) ou désactivé pour ce dernier (-fno-strong-eval-order).
    • implémentation des fonctionnalités C++17 au sein de la libstdc++.
  • Fortran
  • Go
    • Il y a une implémentation complète des paquets utilisateurs de Go 1.8.1.
    • Par rapport à la chaine de compilation de Go 1.8.1, le ramasse-miettes est plus conservateur et moins concurrent.
    • -fgo-optimize-allocs et -fgo-debug-escape
  • Java (GCJ) n’existe plus (mais le code est toujours disponible via le gestionnaire de versions).

Diagnostics

Pour aider à la correction de bugs, GCC7 apporte ces directives intéressantes:

  • -fdiagnostics-parseable-fixit: les suggestions de correction sont diffusées sous un format plus lisible et capable d’être mieux digéré par les IDE.

  • fdiagnostics-generate-patch: produit un fichier de correctif dans le format unifié ( patch -u ) à la fin du diagnostic.

Délestage

Depuis la version 5, deux implémentations sont proposées pour délester, complètement ou partiellement, l’exécution de code par un processeur externe (i.e. un ou plusieurs GPU): OpenACC et OpenMP.

Cette version améliore la prise en charge des spécifications openACC 2.0A et autorise le délestage de regions openMP par les GPU NVIDIA (PTX).

Ces deux interfaces sont accessibles via la bibliothèque libgomp.

Divers

Lire les commentaires

(Source: LinuxFr.org : les dépêches)
Logo