Опубліковано випуск компонувальника Mold 3.0, який може застосовуватися як швидша прозора заміна GNU linker на Linux-Системи. Проект розвиває Rui Ueyama, автор компонувальника LLVM lld. Ключовою особливістю Mold є дуже висока швидкість зв'язування об'єктних файлів, що помітно випереджає компонувальники GNU gold і LLVM lld (компонування в Mold виконується зі швидкістю, всього вдвічі повільніше простого копіювання файлів утилітою cp). Код написаний мовою Rust та поширюється під ліцензією MIT.
Зменшення часу на компонування дозволяє значно підвищити зручність розробки великих проектів за рахунок скорочення очікування в процесі формування файлів, що виконуються при налагодженні та тестування змін. Мотивом до створення Mold стало роздратування від необхідності чекати завершення компонування після кожного внесення зміни до коду, а також низька ефективність роботи існуючих компонувальників на багатоядерних системах та бажання випробувати принципово іншу архітектуру компонування, не вдаючись при цьому до надмірно ускладнених моделей, таких як інкрементальна компонування.
Висока продуктивність компонування виконуваного файлу з великої кількості підготовлених компілятором об'єктних файлів Mold досягається використанням більш швидких алгоритмів, активним розпаралелювання операцій між доступними ядрам CPU і застосуванням більш ефективних структур даних. Наприклад, в Mold реалізована техніка виконання інтенсивних обчислень одночасно з копіюванням файлів, запобігає завантаження об'єктних файлів у пам'ять, використання швидких хеш-таблиць при роздільній здатності символів, сканування таблиць переміщень в окремому потоці і дедуплікація секцій, що повторюються в різних файлах.
Гілка Mold 3.0 примітна переписування кодової бази з C++ (C++20) на мову Rust. Mold 3.0 може використовуватися як прозора заміна Mold 2.42.1, останнього випуску мовою C++, і підтримує всі раніше доступні опції та цільові архітектури. Перехід на Rust дозволив убезпечити проект від потенційних проблем при обробці пошкоджених об'єктних файлів - у ситуаціях, коли версія на С++ аварійно завершувалася через звернення до областей пам'яті за межами буфера, варіант Rust зупиняє роботу на етапі перевірки кордонів. Продуктивність реалізації на Rust знаходиться на одному рівні з версією C++.
Крім міграції на Rust ключовою метою при розробці гілки 3.0 було підвищення сумісності з GNU ld та підготовка проекту до можливості використання як компонувальника за умовчанням у дистрибутивах Linux. Складальна система замінена з CMake на Cargo, а система тестів із ctest на cargo test. З залежностей виключено бібліотеку oneTBB.
Джерело: opennet.ru
