Rui Ueyama, autore del linker LLVM lld e del compilatore chibicc, ha presentato il primo rilascio stabile del nuovo linker ad alte prestazioni Mold, che supera notevolmente in velocità i linker GNU gold e LLVM lld nella fusione dei file oggetto. Il progetto è considerato pronto per implementazioni in produzione e può essere utilizzato come una sostituzione più veloce e trasparente del linker GNU sui sistemi Linux. Tra i piani per la prossima versione significativa c'è l'implementazione del supporto per la piattaforma macOS, dopo di che inizierà il lavoro per adattare Mold a Windows.
Mold è scritto in C++ (C++20) e distribuito sotto licenza AGPLv3, che è compatibile con GPLv3, ma non con GPLv2, poiché richiede di rilasciare modifiche quando si sviluppano servizi di rete. Questa scelta è motivata dalla volontà di ottenere finanziamenti per lo sviluppo: l'autore è disposto a vendere i diritti sul codice per la rilicenza sotto una licenza permissiva, come MIT, o a fornire una licenza commerciale separata per coloro che non si trovano bene con l'AGPL.
Mold supporta tutte le funzionalità del linker GNU e si distingue per le sue elevate prestazioni — il collegamento avviene a una velocità solo due volte più lenta rispetto alla semplice copia di file con l'utility cp. Ad esempio, per la compilazione di Chrome 96 (con una dimensione del codice di 1,89 GB) il tempo necessario per collegare i file eseguibili con debuginfo su un computer a 8 core utilizzando GNU gold è di 53 secondi, mentre con LLVM lld è di 11,7 secondi e con Mold solo 2,2 secondi (26 volte più veloce di GNU gold). Per collegare Clang 13 (3,18 GB) ci vogliono 64 secondi con GNU gold, 5,8 secondi con LLVM lld e 2,9 secondi con Mold. Per la compilazione di Firefox 89 (1,64 GB) sono necessarii 32,9 secondi con GNU gold, 6,8 secondi con LLVM lld e 1,4 secondi con Mold.

La riduzione dei tempi di linking consente di migliorare notevolmente la comodità nello sviluppo di grandi progetti, riducendo i tempi di attesa durante la creazione dei file eseguibili durante il debug e il test delle modifiche. La motivazione alla base della creazione di Mold è stata la frustrazione per la necessità di attendere il completamento del linking dopo ogni modifica al codice, oltre alla bassa efficienza dei linker esistenti sui sistemi multicore e il desiderio di provare un'architettura di linking fondamentalmente diversa, senza ricorrere a modelli eccessivamente complessi come il linking incrementale.
Le elevate prestazioni della creazione del file eseguibile da un gran numero di file oggetto preparati dal compilatore in Mold si ottengono utilizzando algoritmi più veloci, parallelizzando attivamente le operazioni tra i core CPU disponibili e applicando strutture dati più efficienti. Ad esempio, in Mold è implementata una tecnica per eseguire calcoli intensivi simultaneamente alla copia dei file, il caricamento anticipato dei file oggetto in memoria, l'uso di tabelle hash veloci per la risoluzione dei simboli, la scansione delle tabelle di spostamento in un thread separato e la deduplicazione delle sezioni duplicate in diversi file.
Fonte: opennet.ru
