URL: https://linuxfr.org/news/sortie-de-gcc-7-1 Title: Sortie de GCC 7.1 Authors: patrick_g David Marec, Oliver, Davy Defaud, RyDroid, Benoît Sibaud, claudex, François Perrad et Nÿco Date: 2017年04月06日T15:13:49+02:00 License: CC By-SA Tags: sortie_version, fortran, ada, gcc, cc, richard_stallman et objective-c Score: 67 La sortie de la nouvelle version majeure du [compilateur GCC](http://gcc.gnu.org/) du projet GNU [a été annoncée le 2 mai 2017](https://lists.gnu.org/archive/html/info-gnu/2017-05/msg00002.html). Écrit à l’origine par Richard Stallman, le logiciel GCC (_GNU Compiler Collection_) est le [compilateur](http://fr.wikipedia.org/wiki/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](http://en.wikipedia.org/wiki/GNU_Compiler_Collection#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](https://gcc.gnu.org/img/gccegg-65.png) ---- [Liste des changements de GCC 7](https://gcc.gnu.org/gcc-7/changes.html) [Un article introductif sur le site LWN](https://lwn.net/Articles/718910/) [La précédente dépêche pour la version 6.1](https://linuxfr.org/news/sortie-de-gcc-6) [Un article sur le blog Red Hat au sujet de la nouvelle alerte warning -Wimplicit-fallthrough](https://developers.redhat.com/blog/2017/03/10/wimplicit-fallthrough-in-gcc-7/) [Guide de migration vers GCC 7](https://gcc.gnu.org/gcc-7/porting_to.html) ---- 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**](https://fr.wikipedia.org/wiki/C_(langage)). Mais dès décembre 1987, la prise en charge expérimentale du [**C++**](https://fr.wikipedia.org/wiki/C%2B%2B) 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 divergence (_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](https://fr.wikipedia.org/wiki/Fortran), avec `gfortran` ; 6. Java, avec `gcj` ([qui est mort](http://tromey.com/blog/?p=911)) ; 7. [Ada](https://fr.wikipedia.org/wiki/Ada_(langage)), avec [GNAT](https://fr.wikipedia.org/wiki/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](https://gcc.gnu.org/develop.html) en août 2014 pour faire coïncider l’année 201`5` à la version GCC **`5`** et ainsi de suite pour donner : 201`6` → GCC **`6`**, puis 201`7` → GCC **`7`**. Attention, nous devrions donc avoir GCC **`10`** en 20`20`. 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 bogues sur GCC 7 ``` ![timeline](https://raw.githubusercontent.com/fperrad/graph-versions/gh-pages/gcc4.png) Nouveautés spécifiques à un ou des langages =========================================== Ada --- Sur les plates‐formes les plus courantes, les programmes Ada n’ont plus besoin que la pile soit exécutable pour fonctionner correctement. BRIG (HSAIL) ------------ Prise en charge de BRIG 1.0. BRIG est un format binaire pour HSAIL (_Heterogeneous System Architecture Intermediate Language_). Famille C/C++ ------------- Les langages C et C++ partagent les améliorations suivantes : - 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, etc. ; - le préprocesseur suggère aussi une correction si une directive est mal écrite ; - ajout des contrôles de débordement pour les opérations 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. ### Améliorations spécifiques au langage C - `-fopenmp` comprend le mot‐clef `_Atomic` de C11 ; - ajouts des types **flottants étendu**, `FloatN` et `FloatNx` ; la disponibilité de ces types dépend de l’architecture utilisée. ### Améliorations spécifiques au langage C++ - prise en charge expérimentale de **C++17** (`-std=c++1z`) ; - [l’ordre d’évaluation des expressions](https://linuxfr.org/news/cpp17-fixe-l-ordre-d-evaluation-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 ------- La version 4.5 de la [spécification OpenMP](http://www.openmp.org/specifications/) est maintenant partiellement gérée par le compilateur Fortran. Go -- - il y a une implémentation complète des paquets utilisateurs de Go 1.8.1 ; - par rapport à la chaîne de compilation de Go 1.8.1, le ramasse‐miettes est plus conservateur et moins concurrent ; - `-fgo-optimize-allocs` et `-fgo-debug-escape` Java ---- Java (GCJ) n’existe plus (mais le code est toujours disponible via le gestionnaire de versions). Diagnostics =========== Pour aider à la correction de bogues, GCC 7 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 [EDI](https://fr.wikipedia.org/wiki/Environnement_de_d%C3%A9veloppement "Environnement de développement intégré") ; - `fdiagnostics-generate-patch` : produit un fichier 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](https://gcc.gnu.org/wiki/Offloading), complètement ou partiellement, l’exécution de code par un processeur externe (c.‐à‐d. un ou plusieurs processeurs graphiques) : [OpenACC](https://gcc.gnu.org/wiki/OpenACC) et [OpenMP](https://gcc.gnu.org/wiki/openmp). Cette version améliore la prise en charge des spécifications **OpenACC 2.0A** et autorise le délestage de _régions openMP_ par les processeurs graphiques NVIDIA (PTX). Ces deux interfaces sont accessibles via la bibliothèque [_libgomp_](https://gcc.gnu.org/onlinedocs/libgomp/). Divers ====== - les extensions [Cilk+](https://en.wikipedia.org/wiki/Cilk) pour C et C++ sont considérées obsolètes ; - pour les nouvelles cibles, [un nouveau LRA (_Local Register Allocator_) est utilisé par défaut](https://gcc.gnu.org/wiki/LRAIsDefault).

AltStyle によって変換されたページ (->オリジナル) /