Opublikowano wersję kompilatora Mold 3.0, który może być używany jako szybsza, przezroczysta alternatywa dla GNU linkera w systemach Linux. Projekt rozwija Rui Ueyama, autor linkera LLVM lld. Kluczową cechą Mold jest bardzo wysoka szybkość łączenia plików obiektowych, zdecydowanie przewyższająca linkery GNU gold i LLVM lld (łączenie w Mold odbywa się z prędkością tylko dwukrotnie wolniejszą niż proste kopiowanie plików za pomocą polecenia cp). Kod napisany jest w języku Rust i jest udostępniany na licencji MIT.
Skrócenie czasu łączenia pozwala znacznie poprawić komfort pracy nad dużymi projektami poprzez redukcję czasu oczekiwania na tworzenie plików wykonywalnych podczas debugowania i testowania zmian. Motywacją do stworzenia Mold była frustracja związana z koniecznością czekania na zakończenie procesu łączenia po każdej zmianie w kodzie, a także niska wydajność istniejących kompilatorów w systemach wielordzeniowych oraz chęć przetestowania całkowicie innej architektury kompilacji bez uciekania się do nadmiernie skomplikowanych modeli, takich jak kompilacja inkrementalna.
Wysoka wydajność kompilacji pliku wykonywalnego z dużej liczby przygotowanych plików obiektowych w Mold osiągana jest dzięki zastosowaniu szybszych algorytmów, aktywnemu równolegleniu operacji pomiędzy dostępnymi rdzeniami CPU oraz wdrażaniu bardziej efektywnych struktur danych. Na przykład, w Mold zaimplementowano technikę wykonywania intensywnych obliczeń równocześnie z kopiowaniem plików, wstępnym ładowaniem plików obiektowych do pamięci, wykorzystaniem szybkich tabel haszujących podczas rozwiązywania symboli, skanowaniem tabel ruchów w osobnym wątku oraz deduplikacją powtarzających się w różnych plikach sekcji do połączenia.
Gałąź Mold 3.0 charakteryzuje się przepisywaniem kodu z C++ (C++20) na język Rust. Mold 3.0 może być stosowany jako przezroczysta zamiana Mold 2.42.1, ostatniej wersji napisaną w C++, i obsługuje wszystkie wcześniej dostępne opcje i architektury docelowe. Przejście na Rust pozwoliło zabezpieczyć projekt przed potencjalnymi problemami podczas przetwarzania uszkodzonych plików obiektowych — w sytuacjach, gdy wersja w C++ kończyła się awarią z powodu dostępu do obszarów pamięci poza buforem, wersja w Rust zatrzymuje działanie na etapie sprawdzania granic. Wydajność implementacji w Rust jest na tym samym poziomie, co wersja w C++.
Oprócz migracji na Rust kluczowym celem przy rozwoju gałęzi 3.0 było zwiększenie zgodności z GNU ld i przygotowanie projektu do możliwości użycia jako domyślnego łącznika w dystrybucjach Linuxa. System budowy został zmieniony z CMake na Cargo, a system testów z ctest na cargo test. Biblioteka oneTBB została wykluczona z zależności.
Źródło: opennet.ru
