Έκδοση της σουίτας μεταγλωττιστή GCC 9

Μετά από ένα χρόνο ανάπτυξης δημοσιεύθηκε έκδοση ενός δωρεάν συνόλου μεταγλωττιστών GCC 9.1, η πρώτη σημαντική έκδοση στον νέο κλάδο GCC 9.x. Συμφωνώς προς νέο καθεστώς αριθμούς κυκλοφορίας, η έκδοση 9.0 χρησιμοποιήθηκε στη διαδικασία ανάπτυξης και λίγο πριν από την κυκλοφορία του GCC 9.1, ο κλάδος GCC 10.0 είχε ήδη διακλαδωθεί, βάσει του οποίου θα δημιουργηθεί η επόμενη σημαντική έκδοση, το GCC 10.1.

Το GCC 9.1 είναι αξιοσημείωτο για τη σταθεροποίηση της υποστήριξης για το πρότυπο C++17, συνεχίζοντας την εφαρμογή των δυνατοτήτων του μελλοντικού προτύπου C++20 (με κωδική ονομασία C++2a), συμπερίληψη στο frontend για τη γλώσσα D, μερική υποστήριξη για OpenMP 5.0 , σχεδόν πλήρης υποστήριξη για το OpenACC 2.5, αύξηση της επεκτασιμότητας των διαδικαστικών βελτιστοποιήσεων και βελτιστοποιήσεων στο στάδιο σύνδεσης, επέκταση διαγνωστικών εργαλείων και προσθήκη νέων προειδοποιήσεων, backend για OpenRISC, C-SKY V2 και AMD GCN GPU.

