Přejít k navigační liště

Zdroják » Různé » C++ mělo dávno zemřít. Po čtyřiceti letech pořád pohání hry i prohlížeče

C++ mělo dávno zemřít. Po čtyřiceti letech pořád pohání hry i prohlížeče

Články Různé

Bjarne Stroustrup začal C++ vyvíjet v Bell Labs v roce 1979, protože mu tehdejší jazyky nedávaly zároveň přehledné abstrakce a kontrolu nad hardwarem. Stejný kompromis řeší herní enginy a prohlížeče dodnes. Úplná náhrada C++ navíc vyžaduje změnit víc než zdrojový kód.

Stroustrup dostal v Bell Labs neobvykle volnou ruku. Rozhodl se postavit distribuovaný operační systém vycházející z Unixu. Podle vzpomínek v univerzitním profilu však brzy zjistil, že je to práce větší než pro jednoho člověka. A také že pro ni nemá vhodný programovací jazyk.

Bjarne Stroustrup hovoří na konferenci CEE-SECR 2010 v Moskvě
Bjarne Stroustrup na konferenci CEE-SECR 2010 v Moskvě. Foto: Julia Kryuchkova, Wikimedia Commons, CC BY-SA 2.5.

C++ začalo jako C s třídami

První verze C++ se jmenovala jednoduše „C with Classes“, tedy C s třídami. Stroustrupa zaujaly třídy v programovacím jazyce Simula, protože pomáhaly uspořádat složitější program. Simula však pro systémovou práci nebyla dost rychlá a neposkytovala mu potřebnou kontrolu nad hardwarem. C obojí nabízelo, ale se stavbou rozsáhlého programu pomáhalo méně.

Název C++ přišel v roce 1983 a první komerční implementace v říjnu 1985. Ve stejném roce Stroustrup vydal také svou knihu The C++ Programming Language. Od komerčního vydání tak uplynulo přes čtyřicet let, na samotném jazyce ale začal pracovat už v roce 1979.

Třídy nebyly cílem samy o sobě. Měly vývojářům umožnit pojmenovat a uspořádat části složitého programu, aniž by přišli o možnost rozhodovat o paměti a hardwaru. Nemuseli tak při každém projektu volit mezi přehledným kódem a přístupem ke stroji. Kvůli takové nabídce stálo za to přijmout i komplikovanější jazyk.

Mezi herní postavou a pamětí

Herní engine řeší podobný problém dodnes. Na jedné úrovni pracuje s postavami, scénami a fyzikou. O kus níž záleží na rozložení dat v paměti a na tom, kolik práce se stihne mezi dvěma snímky. C++ dovoluje obojí řešit v jednom jazyce. Unreal Engine na něm stále staví a Epic podle potřeb projektu doporučuje kombinovat C++ a Blueprint, svůj vizuální skriptovací systém.

Jedním z principů C++ je zero-overhead: funkce jazyka, které program nevyužívá, ho nemají zpomalovat. Použitá abstrakce má být při stejných požadavcích stejně efektivní jako odpovídající řešení napsané ručně nízkoúrovňovými prostředky. Je to návrhový cíl, ne certifikát rychlosti všeho s příponou .cpp.

C++ umí svázat soubor, zámek nebo jiný prostředek s životností objektu. Když objekt zanikne, jeho destruktor prostředek uvolní: zavře soubor nebo odemkne zámek. Stejně se C++ zachová při výjimce, kterou převezme vyšší část programu. Tento způsob správy prostředků se označuje jako RAII. Programátor díky němu nemusí ručně hlídat uvolnění prostředku na každé cestě z funkce.

#include <mutex>

std::mutex mutex;

void zpracuj()
{
    std::lock_guard<std::mutex> zamknuto(mutex);
    // chráněná práce
}Code language: C++ (cpp)

C++ se neprosadilo jen ve hrách. Je v něm napsaný ROOT v CERNu, používaný k analýze vědeckých dat. Komunitní SerenityOS v něm postavil operační systém od kernelu po uživatelské aplikace.

Starý kód má pořád co říct

Ani samotné C++ už se nemusí psát tak jako ve starších učebnicích. Výraznou modernizaci přineslo C++11, mimo jiné s chytrými ukazateli, které přebírají část starostí o životnost objektů. Další změny následovaly. Chromium dnes používá C++23, ovšem s vlastními pravidly, která některé možnosti jazyka zakazují.

