Programování

Rust zapnul nový borrow checker v kanálu nightly, stabilizovat ho chce do konce roku

Nová podoba borrow checkeru Rustu jménem Polonius Alpha je od 6. srpna v kanálu nightly. Přijme kód, který dosavadní kontrola odmítala, protože nově sleduje tok programu; část projektů za to zaplatí delším překladem. Do stabilního vydání se má dostat do konce roku.

· 6 zhlédnutí

Nafukovací maskot Rustu Ferris na stánku projektu
Nafukovací Ferris, maskot Rustu, na stánku projektu na konferenci 38C3. Foto: Igloo22225, Wikimedia Commons (CC BY 4.0)

Jack Huey za skupinu, která na Poloniu pracuje, oznámil 4. srpna, že se do nočních sestavení Rustu zapíná nová podoba borrow checkeru. Příspěvek o tom píše v přítomném čase, samotná úprava se ale do repozitáře dostala až o den později, 5. srpna ve 21:37 světového času. První nightly, které ji nese, je tedy až to ze 6. srpna: jeho manifest uvádí verzi 1.99.0-nightly (7608eb7b0 2026-08-05) a 7608eb7b0 je právě commit, kterým se ta změna slučovala.

Kontrola, která sleduje tok programu

Borrow checker je část překladače, která hlídá půjčené odkazy – že odkaz nepřežije data, na která ukazuje, a že vedle měnitelného odkazu neexistuje druhý. Dnešní stabilní podoba se jmenuje NLL a v Rustu je od roku 2019, kdy nahradila úplně první a hodně omezenou implementaci; její přechodový režim, který zůstal jen kvůli hezčím chybovým hláškám, zmizel v roce 2022.

Polonius Alpha přidává jedinou schopnost, zato podstatnou: vztahy mezi životnostmi posuzuje podle toho, kudy program teče. NLL je v tomhle slepé a dívá se na funkci jako na celek. Nejmenší příklad, na kterém je rozdíl vidět, uvádí oznámení takhle:

fn reborrow(a: &mut u8) -> &mut u8 {
    let b = &mut *a;
    if true { b } else { a }
}

Praktičtější případ je funkce, která z HashMap vrátí měnitelný odkaz na hodnotu a chybějící klíč nejdřív doplní. NLL usoudí, že půjčka vzniklá voláním map.get_mut žije po celou funkci, protože tak vypadá návratový typ – a tvrdí to i o větvi, kde se žádná hodnota nenašla a kde se do mapy vzápětí zapisuje. Právě proto ten zápis odmítne. Polonius Alpha pozná, že v téhle větvi už půjčka živá není, a kód přeloží.

Se starým Poloniem se nepřekrývá úplně

Jméno Polonius nesl už rozbor, který se od prací na NLL odštěpil v roce 2018. Ten prošel celou testovací sadou NLL a přijímal i kód, který NLL nepřijme, jenže byl pomalý – u některých programů natolik, že s ním podle oznámení nešlo počítat. Roky pokusů o rychlejší implementaci téhož zadání k ničemu nevedly. Až v roce 2023 vznikla jiná formulace, která staví na stávající infrastruktuře NLL a vyžaduje jen malou přestavbu; stabilizovat se měla původně už v roce 2024.

Slovo Alpha v názvu má svůj důvod. Některé programy, které starý Polonius přeložil, nová podoba odmítne; oznámení ukazuje cyklus while let, který si uvnitř přepůjčuje odkaz do dalšího prvku spojového seznamu. Platí to i obráceně, takže ani jedno není podmnožinou druhého.

Za přijatý kód se platí časem překladu

Polonius Alpha dělá vždy stejně práce jako NLL, nebo víc; méně nikdy. Návrh změny, který compiler team přijal 25. července, uvádí v měřicí sadě překladače průměrné zpomalení kolem 2 %. Z deseti tisíc nejstahovanějších crate jich 91 překročilo práh 2 % při celé kompilaci i se závislostmi a z pěti tisíc nejstahovanějších jich 61 překročilo práh 1 %, když se měřil jen samotný crate bez závislostí.

Ta dvě čísla se v oznámení na blogu slévají do jednoho: ukazuje jediný graf, mluví u něj o deseti tisících crate i o prahu 1 % a měřený čas u něj popisuje jako čas samotného crate bez závislostí. Návrh takovou dvojici nemá – vzorek pěti tisíc a vzorek deseti tisíc jsou v něm dvě různá měření s různým prahem.

Nejhorší zpomalení uvnitř první desetitisícovky je podle návrhu kolem 20 %. Mimo ni se tým díval hlavně na projekty s velkým počtem půjček a našel i horší případy: sestavovací skript jednoho z nich se překládá dvakrát až třikrát déle. Autoři to považují za přijatelné i v případě, že se to opravit nepodaří, protože jde o vzácné a povětšinou malé zpomalení; část příčin už prošla tříděním a na zmírnění se pracuje. Pro představu, o jaká čísla u rychlosti překladu jde: za předchozích osm měsíců rustc zrychlil o 5,6 %. Obě čísla ale pocházejí z jiných měření, takže se od sebe odečítat nedají.

Zapíná se při stavbě překladače, ne za běhu

Přepínač -Zpolonius v rustc existuje léta. Nové je to, čím se přepnula jeho výchozí hodnota: sestavovací skript nastaví proměnnou CFG_DEFAULT_POLONIUS_NEXT jen tehdy, když se překladač staví v kanálu nightly nebo dev. Beta ani stabilní vydání ji nedostanou a výchozí hodnota tam zůstává vypnutá.

Kdo o novou kontrolu na nightly nestojí, předá překladači -Zpolonius=off, ať už přímo, přes proměnnou RUSTFLAGS, nebo v souboru .cargo/config.toml. Pozor na jednu past: -Zpolonius bez hodnoty znamená legacy, tedy tu starou pomalou implementaci z roku 2018, ne novou. Přijímané hodnoty jsou legacy, offnext, jak stojí ve zdrojovém kódu rustc.

Kdy to bude ve stabilním Rustu

Projekt chce Polonius Alpha nechat na nightly zapnutý až do stabilizace a počítá s ní ještě letos. Do té doby sbírá hlášení o výkonnostních propadech, o nesprávně přijatém kódu a o podivných chybových hláškách; u posledního bodu oznámení dodává, že žádnou změnu proti NLL zatím nezaznamenali. Kdyby se něco vážného ukázalo, na nightly se kontrola zase vypne.

Po stabilizaci má vývoj Polonia utichnout. Optimalizovat a dolaďovat výkon se ještě chvíli bude, ale na další schopnosti – tedy na programy, které nepřeloží ani Alpha, ani NLL – se podle oznámení zatím nikdo nechystá. Projekt to zdůvodňuje tím, že Alpha řeší většinu případů, na které lidé v praxi narážejí, a že jsou přednější jiné věci.

Zdroje: oznámení na blogu Rustu, návrh změny v repozitáři compiler teamu, sloučená úprava rust-lang/rustmanifest kanálu nightly ze 6. srpna 2026.

Programování

Rustpřekladače

Diskuse

Zatím tu nikdo nediskutuje.

Diskutovat mohou přihlášení čtenáři – přihlaste se nebo si založte účet.

← zpět na výpis