Ο κύριος αλλαγές:

  • Προστέθηκε υποστήριξη για τη γλώσσα προγραμματισμού D. Το GCC περιλαμβάνει ένα frontend με έναν μεταγλωττιστή GDC (Gnu D Compiler) και βιβλιοθήκες χρόνου εκτέλεσης (libphobos), οι οποίες σας επιτρέπουν να χρησιμοποιείτε το τυπικό GCC για τη δημιουργία προγραμμάτων στη γλώσσα προγραμματισμού D. Η διαδικασία ενεργοποίησης της υποστήριξης της γλώσσας D στο GCC έχει ξεκινήσει το 2011, αλλά σέρνεται λόγω της ανάγκης να συμμορφωθεί ο κώδικας με τις απαιτήσεις του ΣΣΚ και τα προβλήματα με τη μεταφορά των δικαιωμάτων πνευματικής ιδιοκτησίας στην Digital Mars, η οποία αναπτύσσει τη γλώσσα προγραμματισμού D.
  • Έχουν γίνει βελτιώσεις στη δημιουργία κώδικα. Για παράδειγμα, έχει εφαρμοστεί η χρήση διαφορετικών στρατηγικών για την επέκταση των εκφράσεων Switch (πίνακας μετάβασης, δοκιμή bit, δέντρο αποφάσεων) ανάλογα με τις καταστάσεις. Προστέθηκε η δυνατότητα μετασχηματισμού γραμμικών συναρτήσεων που περιλαμβάνουν μια έκφραση Switch χρησιμοποιώντας τη βελτιστοποίηση "-ftree-switch-conversion" (για παράδειγμα, ένα σύνολο συνθηκών όπως "περίπτωση 2: πώς = 205; διάλειμμα; περίπτωση 3: πώς = 305; διάλειμμα ;” θα μετατραπεί σε "100 * πώς + 5";
  • Βελτιωμένες διαδικαστικές βελτιστοποιήσεις. Οι ρυθμίσεις ενσωματωμένης ανάπτυξης έχουν προσαρμοστεί για σύγχρονες βάσεις κώδικα C++ και έχουν επεκταθεί με νέες παραμέτρους max-inline-insns-small, max-inline-insns-size, uninlined-function-insns, uninlined-function-time, uninlined-thunk-insns and uninlined -Tunk-time. Βελτιωμένη ακρίβεια και επιθετικότητα του διαχωρισμού κωδικών κρύου/θερμού. Βελτιωμένη επεκτασιμότητα για πολύ μεγάλα μεταφραστικές μονάδες (για παράδειγμα, κατά την εφαρμογή βελτιστοποίησης στο στάδιο σύνδεσης με μεγάλα προγράμματα).
  • Ο μηχανισμός βελτιστοποίησης που βασίζεται στα αποτελέσματα του προφίλ κώδικα (PGO - Profile-guided optimization) έχει βελτιωθεί, ο οποίος δημιουργεί βέλτιστο κώδικα με βάση την ανάλυση των χαρακτηριστικών της εκτέλεσης κώδικα. Επιλογή περίληψης "-fprofile-χρήση" περιλαμβάνει πλέον τις λειτουργίες βελτιστοποίησης "-fversion-loops-for-strides", "-floop-interchange", "-floop-unroll-and-jam" και "-ftree-loop-distribution". Καταργήθηκε η συμπερίληψη ιστογραμμάτων με μετρητές σε αρχεία, γεγονός που μείωσε το μέγεθος των αρχείων με προφίλ (τα ιστογράμματα δημιουργούνται πλέον εν κινήσει κατά την εκτέλεση βελτιστοποιήσεων κατά τη σύνδεση).
  • Ενισχυμένες βελτιστοποιήσεις χρόνου σύνδεσης (LTO). Η απλοποίηση των τύπων δόθηκε πριν από τη δημιουργία του αποτελέσματος, γεγονός που επέτρεψε τη σημαντική μείωση του μεγέθους των αρχείων αντικειμένων LTO, τη μείωση της κατανάλωσης μνήμης στο στάδιο σύνδεσης και τη βελτίωση της παραλληλοποίησης των λειτουργιών. Ο αριθμός των κατατμήσεων (-param lto-partitions) έχει αυξηθεί από 32 σε 128, γεγονός που βελτιώνει την απόδοση σε συστήματα με μεγάλο αριθμό νημάτων CPU. Προστέθηκε μια παράμετρος για τον έλεγχο του αριθμού των διαδικασιών βελτιστοποίησης
    "-param lto-max-streaming-parallelism"?

    Ως αποτέλεσμα, σε σύγκριση με το GCC 8.3, οι βελτιστοποιήσεις που εισήχθησαν στο GCC 9 επιτρέπεται μειώστε τον χρόνο μεταγλώττισης του Firefox 5 και του LibreOffice 66 κατά περίπου 6.2.3%. Το μέγεθος των αρχείων αντικειμένων μειώθηκε κατά 7%. Ο χρόνος δέσμευσης σε μια CPU 8 πυρήνων μειώθηκε κατά 11%. Το στάδιο διαδοχικής βελτιστοποίησης του σταδίου σύνδεσης είναι πλέον 28% ταχύτερο και καταναλώνει 20% λιγότερη μνήμη. Η κατανάλωση μνήμης για κάθε επεξεργαστή του παραλληλισμένου σταδίου του LTO μειώθηκε κατά 30%.

  • Οι περισσότερες από τις προδιαγραφές παράλληλου προγραμματισμού υλοποιούνται για γλώσσες C, C++ και Fortran OpenACC 2.5, το οποίο ορίζει εργαλεία για εκφόρτωση λειτουργιών σε GPU και εξειδικευμένους επεξεργαστές όπως το NVIDIA PTX.
  • Μερική υποστήριξη για το πρότυπο έχει εφαρμοστεί για C και C++ Ανοίξτε το MP 5.0 (Open Multi-Processing), το οποίο ορίζει το API και τις μεθόδους εφαρμογής παράλληλων μεθόδων προγραμματισμού για γλώσσες C, C++ και Fortran σε συστήματα πολλαπλών πυρήνων και υβριδικών (CPU+GPU/DSP) με κοινόχρηστη μνήμη και μονάδες διανυσματοποίησης (SIMD) ;
  • Προστέθηκαν νέες προειδοποιήσεις για τη γλώσσα C: "-Waddress-of-packed-mele" (μη ευθυγραμμισμένη τιμή δείκτη σε ένα γεμάτο μέλος μιας δομής ή ένωσης) και
    «-Απόλυτη-τιμή" (κατά την πρόσβαση σε συναρτήσεις για τον υπολογισμό μιας απόλυτης τιμής, εάν υπάρχει μια πιο κατάλληλη συνάρτηση για το καθορισμένο όρισμα, για παράδειγμα, θα πρέπει να χρησιμοποιείται fabs(3.14) αντί για abs(3.14). Προστέθηκαν νέες προειδοποιήσεις για την C++: "-Wdeprecated-copy",
    "-Winit-list-lifetime", "-Wredundant-move", "-Wpessimizing-move" και "-Wclass-conversion". Πολλές προειδοποιήσεις που ήταν διαθέσιμες στο παρελθόν έχουν επεκταθεί.

  • Προστέθηκε πειραματική υποστήριξη για μέρος του μελλοντικού προτύπου γλώσσας C, με την κωδική ονομασία C2x. Για να ενεργοποιήσετε την υποστήριξη C2x, χρησιμοποιήστε τις επιλογές "-std=c2x" και "-std=gnu2x" (για να ενεργοποιήσετε τις επεκτάσεις GNU). Το πρότυπο βρίσκεται ακόμη σε πρώιμο στάδιο ανάπτυξης, επομένως, όσον αφορά τις δυνατότητές του, υποστηρίζεται μόνο η έκφραση _Static_assert με ένα όρισμα (_Static_assert με δύο ορίσματα είναι τυποποιημένη στο C11).
  • Η υποστήριξη για το πρότυπο C++17 έχει δηλωθεί σταθερή. Στο frontend, οι γλωσσικές δυνατότητες της C++17 υλοποιούνται πλήρως και στο libstdc++, οι λειτουργίες της βιβλιοθήκης που ορίζονται στο πρότυπο πλησιάζουν στην πλήρη υλοποίηση.
  • Συνεχίζεται εφαρμογή στοιχεία του μελλοντικού προτύπου C++2a. Για παράδειγμα, έχει προστεθεί η δυνατότητα συμπερίληψης περιοχών κατά την προετοιμασία, έχουν εφαρμοστεί επεκτάσεις για εκφράσεις λάμδα, έχει προστεθεί υποστήριξη για κενά μέλη δομών δεδομένων και πιθανά/απίθανα χαρακτηριστικά, παρέχεται η δυνατότητα κλήσης εικονικών συναρτήσεων σε εκφράσεις υπό όρους , και τα λοιπά.
    Για να ενεργοποιήσετε την υποστήριξη C++2a, χρησιμοποιήστε τις επιλογές "-std=c++2a" και "-std=gnu++2a". Προστέθηκαν αρχεία κεφαλίδας bit και έκδοσης στο libstdc++ για C++2a, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible και χαρακτηριστικά std::type_identity, std::midpoint, συνάρτηση std::midpoint, , std::bind_front,
    std::visit, std::is_constant_evaluated και std::assume_aligned, πρόσθεσε υποστήριξη για τον τύπο char8_t, υλοποίησε τη δυνατότητα ελέγχου του προθέματος και του επιθέματος των συμβολοσειρών (starts_with, ends_with).

  • Προστέθηκε υποστήριξη για νέους επεξεργαστές ARM
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE και Neoverse N1. Προστέθηκε υποστήριξη για οδηγίες που εισάγονται στο Armv8.3-A για εργασία με μιγαδικούς αριθμούς, δημιουργία ψευδοτυχαίων αριθμών (rng) και ετικέτες μνήμης (memtag), καθώς και οδηγίες για τον αποκλεισμό επιθέσεων που σχετίζονται με κερδοσκοπική εκτέλεση και λειτουργία της μονάδας πρόβλεψης κλάδου . Για την αρχιτεκτονική AArch64, έχει προστεθεί μια λειτουργία προστασίας διασταυρώσεις στοίβας και σωρού (“-fstack-crash-protection”). Για να χρησιμοποιήσετε τις δυνατότητες της αρχιτεκτονικής Armv8.5-A, έχει προστεθεί η επιλογή "-march=armv8.5-a"

  • Περιλαμβάνει ένα backend για τη δημιουργία κώδικα για GPU της AMD με βάση τη μικροαρχιτεκτονική GCN. Προς το παρόν, η υλοποίηση περιορίζεται στη συλλογή εφαρμογών ενός νήματος (υποστηρίξεις για τη διεξαγωγή υπολογισμών πολλαπλών νημάτων μέσω OpenMP και OpenACC θα προσφερθεί αργότερα) και υποστήριξη για GPU Fiji και Vega 10.
  • Προστέθηκε νέο backend για επεξεργαστές OpenRISC;
  • Προστέθηκε backend για επεξεργαστές C-SKY V2, που παράγεται από την ομώνυμη κινεζική εταιρεία για διάφορες καταναλωτικές συσκευές.
  • Όλες οι επιλογές της γραμμής εντολών που λειτουργούν με τιμές byte υποστηρίζουν τα επιθήματα kb, KiB, MB, MiB, GB και GiB.
  • Εφαρμόστηκε η επιλογή "-flive-patching=[inline-only-static|inline-clone]" σάς επιτρέπει να επιτύχετε ασφαλή μεταγλώττιση για συστήματα ζωντανής επιδιόρθωσης λόγω του ελέγχου πολλαπλών επιπέδων στη χρήση διαδικαστικών (ΜΠΒ) βελτιστοποιήσεις.
  • Προστέθηκε η επιλογή "--ολοκλήρωση" για λεπτόκοκκο έλεγχο της ολοκλήρωσης της επιλογής κατά τη χρήση του bash.
  • Τα διαγνωστικά εργαλεία παρέχουν εμφανίσεις αποσπασμάτων κειμένου πηγής που υποδεικνύουν τον αριθμό γραμμής και επισημαίνουν οπτικά σχετικές πληροφορίες, όπως τύπους τελεστών. Για να απενεργοποιήσετε την εμφάνιση αριθμών γραμμών και ετικετών, παρέχονται οι επιλογές "-fno-diagnostics-show-line-numbers" και "-fno-diagnostics-show-labels".

    Έκδοση της σουίτας μεταγλωττιστή GCC 9

  • Αναπτυγμένος εργαλεία για τη διάγνωση σφαλμάτων στον κώδικα C++, βελτιωμένη αναγνωσιμότητα πληροφοριών σχετικά με τα αίτια των σφαλμάτων και επισήμανση προβληματικών παραμέτρων.

    Έκδοση της σουίτας μεταγλωττιστή GCC 9

  • Προστέθηκε η επιλογή "-fdiagnostics-format=json", η οποία επιτρέπει τη δημιουργία διαγνωστικών αποτελεσμάτων σε μορφή αναγνώσιμη από μηχανή (JSON).
  • Προστέθηκαν νέες επιλογές προφίλ "-fprofile-filter-files" και "-fprofile-exclude-files" για την επιλογή των αρχείων πηγής προς επεξεργασία.
  • Το AddressSanitizer παρέχει τη δημιουργία πιο συμπαγούς κώδικα επαλήθευσης για αυτόματες μεταβλητές, ο οποίος μειώνει την κατανάλωση μνήμης του εκτελέσιμου αρχείου που ελέγχεται.
  • Βελτιωμένη απόδοση σε "-fopt-πληροφορίες» (λεπτομερείς πληροφορίες σχετικά με τις προστιθέμενες βελτιστοποιήσεις). Προστέθηκαν νέα προθέματα "βελτιστοποιημένα" και "χαμένα", επιπλέον του προθέματος "σημείωση" που ήταν προηγουμένως διαθέσιμο. Προστέθηκε έξοδος πληροφοριών σχετικά με τη λήψη αποφάσεων σχετικά με το ξετύλιγμα και τη διανυσματοποίηση των κύκλων.
  • Προστέθηκε η επιλογή "-fsave-optimization-record", όταν καθορίζεται, το GCC αποθηκεύει το αρχείο SRCFILE.opt-record.json.gz με μια περιγραφή των αποφάσεων σχετικά με τη χρήση ορισμένων βελτιστοποιήσεων. Η νέα επιλογή διαφέρει από τη λειτουργία "-fopt-info" καθώς περιλαμβάνει πρόσθετα μεταδεδομένα, όπως πληροφορίες σχετικά με το προφίλ και τις ενσωματωμένες αλυσίδες.
  • Προστέθηκαν οι επιλογές "-fipa-stack-alignment" και "-fipa-reference-addressable" για τον έλεγχο της στοίχισης στοίβας και τη χρήση τρόπων διευθυνσιοδότησης (μόνο εγγραφής ή ανάγνωσης-ακριβούς) για στατικές μεταβλητές κατά τις διαδικαστικές βελτιστοποιήσεις.
  • Εισάγονται νέες ενσωματωμένες λειτουργίες για τον έλεγχο της σύνδεσης χαρακτηριστικών καθώς και της συμπεριφοράς που σχετίζεται με την πρόβλεψη διακλάδωσης και την κερδοσκοπική εκτέλεση εντολών: "__χτισμένο_έχει_ιδιότητα","__χτισμένη_αναμονή_με_πιθανότητα" Και "__builtin_speculation_safe_value". Προστέθηκε ένα νέο χαρακτηριστικό για συναρτήσεις, μεταβλητές και τύπους αντίγραφο;
  • Η πλήρης υποστήριξη για ασύγχρονη είσοδο/έξοδο έχει υλοποιηθεί για τη γλώσσα Fortran.
  • Η υποστήριξη για τις πλατφόρμες Solaris 10 (*-*-solaris2.10) και Cell/BE (Cell Broadband Engine SPU) έχει καταργηθεί και θα καταργηθεί στην επόμενη μεγάλη κυκλοφορία. Η υποστήριξη για τις αρχιτεκτονικές Armv2, Armv3, Armv5 και Armv5E έχει διακοπεί. Η υποστήριξη για το Intel MPX (Επεκτάσεις προστασίας μνήμης) έχει διακοπεί.

Πηγή: opennet.ru

Προσθέστε ένα σχόλιο