
mold 3.0-ն անցել է Rust-ի․ Node.js-ի կապակցումը չափվել է 0.11 վայրկյանում

2026 թվականի հոկտեմբերի 5-ին հրապարակված mold 3.0.0-ի թողարկման գրառմամբ նախագիծը ներկայացրել է C++-ից Rust-ով վերագրված կապակցչի առաջին տարբերակը։ Թողարկումը նախատեսված է նախորդ տարբերակին անմիջապես փոխարինելու համար՝ պահպանելով հրամանի տողի տարբերակներն ու աջակցվող ճարտարապետությունները։ GNU ld-ի հետ համատեղելիության մնացած բացերը, հատկապես linker script-երի աջակցությունը, նախագծի հետագա աշխատանքի նպատակն են։
Հոկտեմբերի 6-ին Դանիել Լեմիրի Node.js-ի անկախ չափման մեջ mold 3.0.0-ը 128 հոսքով վերջնական կապակցումն ավարտել է 0.11 վայրկյանում, իսկ GNU ld 2.41-ը՝ 2.52 վայրկյանում։ Չափվել է արդեն պատրաստ օբյեկտային ֆայլերից կատարելի ծրագրի ստացումը, ուստի արդյունքը չի նկարագրում Node.js-ի ամբողջ կառուցման տևողությունը։ Այն առավել նշանակալի է այն նախագծում, որտեղ մշակողը հաճախ է կրկնում հենց կապակցման փուլը։
Ինչ է փոխվել Rust վերագրությունից հետո
mold 3.0.0-ի հիմնական փոփոխությունը կապակցչի իրականացումն է, մինչդեռ թողարկման նպատակը նախկին կառուցումների վարքը պահպանելն է։ Ըստ թողարկման գրառման՝ նախորդ C++ տարբերակը 2.42.1-ն էր, և նոր տարբերակը նույն հրամանային տարբերակներով ու թիրախային ճարտարապետություններով պետք է տա նույն ելքը՝ բացառությամբ թվարկված սխալների շտկումների։ Նախագիծը նաև նշում է, որ կապակցման արագությունը մնացել է նախորդ տարբերակի մակարդակին։ Հետևաբար Node.js-ի չափման առավելությունը չի կարելի վերագրել հենց ծրագրավորման լեզվի փոփոխությանը։
Համատեղելիությունը գնահատվել է աջակցվող բոլոր թիրախների թեստերով, իրական նախագծերի ելքային ֆայլերի համեմատությամբ և Gentoo-ի փաթեթների կառուցմամբ։ Այդ ծավալը կարևոր է այն թիմի համար, որը կապակցիչն արդեն օգտագործում էր և ցանկանում է փոխել տարբերակը՝ առանց կառուցման ամբողջ շղթան վերաձևելու։ Միևնույն ժամանակ առանձին ծրագրի հատուկ կարգավորումներն ու մուտքային ֆայլերը կարող են բացահայտել խնդիր, որը ընդհանուր փորձարկումներում չի հանդիպել։
Վերագրությունն ազդում է նաև վնասված մուտքային ֆայլերի մշակման վրա։ Նախկին C++ իրականացումը որոշ դեպքերում կարող էր կարդալ հիշողությունը թույլատրելի սահմաններից դուրս և ավարտվել խափանմամբ։ Rust տարբերակում նման հասանելիությունը ստուգվում է սահմաններով, և կապակցիչը կանգ է առնում սխալի տեղում։ Սա կապակցչի աշխատանքի անվտանգության փոփոխություն է, ոչ հրապարակված արագության թվերի բացատրությունը։
Ինքը՝ mold-ը, սկզբնաղբյուրից կառուցելու եղանակն էլ է փոխվել. CMake-ին փոխարինել է Cargo-ն, անհրաժեշտ են Rust 1.95 կամ ավելի նոր տարբերակ և C կոմպիլյատոր, իսկ oneTBB կախվածությունը վերացել է։ Պատրաստի երկուական ֆայլ օգտագործողին այս պահանջները կարող են անմիջապես չառնչվել։ Դրանք էական են այն մշակողների ու փաթեթավորողների համար, որոնք mold-ը հավաքում են իրենց համակարգում կամ տարածում ուրիշներին։
Որտեղ է ավարտվում համատեղելիության խոստումը
GNU ld-ի հետ համատեղելիության ընդլայնումը դեռ նպատակ է, հատկապես linker script-երի մասով։ Նման սցենարները կարող են որոշել բաժինների տեղադրությունն ու ելքային ֆայլի կառուցվածքը, ուստի սովորական օգտվողային ծրագրի հաջող կապակցումը դրանց մասին բավարար տեղեկություն չի տալիս։ Եթե նախագիծը հենվում է հատուկ կապակցման սցենարի վրա, mold-ի կիրառելիությունը որոշում է հենց այդ սցենարի արդյունքը։
Թողարկումը նաև ուղղում է ավելի կոնկրետ վարքագծային սխալներ։ Դրանց թվում են `--gc-sections` տարբերակով `--init` և `--fini` գործառույթների սխալ հեռացումը, նույն անունով տարբեր չափերի ընդհանուր սիմվոլների մշակումը և որոշ դեպքերում անկայուն ելքը։ Այս շտկումները կարևոր են առանձին կառուցումների ճշտության համար, բայց չեն նշանակում, որ GNU ld-ի բոլոր հնարավորությունները արդեն հասանելի են։
Այս տարբերակումը կարևոր է նաև թողարկումը գնահատելիս։ Նախորդ mold-ից անցնող սովորական Linux նախագիծը ստանում է անմիջական փոխարինման համար նախատեսված տարբերակ։ GNU ld-ից անցնող նախագիծը պետք է հաշվի առնի իր օգտագործած կապակցման ընտրանքներն ու սցենարները. նախորդ mold-ի հետ համատեղելիության խոստումը նույնը չէ, ինչ GNU ld-ի լիակատար համատեղելիությունը։
Ինչ է իրականում չափվել Node.js-ում
Լեմիրը Linux սերվերի վրա GCC 14.3-ով կառուցել է Node.js-ի հիմնական ճյուղը, ապա պահպանել վերջնական `node` ֆայլը կապակցող հրամանը։ Մեքենան ուներ Intel Xeon Gold 6548N երկու պրոցեսոր, ընդհանուր՝ 64 միջուկ և 128 հոսք։ Յուրաքանչյուր կապակցիչով հրամանը գործարկվել է վեց անգամ, իսկ հրապարակված ժամանակը դրանց մեդիանն է։ Այս մեթոդը համեմատում է նույն կապակցման աշխատանքը՝ փոխելով կապակցիչը։
Փորձի թվերը ցույց են տալիս նաև հոսքերի քանակի ազդեցությունը։ mold 3.0.0-ը մեկ հոսքով ավարտել է 0.49 վայրկյանում, ութ հոսքով՝ 0.13, իսկ 128 հոսքով՝ 0.11 վայրկյանում։ Նույն աշխատանքում GNU gold 2.41-ի ժամանակը եղել է 1.46 վայրկյան։ Այդ պայմաններում mold-ի մեծ առավելությունն արդեն երևում է ութ հոսքով. առավելագույն հոսքերի անցնելը համեմատաբար փոքր լրացուցիչ շահույթ է տվել։
Ծրագիրն ամբողջությամբ կազմելու ժամանակը կախված է նաև աղբյուրային ֆայլերի կոմպիլյացիայից, թեստերից և այլ քայլերից։ Եթե դրանք երկար են տևում, կապակցման փուլի մեծ արագացումը ընդհանուր կառուցման մեջ ավելի փոքր փոփոխություն կտա։ Իսկ խմբագրումից հետո հաճախ կրկնվող կապակցման դեպքում կարճացած սպասումն ուղղակիորեն փոխում է աշխատանքի ռիթմը։ Այլ սարքավորման կամ ավելի փոքր ելքային ֆայլի համար նույն 0.11 վայրկյանը սպասելի արդյունք չէ։
Ինչու նախագծի benchmark-ը այլ պատասխան է տալիս
Նախագծի հրապարակած benchmark-ում mold-ը համեմատվում է lld-ի և wild-ի հետ մեծ ծրագրերի վրա՝ AMD Ryzen Threadripper 7980X և Apple M1 Ultra համակարգերում։ Համեմատության կապակցիչները հավաքվել են 2026 թվականի օգոստոսի 28-ի դրությամբ. ժամանակները տաքացումից հետո երեք գործարկման մեդիաններն են, իսկ մուտքային ֆայլերի հավաքածուն հասանելի է վերարտադրության համար։ Այդ չափումները նախորդում են Rust տարբերակի թողարկմանը, հետևաբար առանձին չեն չափում վերագրության ազդեցությունը արագության վրա։
Տարբեր նախագծերն ու սարքավորումները փոխում են նաև կապակցիչների հարաբերակցությունը։ Նույն աղյուսակում, օրինակ, Apple M1 Ultra-ով Blender-ի release կառուցման ժամանակ wild-ի ցուցանիշը փոքր-ինչ լավ է mold-ից, մինչդեռ այլ տողերում mold-ն է առաջ։ Node.js-ի անկախ փորձը պատասխանում է ավելի նեղ հարցի՝ որքան է տևում մեկ կոնկրետ կատարելի ֆայլի վերջնական կապակցումը տվյալ Linux սերվերում։ Այս երկու հրապարակումների թվերից մեկ ընդհանուր արագացման գործակից ստանալը կթաքցնի այդ պայմանների տարբերությունը։
Ինչպես սահմանափակել փորձը մեկ կառուցմամբ
Առկա նախագծում փոփոխությունը հնարավոր է սկսել մեկ թիրախի կապակցման կարգավորումից։ Clang-ը, ինչպես նաև GCC 12.1.0-ից սկսած տարբերակները, ընդունում են `-fuse-ld=mold` ընտրանքը։ Rust նախագծի համար mold-ի փաստաթղթերում տրված է նախագծի տեղային `.cargo/config.toml` կարգավորում՝ Clang-ը որպես կապակցման հրամանի գործարկիչ և mold-ի ուղին փոխանցող ընտրանքով։ Այդպես կարելի է պահպանել համակարգի լռելյայն կապակցիչը մյուս կառուցումների համար։
Համեմատության համար նույն օբյեկտային ֆայլերը և կապակցման ընտրանքները պետք է օգտագործվեն երկու գործարկումներում, իսկ վերջնական կապակցման ժամանակը պետք է առանձնացվի ամբողջ կառուցման ժամանակից։ Ստացված ծրագիրը գործարկելն ու նախագծի համապատասխան թեստերն անցկացնելը նույնքան կարևոր է, որքան ժամանակը չափելը։ Հատուկ linker script ունեցող նախագծում փորձի վճռորոշ մասը ելքային ֆայլի պահանջվող կառուցվածքն ու վարքն են։
Այս թողարկման գործնական հետևանքն այն է, որ արդեն mold օգտագործող թիմերը կարող են գնահատել Rust տարբերակին անցումը իրենց կառուցումներում, իսկ GNU ld օգտագործողները՝ չափել հնարավոր շահույթը կոնկրետ թիրախի վրա։ Ավելի լայն կիրառությունը, հատկապես հատուկ կապակցման սցենարներով նախագծերում, կախված կլինի GNU ld-ի հետ մնացած համատեղելիության բացերի լուծումից։
Առնչվող հոդվածներ


Supabase թե Firebase․ իրական ժամանակը, offline-ը և հաշիվը տարբեր հաղթողներ ունեն

Gemini 4 Argon-ը դեռ փակ փորձարկման մեջ է․ API-ն սպասելու է

Cloudflare R2 թե AWS S3․ անվճար ելքը կարող է զոհել արագությունը

UiPath-ն ու Snowflake-ը տվյալը չեն պատճենում․ ավտոմատացումը երկկողմ է

Playwright թե Cypress․ արագ թեստը կարող է պահանջել նոր աշխատանքային հոսք
Բաժանորդագրվեք մեր տեղեկագրին
Ստացեք Web3-ի, ԱԲ-ի և կրիպտոյի վերջին լուրերն անմիջապես ձեր էլ. փոստին։