Vedle novějšího zápisu totiž dál existují starší způsoby, jak udělat totéž. Pro člověka, který se C++ učí, je to dost nevděčné dědictví. Týmu se zavedeným produktem ale umožňuje modernizovat postupně a dál používat kód, který už má. Jazyk tím přichází o šanci jednoduše odhodit minulost, zatímco jeho uživatelé si ušetří povinný přepis.

A přepis velkého programu by stejně nezačínal na čistém stole. Bylo by potřeba znovu dosáhnout jeho výkonu, napojit knihovny a ověřit chování, které původní systém získával roky. Za podivnou podmínkou ve starém kódu může být chyba konkrétního zařízení nebo požadavek na kompatibilitu. Hezčí náhrada, která o takových drobnostech neví, může zpočátku fungovat hůř.

Tým Chromia narazil při zavádění Rustu na překážku zabudovanou přímo do architektury. Jeho C++ kód obsahoval rozsáhlé sítě ukazatelů, přes které šlo měnit stejná data různými cestami. Rust pro měnitelnou referenci vyžaduje výlučný přístup k daným datům. Aby s nimi mohl bezpečně pracovat přes svoje reference, musí jeho pravidla dodržet i připojený kód v C++.

V roce 2023 se proto projekt v první fázi rozhodl podporovat samostatné knihovny třetích stran, které se z C++ volají přes jasně vymezené rozhraní. Takovou knihovnu lze připojit s menším zásahem než předělávat vztahy mezi objekty napříč prohlížečem. Vyměnit jazyk by tu znamenalo změnit i způsob, jakým je program postavený.

Rust už přebírá část práce

Chyby při práci s pamětí ovšem zůstávají v C++ drahé. Ukazatel může přežít objekt, na který odkazuje, a zápis mimo platný rozsah může poškodit paměť. RAII a chytré ukazatele řadu rizik omezují, celý jazyk ale paměťovou bezpečnost nezaručuje.

Rust používá systém vlastnictví, který hlídá, kdo data vlastní a kdo k nim smí přistupovat přes odkaz. Tato pravidla kontroluje už při překladu a nepotřebuje k tomu povinný garbage collector. Autoři bloků unsafe a vazeb na cizí kód musí jejich bezpečnost zajistit sami. Pro nový kód, který zpracovává nedůvěryhodná data, je taková pomoc překladače velmi dobrý důvod začít jinde než u C++.

Google v listopadu 2025 odhadl u Androidu počet paměťových zranitelností na milion řádků Rustu na méně než tisícinu historicky zaznamenané hodnoty pro C a C++. Ve stejném textu popsal také výměnu parserů PNG, JSON a webových fontů v Chromiu za implementace v Rustu. Ten už tedy dostává práci uvnitř existujícího prohlížeče, bez čekání na jeho kompletní přestavbu.

Strategie Googlu pro Android se zachováním existujícího kódu a bezpečným propojením jazyků přímo počítá. Podobné soužití může trvat dlouho: C++ bude zajišťovat velkou část běhu programu, i když některé nové součásti vzniknou v Rustu. Jeho význam tak může klesat postupně, komponentu po komponentě.

Stroustrup v Bell Labs potřeboval rozumně popsat složitý systém a přitom mít pod kontrolou, co počítač skutečně dělá. Vývojář, který dnes v herním enginu hledá, kam se ztratily milisekundy mezi dvěma snímky, by mu nejspíš rozuměl. C++ za tu dobu výrazně zestárlo a dnes má schopné konkurenty. Potřeba spojit přehledné abstrakce s kontrolou nad strojem však nezmizela.

Komentáře

Odebírat
Upozornit na
guest
0 Komentářů
Nejstarší
Nejnovější Nejvíce hlasů

Tailwind není jediná cesta. Pět přístupů k CSS, které stojí za zvážení

Zeptejte se dnes libovolného juniora, čím bude stylovat nový projekt, a s pravděpodobností hraničící s jistotou uslyšíte „Tailwind“. Zeptejte se jazykového modelu a dostanete Tailwind dokonce i tehdy, když jste o něm nic neřekli. Utility-first přístup se za posledních pět let stal tichým defaultem celého frontendu, a to natolik, že volba stylovacího nástroje přestala být rozhodnutím a stala se rituálem.

Tabulky proti trhu: proč státní správa prohrává boj o zkušené softwarové inženýry

Český statistický úřad uvádí pro vývojáře softwaru v roce 2025 medián mzdy více než 101 tisíc korun, v platové činil necelých 56 tisíc korun. Problém je, že o stejné lidi soutěží s firmami, které vedle peněz nabízejí moderní vybavení, možnost kombinovat práci z domova a z kanceláře a někdy také daňově výhodnější spolupráci na IČO.