Přeskočit na obsah
Tech-Blog Chatujme.cz Chatujme.cz
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.

· aktualizováno 1. 9. 2026 · 713 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, off a next, 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/rust a manifest kanálu nightly ze 6. srpna 2026.

Programování

Rust překladače

← zpět na výpis