Το frontend του μεταγλωττιστή Rust, το οποίο χειρίζεται εργασίες όπως η ανάλυση, ο έλεγχος τύπων και η ανάλυση δανεισμού, υποστηρίζει πλέον παράλληλη εκτέλεση, η οποία μπορεί να μειώσει σημαντικά τους χρόνους μεταγλώττισης. Η παραλληλοποίηση είναι ήδη διαθέσιμη στις νυχτερινές εκδόσεις του Rust και μπορεί να ενεργοποιηθεί χρησιμοποιώντας την επιλογή "-Z threads=8". Ο σταθερός κλάδος έχει προγραμματιστεί να συμπεριλάβει αυτήν τη λειτουργία το 2024.
Οι εργασίες για τη μείωση των χρόνων μεταγλώττισης στο Rust συνεχίζονται εδώ και αρκετά χρόνια. Κατά τους πρώτους 10 μήνες του 2023, οι χρόνοι μεταγλώττισης μειώθηκαν κατά μέσο όρο 13%, η μέγιστη κατανάλωση μνήμης μειώθηκε κατά 15% και το μέγεθος των παραγόμενων αρχείων μειώθηκε κατά 7%. Σε αυτό το στάδιο, η επιτάχυνση επιτεύχθηκε μέσω βελτιστοποιήσεων του ίδιου του μεταγλωττιστή. Στη συνέχεια, οι προγραμματιστές προχώρησαν στην εργασία για επιταχύνσεις παραλληλίζοντας τις λειτουργίες κατά τη μεταγλώττιση.
Μέχρι τώρα, η παραλληλοποίηση στο Rust παρεχόταν κυρίως σε επίπεδο διεργασίας, για παράδειγμα, ο διαχειριστής πακέτων Cargo μπορεί να εκκινήσει πολλαπλές διεργασίες rustc για να μεταγλωττίσει πολλαπλά πακέτα ταυτόχρονα. Η υποστήριξη παραλληλοποίησης υπάρχει επίσης στην πλευρά του backend, εκτελώντας λειτουργίες που σχετίζονται με τη δημιουργία κώδικα - το backend του Rust μπορεί να δημιουργήσει κώδικα σε μέρη, τα οποία η LLVM μπορεί στη συνέχεια να επεξεργαστεί παράλληλα. Μέχρι τώρα, το frontend μπορούσε να επεξεργαστεί τον πηγαίο κώδικα μόνο σε λειτουργία single-threaded.
Για την υποστήριξη της παραλληλοποίησης, το frontend έχει μετατραπεί στη βιβλιοθήκη Rayon και έχει αναδιαμορφωθεί σημαντικά, για παράδειγμα, πολλά από τα μέρη του είναι πλέον συγχρονισμένα χρησιμοποιώντας mutexes και κλειδώματα ανάγνωσης/εγγραφής, και ο κώδικας χρησιμοποιεί ατομικούς τύπους. Στις δοκιμές απόδοσης, η νέα παραλληλοποιήσιμη υλοποίηση θα μπορούσε να μεταγλωττιστεί έως και 2% πιο αργά όταν εκτελείται σε λειτουργία μονού νήματος (-Z νήματα=1), αλλά όταν υπήρχαν περισσότερα από ένα νήματα, η ταχύτητα αυξήθηκε σημαντικά. Για παράδειγμα, κατά τον ορισμό 8 νημάτων (-Z νήματα=8), σε ορισμένες περιπτώσεις, ο χρόνος μεταγλώττισης θα μπορούσε να μειωθεί κατά 50%.
Το αποτέλεσμα εξαρτάται σε μεγάλο βαθμό από τις ρυθμίσεις περιβάλλοντος και τον κώδικα που μεταγλωττίζεται - για πολύ μικρά προγράμματα που έχουν ήδη μεταγλωττιστεί γρήγορα, η μεταγλώττιση σε λειτουργία πολλαπλών νημάτων μπορεί να είναι πιο αργή. Επιπλέον, η κατανάλωση μνήμης σε λειτουργία πολλαπλών νημάτων μπορεί να αυξηθεί σημαντικά, για παράδειγμα, σε δοκιμές, η κατανάλωση μνήμης αυξήθηκε έως και 35%.
Πηγή: opennet.ru
