Pokud je někdo schopný v C++ napsat a dlouhodobě udržovat shell, který funguje a má slušnou uživatelskou základnu, tak se asi nedá říct, že by neuměl C++. No a tihle lidé se rozhodli, že C++ zahodí a přejdou na Rust, i když je to stálo spoustu času a úsilí navíc (museli se naučit Rust a přepsat existující C++ kód).
Důvody, proč to udělali a jak to udělali, vysvětlují v jejich blogu. Mimo všechno ostatního bych z toho vypíchnul jednu věc, kterou také zmiňují. Rust zaručuje, že v programu nebudou žádné data races (žádné současné čtení a zápisy proměnné z více threadu), což je game changer pro vývoj multi-thread aplikací a C++ ani spousta jiných jazyků tohle nikdy nenabídne.
S výsledkem jsou podle všeho spokojeni a stále je to podle nich krok dobrým směrem.
Hlavný problém starého kódu v C++ nie je ani tak to, že prepísať ho do novšej verzie je komplikované, ale to, že je ho strašne veľa, takže celkovo, teda od základu, ho nikto prepisovať nebude, či už do novšieho C++ alebo do Rustu. Myslím masovo, nie ojedinelé projekty riadené nadšencami.
Už teraz je ale celkom schodná cesta asistovanej modernizácie kódu v C++, postupne, po kúskoch. Kto také kvantá kódu má, má aj nástroje, založené napríklad na knižniciach clangu a aktívne ich na modernizáciu kódu používa. A nie nejako tajne, že by o tom nikto nevedel, je to známe a publikuje sa o tom.
Ale inak, čo sa týka budúcnosti, tak tú si momentálne možno ani nedokážeme predstaviť. Zvlášť s použitím umelej inteligencie, keď už aj to, čo sa za umelú inteligenciu iba označuje, a pritom to ňou vraj nie je, môže byť pri správnom používaní mimoriadne užitočné.
Každých 10 let je C++ natolik jiné, resp. doporučené postupy, že už je to jedno. Navíc dopředu víme, že C++ ještě nemá svoje problémy vyřešené (Safe C++, budoucí požadavky vlády USA, ...), tj. za 10 let bych to přepisoval znovu.
Každých 10 let je C++ natolik jiné, resp. doporučené postupy
Tak na jednej strane členovia skupiny kazateľov Rustu vysvetľujú že C++ sa nemôže zmeniť, lebo má spätnú kompatibilitu a na druhej strane argumentujú tým, že je každých 10 rokov je C++ veľmi odlišné. Nechcete si vybrať?
za 10 let bych to přepisoval znovu
Z akého dôvodu by ste zas niečo prepisovali keď by ste to už mali prepísané do bezpečnejšej verzie?
Ja som ale hlavne písal skôr o tých, ktorí majú ten kód, nie o vás konkrétne. A to sú znodou okolností tí, ktorí vývoj C++ riadia tým, že protestujú proti zmenám a majú dostatočný vplyv na to, aby to mohli robiť.
A myslíte, že je pre nich jednoduchšie ustúpiť spoločenskej požiadavke, umožniť kontrolovanú stratu spätnej kompatibility a nejaké časti kódu kvôli tejto zmene prepísať do modernejšieho a bezpečnejšieho C++ alebo jednoducho kód, ktorý majú, zahodiť a prepísať do úplne iného jazyka?
> Tak na jednej strane členovia skupiny kazateľov Rustu vysvetľujú že C++ sa nemôže zmeniť, lebo má spätnú kompatibilitu a na druhej strane argumentujú tým, že je každých 10 rokov je C++ veľmi odlišné. Nechcete si vybrať?
To si neodporuje. Díky zpětné kompatibilitě funguje i starý kód a nové věci jsou formou doporučení, co je nově správně.
> Z akého dôvodu by ste zas niečo prepisovali keď by ste to už mali prepísané do bezpečnejšej verzie?
Bezpečnejší != bezpečná.
> A myslíte, že je pre nich jednoduchšie ustúpiť spoločenskej požiadavke, umožniť kontrolovanú stratu spätnej kompatibility a nejaké časti kódu kvôli tejto zmene prepísať do modernejšieho a bezpečnejšieho C++ alebo jednoducho kód, ktorý majú, zahodiť a prepísať do úplne iného jazyka?
Oni neustoupí, tím pádem se z C++ stane legacy jazyk a nové věci se budou psát v něčem jiném.
To si neodporuje.
V tom kontexte, v ktorom je to používané si to odporuje. Keď niečo napíšete správnym spôsobom, tak vám spätná kompatibilita zaručuje, že to pri lepšom spôsobe zápisu nebudete musieť prepisovať, bude to fungovať stále dobre, takže nie je dôvod sťažovať sa na to, že existujú alebo že budú existovať novšie odporúčania.
A ak platí to, čo niekto písal vyššie, možno aj vy sám, že vedľa seba môže existovať kód písaný v rôznych jazykoch, tak platí aj to, že vedľa seba môže existovať aj kód písaný v jednom jazyku odporúčanými spôsobmi z viacerých etáp.
Bezpečnejší != bezpečná.
To nemôžete vedieť. Bezpečnejší ako teraz môže byť bezpečný.
Oni neustoupí, tím pádem se z C++ stane legacy jazyk a nové věci se budou psát v něčem jiném.
Aha, vy si naozaj myslíte, že to viete, netušil som, že máte dar pohľadu do budúcnosti.
V tom kontexte, v ktorom je to používané si to odporuje. Keď niečo napíšete správnym spôsobom, tak vám spätná kompatibilita zaručuje, že to pri lepšom spôsobe zápisu nebudete musieť prepisovať, bude to fungovať stále dobre...
A jakmile se změní "správným způsobem" (C++98 vs. C++11 vs. C++20/26), tak to sice bude fungoval, ale už to nebude napsané správně. Nebo to bude mix starého a nového způsobu (třeba auto_ptr vs unique_ptr?) a zdrojem chyb z nedorozumění.
tak to sice bude fungoval, ale už to nebude napsané správně
Nie, bude to napísané stále správe. Iba s ohľadom na dobu, v ktorej to bolo písané. Pokiaľ v medzičase nebolo odhalené, že tam boli nejaké nedostatky, čo sa môže stať aj v iných jazykoch. Nikto vám ale nebráni, aby ste ten kód modernizovali. Ak to dokážete dostatočne zdôvodniť.
Ale o čo vám vlastne ide? V porovnaní s tým, že alternatívne riešenie, to, na ktoré som reagoval je prepísanie častí kódu do úplne iného jazyka. Ani ten alternatívny spôsob predsa tiež nemáte jednotný, keď je časť kódu v úplne inom jazyku.
...a zdrojem chyb z nedorozumění
Aké nedorozumenia? To je vec riadenia projektu. Akonáhne je jedna technika považovaná za prekonanú, na jej odhalenie v novom kóde často stačí obyčajný grep.
A okrem toho existujú nástroje, ktoré dokážu kód automaticky modernizovať, prípadne sa dajú s použitím knižníc clangu napísať buď ako samostatné alebo pre clang-tidy. Myslíte, že to tí, ktorí majú veľké objemy kódu nerobia?
a C++ ani spousta jiných jazyků tohle nikdy nenabídne
V tejto chvíli môžeme zodpovedne povedať iba to, že predpovedanie je zložité, zvlášť keď sa predpovedá budúcnosť.
C++ ako také je živý systém a v komunite je to, že je potrebné zlepšiť jeho aspekty v oblasti bezpečnosti veľmi aktuálna téma. Na každej konferencii je na túto tému niekoľko prednášok a aj v rámci pracovnej skupiny pri ISO, ktorá sa C++ venuje, je skupina, ktorá rieši zlepšenie bezpečnosti.
Okrem toho je známe, že zhruba 20% programátorov v C++ používa aj Rust, takže majú možnosť porovnania.
Rovnako je známe to, že objem existujúceho kódu v C++ je výrazne, ale naozaj výrazne, väčší ako objem kódu v Ruste. Neviem, či si niekto myslí, že niekto má peniaze a ľudí na to, aby sa všetok ten existujúci kód prepisoval do Rustu, ale ja osobne si myslím, že nie. To, že to niekto skúsil a dokázal je pozoruhodné, ale podľa mňa je to skôr výnimka ako pravidlo.
Navyše platí to, že jazyky konvergujú a aj do C++ prichádzajú veci ako funkcionálne programovanie, veľmi detailne špecifikovateľné korutiny ako súčasť jazyka, štrukturovaná konkurentnosť alebo (statické) reflexie, ktoré prinášajú nové spôsoby písania kódu nahradzujúce pôvodné spôsoby a zároveň umožňujú o kóde rozmýšľať na inej úrovni.
Takže ja osobne si myslím, že "nabídne", aj keď možno nezaručí, lebo, s ohľadom na spätnú kompatibilitu, nebezpečné konštrukcie alebo používanie nikto z jazyka odstraňovať nebude, takže kód napísaný starým spôsobom bude vždy možné napísať, čo ale nemusí byť až taký veľký problém, lebo ich používanie je možné zistiť statickou analýzou kódu, a výhľadovo by takého kódu malo byť stále menej a menej, takže aj odhaľovanie jeho problémov by mohlo byť v tom menšom objeme jednoduchšie.
Mne osobne je úplne jedno kto v čom píše kód, rovnako ako mi je jedno v čom píšem kód ja sám, jednoducho píšem v tom, v čom je API technológie, ktorej sa chcem venovať a to API je posledných 30 rokov v C++ a nemyslím, že sa to skôr ako o 10 rokov zmení, pokiaľ sa to, s ohľadom na prichádzajúce verzie C++, vôbec niekedy zmení.
Starý kód se časem přepíše tak jako tak, nebo umře. To je normální proces, i kdyby se přepisoval do stejného jazyka jako předtím. Problém C++ je, že kdyby vznikly nové features řešící to, proč vznikl Rust, tak ten kód stejně musíš výrazně upravit, nestačí "pošolíchat". A jak píšeš, dost C++ programátorů ten Rust už teď umí, takže přechod není problém. Osobně bych řekl, že userbase Rustu je převážně lidi od C++. Určitě ne např. od C, Objective-C, Pascalu, Javy, C#, Pythonu, Javacriptu, Fortranu apod.
30. 12. 2024, 17:46 editováno autorem komentáře
No, jestli to někdy standardizační komise schválí..
Ten překladač pro C++ je už dnes tak strašně složitý, že vývojáři mají co dělat, aby dodrželi všechny nuance toho, jak ten kód má chovat. Nemluvě o tom, že to roubování nových chování vyžaduje dost krkolomnou syntaxi.
Pamatuju třeba odpověd Uliho Dreppera na bug report v g++: "Tohle Vám někdy fungovalo? Tak to se omlouvám, už se to nestane." (šlo o nedefinované chování dle standardu, které gcc začalo hlídat)
Tam jde totiž hlavně o přístup. C++ historicky povoluje věci, které jsou sporné a mohou být problematické, vývojář ručí za to co dělá. Rust v takové chvíli naopak hlásí problém, ani unsafe nedovolí obejít všechno.
Chytřejší nástroje vznikají pro oba jazyky (pedantic clippy je až moc přísné i na Rust).
Starý kód sa prepíše, keď sú na to peniaze a tie zvyčajne nie sú. Takže je celkom možné, že to, čo sa zdá, že funguje sa neprepíše vôbec, alebo sa prepíšu iba kritické časti. A nie je jednoduchšie mať kód v jednom jazyku ako v dvoch?
To že 20% programátorov v C++ pozná Rust, nemusí nutne znamenať, že Rust preferujú alebo že v ňom programujú primárne v rámci dennodennej práce a že C++ opúšťajú. To by asi znamenalo značný úbytok programátorov v C++ a napriek tomu, že som sa tu stretol s názorom, že výsledky prieskumov sú nerelevantné, ukazuje sa skôr sústavný rast C++. To by tie výsledky museli byť asi naozaj veľmi nerelevantné, aby pri skutočnom dramatickom poklese ukazovali sústavný rast.
No vzhľadom na to, že nie je pozorovateľný úbytok programátorov v C++, tak ten kód sa pravdepodobne neprepisuje do Rustu nijako masívne.
Čo sa toho ostatného týka, tak ja neviem, ale, súdiac podľa rôznych materiálov z oblasti osobného rastu, ľudí asi dosť priťahuje možnosť mať nejaký vplyv, zanechať nejakú stopu, dosiahnuť nejaký výsledok, vedieť, že úsilie nebolo zbytočné, nemusí to byť iba niečo nové, čo sa zdá byť atraktívne.
Ja proti Rustu naozaj nič nemám, ale nenahovárajme si, že to je nástroj, ktorý vyrieši všetky problémy sveta a spasí každého.
Ja som predsa netvrdil, že C++ zomrelo. To predrečník písal, že Rust zabil C++. A zabitie znamená smrť, nie? Inak C++ tu samozrejme ostane ešte dlho. A čo sa týka pomeru "tých nových predávaných", existuje nejaká štatistika, ktorá by tvrdila, že počet nových projektov v Ruste je vyšší ako počet nových projektov v C++? Ja o tom dosť pochybujem, ale je to samozrejme iba môj osobný názor.
Ono to trvá.
Rust umí navíc být taky složitý (lifetimes..), takže je složitější pro něj najít programátory. Najít někoho, kdo umí základní C a nařídit mu jen MISRA podmnožinu jazyka je snazší a levnější. Obzvláště, pokud už ten projekt nějakou dobu (dekádu..) běží.
C++ s objevením a rozvojem Rustu ztrácí hodně výhod "monopolu".
Býval to jediný rozumný jazyk s dobrými abstrakcemi pro nízkoúrovňové programování. A teď má konkurenci (sice ne jedinou, ale Nim se asi mainstreamem nestane).
C/C++ bylo jediné rozumně certifikované prostredí pro automotive. Rust už je taky (minimálně překladač).
C++ se STL navíc mívalo naprosto příšerné chybové hlášky (ty rozvoje šablon zabraly celé obrazovky.. ano a vím, že existuje preprocesor). Rust chybu ukáže a rovnou vysvětlí co je špatně a jak to opravit (pokud to jde poznat).
Takže já si prošel tím samým. C++11 jsem považoval za dobrý vývoj jazyka, oproti starším revizím to začalo být i hezké. A po pár letech jsem celý projekt přepsal do Rustu. A zpátky mě nikdo nedostane. Ten kód je prostě mnohem čitelnější.
No ja viem, že veci sa nestávajú hneď. A preto som napísal, že uvidíme o niekoľko rokov. Ale koľko rokov už čakáme? 10? Tak si ešte počkajme a predebatujeme stav, ktorý bude aktuálny v tej dobe.
C++ ale rozhodne nespí, naopak, rozvíja sa a motivácia je naozaj veľká.
Napríklad tie vaše chybové hlásenia STL, to je predsa historická záležitosť z doby, keď ešte nejaký Rust vôbec neexistoval. STL priniesla na svoju dobu revolučný spôsob oddelenia spracovania od dát. A to stále s typovou kontrolou.
Bavme sa o súčasných veciach. Chybové hlásenia značne vylepšujú koncepty a v C++26 má byť niečo ako možnosť chybové hlásenia do istej miery definovať kódom.
Zároveň ale nikomu neberiem to, že sa mu v inom jazyku píše kód lepšie. To je absolútne v poriadku.
Ale napriek všetkému, prehlásenia v zmysle, že je C++ mŕtve naozaj nie sú ani náhodou na mieste.
No jestli se dívám správně, tak koncepty jsou až v C++20?
https://en.cppreference.com/w/cpp/language/constraints
Navíc to vyžaduje kód navíc (někdo ty koncepty do těch knihoven musí napsat). Takže to je něco, co mě už nepotkalo no.
Vypadá to jako where v Rustu: https://doc.rust-lang.org/std/keyword.where.html (standardizováno 2014)
Je to určitě krok správným směrem, ty jazyky se vyvíjí všechny.
A protože musím občas řešit více věcí ve více jazycích, tak každou malou divnost ve standardu neznám. Jako třeba ten nullptr po move unique_ptr. Proto jsem rád, že mě překladač upozorní, méně často se střelím do nohy.
Proto pokud můžu použít Rust, tak dnes opravdu preferuji ten.
"Býval to jediný rozumný jazyk s dobrými abstrakcemi pro nízkoúrovňové programování. A teď má konkurenci (sice ne jedinou, ale Nim se asi mainstreamem nestane)."
Existuje ještě Zig. Ale ten mě neoslovil (možná jsem mu nevěnoval dostatečnou pozornost) svou filozofií. Přišlo mi, že je příliš benevolentní a nesympaticky spoléhá na programátora.
Mimochodom, kto používa v automotive Rust v produkcii? Čo som v rámci (asi neobmedzeného) prístupu do intranetov niekoľkých OEM mal možnosť vidieť, tak to bolo asi tak, že tam bol nadšenecký príspevok, potom niekoľko ďalších, blog alebo rozhovor, potom pauza, že sa čaká na chýbajúci tooling, rok pauza, chýbajúci tooling, pauza, atď... Posledný asi rok ma to už moc nezaujímalo, možno sa to zmenilo, ale neviem. Inzeráty, že by OEM z automotive hľadali programátorov Rustu som ale naozaj nevidel. Videl som ale inzeráty, ktoré hľadali programátorov C++. Alebo im ponúkali preškolenie z iných jazykov. Či už interné alebo externé.
Tooling už je - https://ferrocene.dev/en/
V produkci ještě asi nikdo, protože ta setrvačnost je velká. Musíte začínat nový projekt nebo přepisovat něco exisujícího, kde to dává ekonomický smysl. A už jenom najít lidi trvá.
Z tebe mluví láska k C++ (plně respektuji).
Problém C++ je v tom, že aby si v něm mohl napsat dobrý kód, tak ho musíš velmi dobře znát. A i když ho velmi dobře znáš, tak vůbec nemáš žádné záruky, že zrovna v tomto případě jsi neměl blbej den.
V Rustu i když budeš fakt blbej, tak pokud se dostaneš za tu laťku, že se ti povede kód přeložit, tak je to cca funkční. Naopak se musíš aktivně snažit, aby si psal nebezpečně (unsafe a spol). A pokud se budeš vzdělávat, velice rychle se dostaneš nad úroveň těch nejlepších C++ programátorů. A navíc, máš záruky, že tvé blbé dny to odchytilo.
Tohle třeba mě osobně přesvědčilo, proč jsem switchnul. V C++ dřeš jak pes, a stejně nic. V Rustu dřeš o dost méně, a výsledky se kumulují.
Druhá věc co jsem si zamiloval byla syntaxe.
Asi mi nebylo rozumnět. Je to samozřejmě o standardech a postupech. Odborníkem se člověk stává, když zná ty správné postupy a standardy. Když ví, jak se věci mají dělat, ne jak si myslí, že se mají dělat. Spousta programuje v C++ ale neumí ho, stejně tak spousta lidí si umí doma zapojit rozvaděč, ale nejsou to elektrikáři. A pak je to o náhodě. Někomu prostě ta elektřina způsobí požár, a ti ostatní mají pak pocit, že oni jsou ti odborníci. Nikdo z nich není, jen měli štěstí.
Být odborník není o štěstí. Odborník ví, jak se věci mají dělat i v případě, že má blbej den. Nepotřebuje štěstí, potřebuje znalosti.
Vypadá to, že jsme tě pochopili správně.
Mluvíš dobře, ale o něčem jiném.
I odborník dle tvé definice může mít špatný den, a udělat blbost. Ba co víc. Čím více se musí snažit, aby byl "odborníkem", tím méně udělá práce. Proto lékaři i ti nejlepší používají ochranné pomůcky, normované léky, atd. Bariéry nejsou proti hlupákům a neodborníkům. Ale proti blbému dni. A navíc to rozvazuje ruce.
Proč myslíš, že má chirurg k ruce tři specialisty? Si myslíš, že by to nezvládl sám? Když by to byl chirurg v duchu C++, znal by všechny správné postupy a standardy, a byl by na to sám. Já raději Rustího chirurga, který možná zná půlku těch standardů, ale kolega mu ve správný okamžik řekne "počkej, co děláš?!".
A tohle přesně C++ neumí a Rust ano.
Zrovna ty standardizované postupy zachraňují v nemocnicích dost pacientů:
https://amie.so/blog/checklist-manifesto-summary
Podobně u programování je dobré, když vás kompilátor klepne přes prsty, než váš kód pojede na produkci. Vyšší jazyky ten problém řeší po svém, ale chyběl tady jazyk pro lowlevel kód s plnou rychlostí (to vyšší jazyky zvládají díky JIT), ale i s nízkou spotřebou RAM (vyšší jazyky ji mají násobně vyšší kvůli automatické správě paměti, což ne všude chcete).
30. 12. 2024, 17:57 editováno autorem komentáře
To mi připomělo, že z Rustu mám dejavů když si vzpomenu na to jak se na přelomu tisíciletí prosazovala Java a jak se tvrdilo, že brzo nahradí všechny ostatní jazyky, zeména pak C (C++ v té době nebyl takový deal).
Mno, skok o 25 let do budoucnosti a kde máme Javu?
Zato já musím trpět, když čtu kód, který napsal nějaký Céčkař. Čekal jsem aspoň, že ti Céčkaři zmizí.
Na Rustu mi vadí, že je to extenze C. Jazyka, který bych nejradši pohřbil hluboko do hlíny. Některé naprosto tragické programátorské postupy, které bych chtěl eliminovat, se v Rustu naopak ještě podporují.
A opět je mi vnucováno, že jednou bude vše v Rustu
V roce 2050 si řekneme
V okamžiku, kdy jsem uviděl Rustí kód, který dokázal fungovat bez runtime jsem pochopil, že je (pro mě) C++ mrtvá záležitost. Proti Rustu není nic, co by mohl nabídnout.
Samozřejmě C++ nevymře, stejně jako neumřelo Cobol, Java, nebo takový ASM. Ale smrskne se na omezené domény - microchipy, brutální optimalizace (kde se dneska ještě píše v čistém ASM?), a samozřejmě legacy.
Spousta vyšších jazyků, i když se překládají do strojáku, tak si sebou tahají vlastní bázovou knihovnu. Někdy je alespoň staticky linkovaná. Ale značně to omezuje použití dotyčného jazyka. Na aplikace dobré. Ale C a C++ míří na low-level, a tam toto není úplně to sympatické. Je možné psát C programy bez stdio. A když jsem viděl, že i toto Rust dokáže, tak mě to dost zaujalo.
Tak že jsou jazyky které potřebují runtime nelze rozporovat.
Nicméně jak C tak C++ dokáže běžet bez runtime. Samozřejmě že operátor new bude nejspíš potřebovat malloc(), ale i tam mám možnost si napsat vlastní verzi. Protože Rust je extenze C, tak bych se nedivil, že i on nebude potřebovat runtime pro omezené použití. Konečně všechno se překládá do LLVM, to ve výsledku vede na jeden společný bajtkód, který se následně překládá do strojového kódu.
Ten program nebude potřebovat runtime, dokud ho nebude potřebovat váš kód. To je snad jasné.
Programoval jsem AVR i ARM mikrořadiče v C++, bez problému. Určitě by to šlo i v Rustu.
Odborník si umí příznat, že neumí vše a není neomylný.
Znáte "Vím, že nic nevím?", řekl to takový jeden starý filozof. Sókratés se jmenoval.
Ona se chyba navíc může objevit i při pozdějších úpravách. Předělával jste někdy projekt, který jste rok neviděl? A pořád jste si pamatoval všechny vazby a interní detaily, které jste znal, když jste to kdysi dávno psal?
No blbej den můžeš mít i v Javě... jinak obecně mnohem bezpečnější než C++ na mnoha úrovních. V Java je napsán mission critical systém pro mnoho věcí např. https://www.liquid-robotics.com/. Hezká historka, kdy se střelili páni do nohy je při parseInt(), neošetření mezery a nesprávné ošetření výjimky a záhadné pády aplikace. Obecně si nemyslím, že spousta chyb je v paměti, ale v logice (bezpečnostní věci s over/underflow ted dávám stranou). Rust je dobrý, ale když sejdeš na tu nízkou úroveň a začneš se brodit v unsafe, tak ten svět Rustu už pak už nevypadá tak pěkně, dokonce bych řekl i víc nebezpečně, protože v C/C++ jsi připraven na cokoliv. Prý se teď hodně maká na C++ interop.; může to někdo portvrdit? Rustu zdar!
30. 12. 2024, 18:36 editováno autorem komentáře