To zdůvodnění mi přijde jako v polovině 90. let, kdy se přecházelo na JVM/Java. Tím nepopírám, že si jako tvůrci takového programu dali všechny +/- na stůl a rozhodli se správně. Ale je to zajímavé.
Tak ten hlavní důvod je, že to nechtějí psát C++ a pokud lidi, kteří ten vývoj táhnou, to nechtějí psát v C++, tak jsou všechny další argumenty irelevantní :-)
30. 12. 2024, 10:46 editováno autorem komentáře
To je pravda. Je ale zaujímavé, že už majú nejaký produkt, teda aj nejaký kód v C++, a asi nie málo, a je otázka, čo s ním budú ďalej robiť. Či ho prepíšu a či si myslia, že výhody, ktoré im Rust poskytuje kompenzujú čas potrebný na prepísanie a či budú schopní naberať ďalších ľudí lahšie ako keby nezmenili technológiu. A prípadne si ešte počkali si na lepšie C++. Ktoré za poslednú dekádu a niečo prichádza každé 3 roky. Takže sa necháme prekvapiť.
Lepší C++ je něco jako vzít UHO s kuřecím separátem a vylepšit ho lanýži a šafránem. :D
Na přepisu Fishe každopádně bylo zajímavé to, že se povedl postupný přepis, že našli způsob, jak ty dva málo kompatibilní světy spojit tak, aby přechod byl pozvolný a (relativně) hladký.
Nepřišlo mi, že by něco spojovali. Verze 3 byla v C++ a paralelně k ní pracovali na verzi 4 v Rustu. Mě spíš přišlo zajímavé, že se skoro dvacetiletý projekt podařilo přepsat za dva roky.
30. 12. 2024, 14:50 editováno autorem komentáře
Dva roky sú dosť dlhá doba. To je akurát zanalyzovať, zrefaktorovať, upratať, zdokumentovať. Naviac je už hotový prototyp, majú to s čím porovnávať. Najzábavnejšie je zistiť, že s akými bugmi fungoval roky originál a nikomu to nevadilo (alebo sa na to neprišlo).
Jenže ty části přepisovali/nahrazovali postupně, nešli na to tak, že přepíšou všechno na zelené louce.
Vtipné. Ale strašne mimo. Je zvláštne, že napriek takýmto výkrikom počet používateľov C++ stále rastie.
Myslím si, že je oveľa odvážnejšie tvrdiť, že tie prieskumy nemajú žiadnu vypovedaciu hodnotu. Takže ja svoje tvrdenie pokojne zopakujem.
Okrem toho, nikde som netvrdil, že C++ rastie nejako rapídne. Na druhej strane ale, čo sa rapídneho rastu týka, tak z nuly sa rastie rýchlo. To sa možno ekonómovia učia dokonca už v prvej triede.
Ale o tom sa vôbec baviť nemusíme, môžeme to pokojne ignorovať. Z mojej strany to bola poznámka k vtípku vášho predrečníka, ktorý popieral to, že C++ sa zlepšuje.
Takže pokiaľ nemáte nejaký relevantný podklad k tvrdeniu, že sa C++ nezlepšuje, tak to musím považovať iba za anonymný výkrik do tmy a môžeme túto debatu ukončiť.
Nerostou všechny obecně používané jazyky? Je to stejné, jako že roste počet uživatelů Linuxu, i když procento je furt podobné.
Pardón, ale rast alebo nerast už nie je aktuálna téma. Už sme sa vrátili o krok späť k podstate veci. A tou bolo to, či je novšie C++ lepšie alebo nie je. Pokiaľ nie je, tak prosím objektívne fakty. Inak tá debata nemá zmysel.
Která verze C++ mi poskytne záruky, že pokud udělám něco podle příručky, tak že mi ohlídá, zda jsem něco nepřehlédl? Ne nutně všude samozřejmě, to nejde. Ale třeba alespoň paměť, RC, ... ?
Jsem ochoten se dohadovat s kompilátorem. Nejsem ochoten (už) používat kompilátor, který je schopen zjistit, že kompiluje blbost a neřekne mi to.
Ee?
Otázka zněla: "A tou bolo to, či je novšie C++ lepšie alebo nie je."
Odpověď zní: Není, protože neposkytuje záruky. Je to "objektívne fakty." ?
Pokud ne, tak skutečně "Inak tá debata nemá zmysel.".
Aha, ja ale nemôžem za to, že čítate diskusiu od stredu. Ja som sa do nej zapojil zamyslením o dôvodoch prečo sa autori projektu rozhodli prepísať kód a lepšie C++ som spomenul s ohľadom na budúcnosť, so znalosťou toho, že v rámci komunity sú snahy urobiť C++ bezpečnejším, čo som zjednodušene nazval lepšie C++, a spomenul som, že za poslednú dekádu prichádza lepšie C++ každé 3 roky, čo je podľa mňa objektívna pravda a nemyslel som tým práve iba oblasť bezpečnosti, ale celú škálu nových vecí, ktoré od C++11 prišli.
V súvislosti s tým som potom reagoval na vtípek, ktorý zlepšenie C++ spochybňuje, vzhľadom na to, že sa v tom vtípku nikde nepísalo o bezpečnosti predpokladám, že bol mienený všeobecne a v tom smere bola aj moja reakcia. Na ktorú ste potom reagovali vy. A pokiaľ ste si to vyhodnotili, že sa to týkalo konkrétne aktuálnej verzie a konktérne bezpečnosti, tak to naozaj nemôžem nijako ovplyvniť.
Inak by ma zaujímalo čo konkrétne myslíte, nech sa netočíme dookola, ale ešte predtým ako sa do toho prípadne pustíme, tak áno, nie všetky veci sa podarili, áno, v aktuálnej verzii aj v nových veciach sú niektoré veci, ktoré sa správajú prekvapujúco, ale je to známe, a veci, čo sa budú dať opraviť budú opravené a veci, ktoré nebudú opravené, nebudú opravené s ohľadom na spätnú kompatibilitu, čo nie je nejaký výmysel tých, čo vývoj C++ riadia, ale požiadavka od jeho používateľov, prinajmenšom tých, ktorí majú nejaký vplyv, teda tých, ktorí majú tie kvantá kódu, ktorý nebude nikto prepisovať, o čom píšem niekde nižšie alebo vyššie, pretože logicky, keby ho chcel niekto prepisovať, nebránil by sa zmene jazyka s odstránením spätnej kompatibility, ktorá by vyžadovala čiastočné prepísanie.
Takže celá situácia je naozaj oveľa komplexnejšia ako jeden aspekt, ktorý momentálne zaujíma vás.
Třeba borrow checker máme i v C++, jmenuje se unique_ptr. Ale není to tak cool a 90% programátorů (z množiny, které jsem za svůj život poznal) o něm buď neví, nebo ho schválně nepoužívají.
Třeba borrow checker máme i v C++, jmenuje se unique_ptr.
Promiň, ale víš vůbec, co dělá borrow checker? Mám podezření, že ne, protože bys jinak nemohl napsat takový nesmysl. Jak mi pomůže unique_ptr s tímto?
int main() { auto a = std::make_unique<int>(0); auto b = std::move(a); // USE AFTER MOVE!!! std::cout << *a; return 0; }
Rust takovou chybu chytí při překladu a tohle je smysl borrow checkeru, unique_ptr rozhodně borrow checker není.
Akorát to není use after move, je to null pointer access. Proč se tady bavím s lidma, kteří tomu nerozumí?
Jediná výhoda v Rustu je, že vám to řekne překladač. Mezitím překladače pro C++ se samozřejmě dále vylepšují na úrovni statické analýzy a vsadím se, že už někde je, nebo bude překladač co na to minimálně upozorní.
Akorát to není use after move, je to null pointer access. Proč se tady bavím s lidma, kteří tomu nerozumí?
Tak to jsi na velkém omylu. Tvářiš se jako velký znalec C++, ale nevypadá to. Není to null pointer access (to je až side effect use after move). Objekt po move stále existuje a je ve validním stavu. C++ standard to jasně říká:
Objects of types defined in the C++ standard library may be moved from (12.8). Move operations may be explicitly specified or implicitly generated. Unless otherwise specified, such moved-from objects shall be placed in a valid but unspecified state.
Takže je to volání operátoru dereference na moved objektu (to je ten bug), nikoliv null pointer acccess, to je až implementační detail. Primární problém je v přístupu k objektu po move.
Říkám, že tomu nerozumíte. A nemusíte se do toho nořit hloubš a hloubš.
To jak funguje move je implementační detail. Dereference moved objektu není bug, to je feature. Proto to není use after move, protože to není žádná chyba.
Běžně používám objekty opakovaně po move. třeba
std::vector<char> buffer;
while (true) {
fill_buffer (buffer);
dispatch_buffer(std::move(buffer));
}
Protože move v tomto případě přesouvá obsah, ne samotnou proměnnou.
Ale o tom to vůbec nebylo. unique_ptr neumožňuje use after move, protože dávno neukazuje na přesunutý objekt. Bavíme se přece o objektu na který ukazuje,ne o pointeru. To že unique_ptr je nějak implementovaný je implementační detail. V základě umožňuje to co borrow checker. V danou chvili vždy někdo drží vlastnictví - a funguje to napříč kompilačními moduly a i mezi ABI
Překladače samozřejmě mohou upozornit na dereferenci po přesunu, protože se do objektu přiřazuje null, který se pak dereferencuje. Pokud překladač během optimalizace tohle vidí, může upozornit, že tam taková věc je. (to jestli kód pustí nebo nepustí dál záleží jestli to udělám error nebo warning)
Dereference moved objektu není bug, to je feature. Proto to není use after move, protože to není žádná chyba.
Možná bys autorům clang-tidy měl vysvětlit, že use after move není žádná chyba, takže to hlídají úplně zbytečně.
C++ standard jasně říká, že objekt je po move ve validním, ale NESPECIFIKOVANÉM stavu, takže dělat na moved objektu cokoliv jiného než volání destruktoru, je hraní si s ohněm. Ono to může fungovat, ale spíš kvůli tomu, že se jedná o konkréttní implementační detail (náhodou je to implementovné tak, že něco po move funguje a v nové verzi objektu už to nemusí platit).
Tady bych jen vypíchnul, že move semantika byla do C++ přidána teprve nedávno a nikdo pořádně neví (včetně tebe), jak to funguje a jaké to dává nebo nedává garance.
V Rustu move funguje out of the box, programátor se o to nemusí vůbec starat (žádné psaní move konstruktorů), protože move je v Rustu interně implementované jako memcpy. Move v Rustu řeší překladač, takže v tom nejde udělat chyba a je to vždy správně, narozdíl od C++, kde se o move musím ručně starat. Dobrý příklad toho, jak je Rust oproti C++ v bezpečnosti i ergonomii o světelné roky napřed.
Ja sa teda pripojím... Nemohlo sa stať, že si mýlite use after move u všeobecného objektu štandardnej knižnice a u špecifického objektu, ktorý sa volá unique_ptr? Alebo že nechápete čo tie jednotlivé stavy znamenajú?
To druhé sa týka toho, že primárny problém nie je v prístupe k objektu po presunutí všeobecne. Objekt je vo platnom, ale nešpecifikovanom stave. To znamená, že k objektu sa dá po presunutí pristupovať, ale iba niektoré operácie sú podporované, napríklad opätovné priradenie alebo deštrukcia, zatiaľ čo iné operácie v tom stave podporované nie sú.
To prvé sa týka toho, že, to, čo citujete sa týka objektov štandardnej knižnice, ale iba tých, ktoré nemajú bližšie špecifikované správanie. unique_ptr ale správanie bližšie špecifikované má v inej časti štandardu a v jeho špecifikácii je, že ukazovateľ spravovaný jedinečným ukazovateľom je nastavený na nullptr.
Toto priradenie nie je činnosť, ktorá by prebiehala z vlastnej iniciatívy poskytovateľov prekladačov v zóne nedefinovaného správania, čo ani všeobecne neznamená, že sa tam nič nedeje, ale je to predpísané špecifikáciou.
to linuxák:
Sakra nemáte pravdu. Nevím kde jste četl že po move objekt je v nespecifikovaném stavu.
Move operace by neměla objekt strkat do žádného nespecifikovaného stavu. Ten stav musí být jasně specifikovaný, jako všechno v C++. Navíc po move je objekt stále validní. To co na něm lze nebo nelze dělat za operace je čistě rozhodnutí designera objektu. To je rozdíl od Rustu, kde move znamená, že mám smůlu.
Ano v Rustu je move víc move než v C++. To je určité řešení problému co s věcí, která se přesunula. Jeden to řeší tím, že řekne, že se přesunul stav. Druhý to řeší tím, že ta věc, na původním místě přestala úplně existovat.
I v clang-tidy mohou být chyby. Nebo je to porušení na úrovni abstrakce, - pokud vím, Rustaři moc abstrakci neberou, takže mne jen překvapuje, že jste to vytáhl
Nemáte pravdu ani v tom, že move byl přidán nedávno
C++ move semantics a rvalue reference byla přidána v C++11, to je rok 2011. Ale existovala už v C++0x. Ta nula před x znamená, že jsme před rokem 2010. Přitom šlo jen o řešení palčivého problému s auto_ptr, který bez rvalue reference fungoval špatně a mnozí radili se mu vyhnout
Rust vznikl kolem roku 2010 a oficiálně byl vydán až v 2011. Dalo by se říct, že možná v té době někdo řešil stejné problemy v C++ a rozhodl se jít cestou nového jazyka.
Mimochodem, tento rok se to opakuje, zase vznikají nové jazyky protože kolem C++ panuje pomalejší vývoj. Ale já si nejsem jist, že kdykoliv se objeví nějaký trendující problém , že hned se musí začínat vynálezem kola
30. 12. 2024, 21:10 editováno autorem komentáře
Myslím, že to nedorozumenie spočíva v tom, vy píšete o objektoch všeobecne, teda hlavne tých, ktoré píšete vy sám, linuxák o objektoch štandardnej knižnice všeobecne, teda tých, ktoré píšu poskytovatelia prekladačov na základe normy, ale iba o tých, ktoré nemajú ďalšiu špecifikáciu, pričom ale unique_ptr a ostatné ukazovatele medzi tieto všeobecné objekty nepatria, lebo majú ešte dodatočnú špecifikáciu v inej časti normy.
Move operace by neměla objekt strkat do žádného nespecifikovaného stavu. Ten stav musí být jasně specifikovaný, jako všechno v C++.
Ne, ne ne. Je vidět, že C++ opravdu nerozumíš. Takže nějaké konkrétní příklady.
std::string má v C++ optimalizaci, kdy krátké stringy ukládá přímo do objektu a dlouhé stingy alokuje na heapu. Pokud udělám std::move na krátkém stringu, kde jsou data uložená v objektu, udělá to reálně copy a ne move. Pokud udělám std::move na dlouhém stringu, kde je to skutečně uložené na heapu, musí to interně přehodit pointery na heap. Standard nic neříká o tom, jestli musí být původní string po move prázdný, v prvním případě to klidně může nechat původní string v objektu a není to nic proti ničemu. Proto je ve standardu napsané, že je objekt v nespecifikovaném stavu, a to je také ten důvod, proč to clang-tidy hlídá.
Stejnou optimalizaci by mohl mít i std::vector (reálně nemá, ale nic tomu nebrání). C++ standard nezaručuje, že bude std::vector po move prázdný. Většina implementací se tak chová, ale obecně to neplatí, std::vector nemá ve standardu definovaný moved from state. Takže pokud tvůj kód, který jsi poslal, závisí na tom, že je vector po move prázdný, zahráváš si s ohněm, není to zaručené: https://stackoverflow.com/questions/17730689/is-a-moved-from-vector-always-empty
Linuxak opět nemáte pravdu ale ja nemam už naladu vám to vysvětlovat. Hele radši si to nastudujte sám
Linuxak opět nemáte pravdu ale ja nemam už naladu vám to vysvětlovat. Hele radši si to nastudujte sám
Věcné argumenty došly, tak radši jen plácneš něco do větru?
Takže znovu. V C++ je objekt po move v NESPECIFIKOVANÉM stavu. Ten kód, který jsi poslal a používá std::vector po move a pravděpodobně předpokládá, že je vector po move prázný, je chybný. Spoléhá se na něco, co standard nezaručuje. std::vector nemá v C++ standardu specifikovaný moved from state. Proto také clang-tidy takové věci kontroluje, autoři clang-tidy vědí, proč to dělají a dává to velmi dobrý smysl.
Mimochodem kdybys používal Rust, tak nenapíšeš stejně chybný kód jako ten tvůj v C++, který používá std::vector po move, protože Rust překladač tuto chybu chytí. Takže Rust by byl přínosný i pro tebe, máš praktickou ukázku chyby, kterou jsi udělal a Rust by ji narozdíl od C++ chytil při překladu.
Tady se pro změnu ozvu já:
"Jediná výhoda v Rustu je" -- tohle je tak strašné a až děsivé nepochopení, že mě to od profesionálního a zřejmě zkušeného programátora opravdu překvapuje.
Zásadní rozdíl je v tom, že sebelepší C++ překladač tě na to možná upozorní.
Zatímco Rust tě nepustí dál.
C++ versus Rust jdou ideově proti sobě. C++ vychází z rozbitého kódu, který programátor svým umem opravuje. Rust vychází z funkčního (jak to jen matematika dovoluje) kódu, kde se programátor svým umem snaží protlačit featury.
Až toto pochopíš tak pochopíš, jak zbytečné jsou tvé příspěvky.
Jen se snažím ukázat, že božské featury Rustu nejsou až tak božské v jiném jazyce. Protože to co tady prezentujete je víra. Prostě to na čem Rust staví své jméno a prezentuje jako výhodu je v jiném jazyce normální nástroj, který akorát spousta lidí nechce používat. Vždycky je v tom nakonec nějaká víra (ti lidé co to nechtějí používat se na to dívají jako na nástroj ďábla).
Já jsem ateista.
A to jestli něco překladač pustí nebo ne je forma zlepšování uživatelského zážitku. Ani to není důvod učit se nový jazyk. Já bych samozřejmě chtěl, aby se na úrovni překladačů provedlo spousta vylepšení v úrovni statické analýzy kódu, aby mi třeba překladač vyhodil všechna místa, kde hrozí UB (je na mne, abych si je ošetřil nebo ne). Nic z toho není důvod tvořit nový jazyk od nuly, jen proto, že v jiném jazyce chybí nějaká featura.
Warningy se dají považovat za chyby, je na to switch
Ta "božská feature" je právě ta filozofie. Když podobné chování v C++ musím vynutit, tak na to někde zapomenu, a zapnout to globálně mi znefunkční dřívější kód.
std::unique_ptr z C++ odpovídá Box v Rustu. A shared_ptr je něco jako Rc (nebo podobné Arc).
Move operace obecně s tím nemá co dělat, ta jen umožňuje hlídat co se děje se zdrojem.
Už ten Váš příklad s nullptr je totiž ukázkou problému. To jestli se po move nastaví zdroj na nullptr je zcela zastíněno faktem, že v C++ je možné potom udělat dereferenci nullptr ve zkompilovaném programu, což způsobí pád během runtime! Rust to nedovolí na úrovni překladače. Takže ani přehlédnutí nějakého obskurního chování dle standardu nezpůsobí pád aplikace.
Samozřejmě, že ve výsledku jde jen o překlad nějaké syntaxe a ty kontroly se dají dělat různě. C++ si s sebou ovšem táhne tolik balastu a kompatibility se starým kódem, že tohle nemůže změnit.
Přiznám se, že jsem se nevyjádřil úplně nejlíp. Ten božský rozdíl je v tom, že v C++ se musíš snažit, abys nepustil chybu (a stejně nebudete mít jistotu). V Rustu se musíš snažit, abys tu chybu vytvořil.
Když pustím nad Rustem nějaký tool, tak mi řekne, kolik unsafe sekcí (panic, etc) tam je a kde, a podle toho mohu hodnotit v jakém stavu ten kód je, a nějak odhadnout rizika. Vlastně se dostanete na úroveň kódu těch nejlepších programátorů.
V C++ se mohu orientovat jen podle toho, jak zkušené programátory mám. Což je zoufale málo. Ano, dobré nástroje mi najdou některé chyby. Což je, opět, zoufale málo.
Sám si říkal, že naučit programátory dobře C++ je nereálné. A vzhledem k tomu, že sám o sobě tvrdíš, že neuděláš v kódu chybu, tak mě tato životní strategie vlastně nezajímá. Proč plejtvat potenciálem na to, aby programátoři nedělali chyby, když se můžou soustředit na featury?
C++ nemá to co má Rust - bezpečnost by default.
C++ nemá to co má Rust - čitelnější a jednodužší syntax.
C++ nemá to co má Rust - záruky.
(vono toho C++ nemá víc, ale nebudu dál provokovat)
Ještě donedávna měl C++ niku v aplikacích náročných na paměť a výkon. Nikdo soudný by nepsal herní engine v Javě nebo dokonce v Smaltalku. S příchodem Rustu se to změnilo.
Prostě je konec.
Smiř se s tím.
Ano, můžeš věřit, že C++ je lepší. Ale nakonec je to jedno, protože stále budeš mít práci. Legacy projektů v C++ je mraky. Takže o nic nejde. Pokud Rust nechápeš a neumíš ocenit, nic ti nehrozí.
"C++ nemá to co má Rust - bezpečnost by default.
C++ nemá to co má Rust - čitelnější a jednodužší syntax.
C++ nemá to co má Rust - záruky."
Tak v čem jsou napsány systémové knihovny, které Rust v runtime používá?
Jsou bezpečné by default? Celek je tak bezpečný jako jeho nejméně bezpečná část.
C++ má legacy kouli na noze, to je pravda. Pro WG21 je zpětná kompatibilita zásadní a k jejímu porušení se přistupuje opravdu v krajním či okrajovém případě.
C++ nenutí programátory používat raw pointery či nativní datové typy napřímo, takže to není o tom, zda něco C++ nemá, ale zda se používá ta část jazyka určená pro nízkou úroveň na té vysoké. Ano, je to bolest, ale je to zatím tak. Pokud někdo chce, může si nastavit flagy Wall a Werror a používat cppcheck či clang tidy.
Od C++26 jsou tu profily, které budou vypínat dle potřeby ne-bezpečné části jazyka.
Stroustrup na jedné přednášce řekl: "Kdo pochopil std::vector pochopil C++"
To vystihuje úplně vše. Kdo bude prasit C++ stejně jako C v garážovém stylu "Osmdesátek", tak výsledek bude hnůj. Většina dnešních C++ programátorů ten jazyk neumí používat, protože je to nikdo nenaučil - mantra o složitosti C++ je směšná, týká se to tak maximálně šablon a to jenom ve standardech před C++20.
No psát o Rustu jako nástupci C++ je celkem vtipné, protože každý jazyk směřuje totálně jinam(po stránce vlastní evoluce).
Nakonec přeji, ať nadšení z Rustu vydrží co nejdéle.
> Celek je tak bezpečný jako jeho nejméně bezpečná část.
Tohle přirovnání je absolutně mimo. Když to vztáhneme na oblíbený řetěz, budeš raději hlídat každý článek plastového řetězu pořád dokola, jestli náhodou někde nezačne praskat, nebo použiješ ocelový s jedním plastovým článkem, který se snáz hlídá a opravuje?
Tohle je taky mimo, ale bližší realitě. Navíc i když najdeš exploitovatelnou chybu v libc, musíš se k ní nejdřív skrz program dostat - což v případě Rustu nemusí být vůbec snadné.
ne, já jen nesdílím ten optimismus rustaru ze se neco zmeni, uz ted sam rust na spouste mistech ukazuje ze jeho system neni bez chyby a musi vznikat rovnaky na ohejbaky v podobe unsafe kodu,
proste je to porad dokola misto toho aby se dumalo jako danoi vec v jednom jazyce vyresit, zavedeme novy jazyk, ktery tu vec resi, mozna, ale na oplatku se musim vzdat hromady vyhod z toho puvodniho jazyka a jeste musim prijmout viru ktera vznikla jen proto aby tento problem zakryla.
> "Pokud Rust nechápeš a neumíš ocenit, nic ti nehrozí"
"proste je to porad dokola misto toho aby se dumalo jako danoi vec v jednom jazyce vyresit, "
C++ nejde opravit. Má chybné paradigma už od začátku. Změna paradigmatu je ještě horší nápad, to ti doufám nemusím vysvětlovat.
"na oplatku se musim vzdat hromady vyhod z toho puvodniho jazyka"
Proti Rustu nemá C++ žádné výhody. (Pokud nebudeme považovat za výhodu ohromné množství existujícího kódu, to je samozřejmě fakt.) Natož hromady.
"C++ nejde opravit. Má chybné paradigma už od začátku."
Jaké? Prosím o vysvětlení co je od začátku špatně.
"C++ nejde opravit. Má chybné paradigma už od začátku."
Jaké? Prosím o vysvětlení co je od začátku špatně.
Velké téma v C++ komunitě je aktuálně memory safety. Všichni by chtěli C++ memory safe (včetně mě), ale problém je v tom, že C++ nejde udělat memory safe bez ztráty zpětné kompatibilty, což taky nikdo nechce. Jsou docela velké tlaky na to, aby C++ bylo memory safe, např. i ze strany US governmentu. Situace v US je taková, že kdo bude chtít dodávat software pro US government, bude muset používat memory safe programovací jazyk (ne hned, ale jasně to k tomu spěje). To je špatná situace pro C++, protože to nevyhnutelně povede k tomu, že firmy kvůli tomuto požadavku US governmentu začnou od C++ migrovat pryč, pravděpodobně k Rustu.
Takže C++ standardizační komise je teď ve schizofrenní pozici. Musí řešit memory safety, což ale v podstatě nechce, protože většinový názor uvnitř C++ standarnizační komise je zachovat zpětnou kompatibilitu. Vzniknul návrh na Safe C++, který vypadá docela hezky, ale pochopitelně rozbíjí zpětnou kompatibilitu a dělá z C++ tak trochu Rust, takže ho standardizační komise smetla ze stolu a v podstatě se tím odmítla zabývat. Místo toho se tlačí safety profiles, ale to je jen takový hybrid, který trochu bezpečnosti pomůže, ale neudělá z C++ memory safe jazyk.
Uvidíme, jak se to bude vyvíjet dál. Externí tlaky na memory safety jsou velké a v C++ to nejde udělat bez ztráty zpětné kompatibility.
Ano, je to velké téma a zabývají se tim hlavouni z WG21 již nějaký ten pátek. Ale není to záležitostí nějakého paradigmatu.
Profily ani nejsou tolik hybridní řešení, ale je to věc kompileru - maximálně to přidá práci na straně programátora, např. by default bude nějaká konstrukce nebezpečná ale po přidání atributu/klíčového slova a podob. bude bezpečná a kompilace projde, takže nejde jestli je jazyk bezpečný a nebo ne, ale zda se používá tak, aby výsledný zápis bezpečný byl. Podle mě se v případě profilů jedná o mezikrok, který přidá čas k nalezení lepšího řešení. Zpětná kompatibilita je zásadní, nikdo z WG21 nechce opakovat situaci s Pythonem 3 a jsou snahy jít cestou TypeScriptu a tam jsou dvě možnosti: nová syntax bude mixovatelná s tou původní, nebo se udělají něco jako epochy v Rustu. Další věcí mířící do standardu je Erroneous behavior, které by mělo nahradit zatím undefined behavior při definici proměnné bez inicializace.
Nakonec ještě k bezpečné syntax - WG21 má zájem "nebezpečné" části jazyka zachovat, ale jejich použití by mělo být explicitní, důvod je ten, že existují místa a použití, kdy např. kontrola indexu do pole je příliš nákladná.
C++ je by default nebezpečný
Rust je by default bezpečný
Když si zobrazíte kus kódu v Rustu tak hledáte nebezpečné konstrukce: unsafe, panic, etc. Máte-li tam dejmetomu pět takových konstrukcí, tak je to pseudomatematicky
bezchybné - 5
Když si zobrazíte kus kódu v C++, a spustíte si na tom nějaký linter, checker, a cokoliv, tak vám to najde pět chyb. Takže pseudomatematicky je to
(blíže neurčené množství chyb) - 5
(Rád bych tě upozornil, že pokud budeš poukazovat na všemi včetně Rustařů známý fakt, že Rust neodchytí všechny chyby, tak si tě zaškatulkuju jako beznadějný případ, kterému není možno vysvětlit ani cenu rohlíku.)
Pořád jsem nedostal odpověď na moji otázku:
"C++ nejde opravit. Má chybné paradigma už od začátku."
Jaké? Prosím o vysvětlení co je od začátku špatně.
C++ je celkově unsafe, a můžeš mít části safe.
Rust je celkově safe, a můžeš mít části unsafe.
Dochází ti důsledky?
Díky tomu je prakticky nereálné, aby si se dostal s C++ k celkově safe. Důsledky jsou evidentní: Pokud budeš mít fakt dobrý programátory, o hodně lepší jak Ondřej Novák, a budeš mít velkorysí rozpočet - dostaneš se kvalitou na úroveň Rustu psaného průměrnými programátory za setinu ceny.
"C++ je celkově unsafe, a můžeš mít části safe.
Rust je celkově safe, a můžeš mít části unsafe."
To není žádné paradigma a je to minimálně zavádějící srovnání.
Podle teorie programovacích jazyků je C++ multiparadigmatický jazyk. Paradigmata jsou např. funkcionální, objektové, procedurální, modulární atd.
Pokud jde o podstatu C++ tak se jedná o jazyk s přímým přístupem k HW a abstrakcí bez nadbytečné režie(zero overhead abstraction - you don't pay for what you don't use), což je
velice správné.
Pokud bych srovnával C++ s Rust pak bych to udělal takto:
Oba jazyky si lze představit jako kufr s nářadím(budu se bavit o core language, nikoli o knihovnách).
Ten C++ kufr je o dost větší a obsahuje o dost více nástrojů, ke všem je stejně snadný přístup ať už je jejich používání s rizikem či bez, ale všechny jsou velice užitečné.
Rust má volný přístup jenom k nástrojům, které nenesou riziko při použití a ty ostatní jsou pod zámkem, takže musí být explicitně odemčeny.
Do C++ míří profily, které by měly ty nebezpečné nástroje zamknout, což bude zatím stačit, možná bude syntax 2.0 s možností zpětné kompatibility a nebo epochy, co se prosadí se uvidí.
Co se týče programátorů:
V C++ nevyšlo pouze z C ale taky ze Simuly, ale většina programátorů tehdy byli Cčkaři a tehdejší styl vývoje se propaguje dodnes - raw pointery, přetypování, mapování na paměť atd.
To ale není problém C++. To je problém toho, že tento styl se stále vyučuje, ikdyž k tomu nění žádný inženýrský důvod. Dodnes spousta učitelů(tím nemyslím pouze na školách) má za to, že
před C++ je dobré se nejdříve naučit C a pak až C++. Naproti tomu učitelé post C++11 mají za to, že to je kontraproduktivní a to právě z důvodu, že se pak huře zvyká na bezpečné nástroje.
Takže problém bude převážně s těmi programátory, kteří se naučili C++ před 30 a více lety. Tím ten argument s platy nebude takový horký.
Znám spousty programátorů, kteří na C++ svalují stav produktu, který kdysi výtvářeli, ale už nikoho z nich nenapadne, že ten jazyk používali špatně, oni totiž žijí pořád v omylu, že C++ je C s třídami a to doslova.
Znám C++ natolik, abych věděl jaké má důsledky ho využívat jako C nebo jaké důsledky jsou z používání jeho temných zákoutí.
Tak C++ je původně C s třídami, první verze snad byla implementovaná v C plus makra. Podobně jako Objective-C je další přístup přidání tříd do C. Až o dekády později je napadlo udělat z C++ "samostatný jazyk" po vzoru moderních jazyků a "reinvent the wheel" - přepsat standardní knihovny C do C++ stylu. Něco jako když Firefox měl rozšíření Firebug, ale pak implementoval vlastní vývojářský panel až po ostatních prohlížečích. A že se rekrutovali C++ vývojáři z vývojářů v C? Podle mě většina vývojářů Rustu se rekrutuje z C++kařů a problém to není.
To byl tvz. CFront - za pomocí maker se převádělo C++ do C, bylo to na začátku, sloužilo to jako "proof of concept", nicméně to nebyl cíl ani nikdy neměl být - Stroustrup to zmiňuje opakovaně - Simulu si v C++ většina programátoru neuvědomuje. Problém byl, že to programátoři C jako "C with classes" vzali. Standardní knihovny C++ dlouho nebyly, šablony jsou z Ady a byly implementovány do C++ na začátku devadesátých let, první iso je C++98.
Opět k těm vývojářům - když je někdo učí "C with classes" tak chápu, že ten Rust je vysvobození. To samé platilo i o Javě a C#, to byly ty jazyky, které všechno měly spasit.
Ano, Objective-C je opravdu objektové rozšíření C, C++ nikoli.
Jsem z toho úplně nepochopil, zda ti tedy dochází ty důsledky. Vypadá to, že asi ne. Každopádně jsem přesvědčen, že už není jaký další hint dodat. A platí stejná věc, jako u Ondřeje - můžeš si dovolit Rust nedocenit. Práce pro C++ vývojáře bude stále dost.
Jelikož mám znalost a praxi od Assembleru x86 a Motorola až po Lisp a stejně tak od jednočipu až po komplexní informační systémy, celkem mám vhled do toho , co se skrývá pod pojmy memory safety, resource safety, speculative execution, stack underflow či overflow, race condition, bounds checking atd. tak jsem si vědom důsledků toho co se stane, když se bude vyvíjet jako v garáži v osmdesátých letech minulého století nebo na úrovni kernelu či RT systému když to je kontraproduktivní. Moderní C++ je opravdu veliká množina nástrojů a pokud se chci vyhnout problémům vím co mám použít a jak to mám použít, není to žádná raketová věda, jde o to si to pouze osvojit a odstranit špatné návyky. Já chápu u nadšenců do Rustu, že vnímají C jako problematické, to já taky, ale Rust míří evolucí jinam, než C++, už jsem to v jednom příspěvku psal. Znám hodně zhrzených bývalých C++ vývojářů, většinou je to proto, že je to někdo špatně naučil nebo všechno věděli nejlépe nebo obojí a většina z nich vinu za problémy hodili na C++, to že za pomoci tohoto jazyka vytvořili prasečinu si často nedokázali ani připustit, čest vyjímkám.
> Moderní C++ je opravdu veliká množina nástrojů a pokud se chci vyhnout problémům vím co mám použít a jak to mám použít, není to žádná raketová věda, jde o to si to pouze osvojit a odstranit špatné návyky. Já chápu u nadšenců do Rustu, že vnímají C jako problematické, to já taky, ale Rust míří evolucí jinam, než C++, už jsem to v jednom příspěvku psal. Znám hodně zhrzených bývalých C++ vývojářů, většinou je to proto, že je to někdo špatně naučil nebo všechno věděli nejlépe nebo obojí a většina z nich vinu za problémy hodili na C++, to že za pomoci tohoto jazyka vytvořili prasečinu si často nedokázali ani připustit, čest vyjímkám.
Když tedy připustím existenci programátora - supermana, který nedělá chyby a nikdy "neprasí", pořád je zde skutečnost, že většinu produktů píše více lidí a často se udržují spoustu let. A pokud daný jazyk neposkytuje záruky, nedá se na (přinejmenším) cizí kód spolehnout.
Ta věc v C++ vyřešit už z principu nejde bez kompletního zahození zpětné kompatibility a překopání to v něco, co bude úplně nový jazyk - což už je Rust.
IMHO ten problém byl v tom, že ten projekt je velice kvalitní a je v udržovacím módu. Tudíž přepis do Rustu nepřinese benefity.
To, že je napsán v jazyce Rust, pomůže Fish, aby byl i nadále vnímán jako moderní a relevantní.
Tak tímhle tomu nasadili korunu.
No vypada to na ne zcela obvyklou kombinaci zlepseni technickeho reseni spolu s tim, ze vypadaji cool.
Lepší název, lepší technologie...
Další úhel pohledu je proč přejít na rust z C++. Za mě ano, dává tomu novej nádech a přepisuje se po novu bordel, nebo vyškrtne... Tudíž je z efektivněno...
Oni lidi ani moc C++ neumí, odborníka aby člověk lupou pohledal. Ale líbí se mi ten optimismus, že to v Rustu bude lepší (myslím s odborností programátorů). Zprasit se dá každý kód
Zprasit se da kazdy kod, ale nektere jazyky (knihovny...) tomu jdou vic napred a nektere se aktivne brani.
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.
Problém starého kódu v C++ je, že přepsat ho do aktuálnější verze C++ už není takový rozdíl od napsat to např. v Rustu. Pak stačí pár výhod pro Rust a je vymalováno. Něco jiného by bylo, kdyby se projekt už jen udržoval.
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é.
Není třeba přepisovat všechen kód najednou. Jen aktivně vyvíjené části. C/C++/Objective-C/Rust apod. mohou být spolu.
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
A nebo se věci z Rustu nakonec dostanou do C++ a Rust už nebudeme potřebovat.
Je to jako s kryptoměnama, spousta jich vznikla, aby posunuly vývoj Bitcoinu. Nakonec zůstal Bitcoin, je nesmysl udržovat speciální věc pro speciální účel
Jasně chápu, Rust je výjimečný hlavně tím, že programátorovi velkou spoustu věcí zakazuje. To je skvělá featura (ironie).
Jasně chápu, Rust je výjimečný hlavně tím, že programátorovi velkou spoustu věcí zakazuje. To je skvělá featura.
To je otázka životní filozofie. Prostě jsou typy lidí, které tak trochu uráží, že by je mělo něco hlídat. A pak je jiná skupina lidí, která to umí ocenit a využít ve svůj prospěch.
30. 12. 2024, 18:41 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).
Áno, je to o prístupe. Jedna vec je, čo C++ umožňuje, druhá vec je, čo je odporúčané používať alebo od čoho sú programátori priamo odradzovaní. Vznikajú nové abstrakcie, písaný kód je prehľadnejší a bezpečnejší. A bude sa to iba zlepšovať.
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.
Kód, který je živý, se přepisuje běžně. Firmy na přepsání peníze mají a u nadšenců zas potřebuješ, aby to bavilo i nové lidi. Rust na některé vývojáře ten efekt má.
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 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."
To netvrdím. Já tvrdím, že Rust zabil C++. Nikdo nikdy mě už nedonutí se k C++ vrátit.
Je zvláštne, že tú smrť C++ nevidno. Sú vývoj alebo rast jej príznakmi? To pochybujem. A k tomu, aby ste sa vrátili k C++ vás predsa nikto neprehováral. Takže to asi uzavriem tým, že si myslím, že najrozumnejšie je povedať si, že uvidíme o niekoľko rokov...
Proč by měl nějaký jazyk umřít. Vždy bude spousta legacy projektů, které se budou udržovat. Klidně desítky let. To je stejné jako s mobily, počítači či auty - důležité je poměr v těch nových prodávaných.
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.
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.
Tuhle argumentaci moc neuznávám, už proto, že si nedokážu představit, že by blbej den měl elektrikář, nebo nedejbože chirurg. Ale blbci jsou i v tomhle oboru a není to jen blbým dnem.
Tak jako elektrikář nezapojí modrý drát na fázi... i když to jde, ale pak to není blbej den, pak je to blbec.
I chirurg má blbej den a něco pokazí. Podobně zrovna nedávno ten pilot v Jižní Koreji, který zabil skoro 200 lidí včetně sebe, protože nedokázal rozumně zhodnotit situaci.
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
Není Java a C# např. většina kódu ve firmách? C nemůže zmizet, když je to jediné stabilní ABI mezi jazyky.
Já vím, už se to řešilo na listopadovém meetu Rust A C++ programátorů. Bridge mezi těmito jazyky zajistí C zatím nejlépe.
Nevím, jestli mám brečet nebo se smát (zoufale).
30. 12. 2024, 18:22 editováno autorem komentáře
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.
No já to psal proto, že bez knihovny stdio bylo zmíněné jenom C a řeší se zde vztah mezi Rust a C++. Dále by bylo dobré zmínit, že u jazyků, které jsou určeny k přímému přístupu k HW, je volitelný runtime standard.
Doufám, že nebudu nikdy potřebovat chirurga, který bude potřebovat kolegu, aby mu řekl, že dělá něco, co se nesmí.
Trvám si na svém. Tvůj argument odmítám uznat.
V pořádku. A myslím, že jsem si ujasnili, že já zase upřednostním jiného vývojáře, který bude mít větší cit pro realitu.
Držím palce. Doufám, že na práci toho programátora nenarazím, jako třeba teď jsem trpěl u základní softwarové výbavy pro Arduino, která je zralá na přepsání od základů. Ale o tom mám rozepsaný blogpost na rootu, snad vyjde do konce týdne.
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
Vyloženě Rust shell je Nu Shell, pokud někdo nezná. Přijde mi jako vymakaný a i zábavný.
Obecně mi u Rust ekosystému chybí nějaká vyšší vrstva (on by to asi byl dnešní optikou jiný jazyk), která by si podržela návykové jazykové konstrukce, a přidala pořádnou abstrakci. Nebo už něco takového existuje?
Nejsem si jist, zda dobře rozumím otázce. Ve svých projektech jako "abstrakci", nebo možná spíše klientské lepidlo používám:
- https://crates.io/crates/dyon
. https://crates.io/crates/rhai
- https://crates.io/crates/gluon
- https://crates.io/crates/rune (můj favorit)
A pak je možné jako určitou abstrakci možno chápat makra?
Rozumím. Mě to zní, jako by si chtěl napsat nějaký abstraktnější jazyk pro C# nebo F#.
Rust je IMHO jazyk s celkem vysokou abstrakcí. Chápu, že jsi těm makrům nepřišel na chuť, ale ty jsou právě ty nástroje pro tvoření compile-time DSLka. Jinak jsem nenarazil na potřebu.
Uveď příklad, máš-li slinu.
Dělám třeba teďkon takový šelmostroj. Jádro je v Rustu. Klientská logika v Rune. Další logika a věci v různých runtime DSLcích, které jsem si napsal na míru. Psát parser v Rustu jde snadno.
Kotlin má smysl, protože Java je syntakticky pravěk. U Rustu to IMHO není třeba.
Já nic psát ani nechci, na to bych si netroufl ani kdybych Rust používal více než jen občasně:-)
Spíš mám problém s tím, že větší projekt v Rustu se strašně rychle mění v takovou docela ukecanou a nepřehlednou změť závorek různých typů a není v tom vidět základní algoritmus, myšlenka. To je to, co bych řekl, že mají ty "vyšší jazyky" (jednak díky abstrakci, a pak taky díky syntaxi) takové čitelnější, uhlazenější. Třeba taková blbost, ale neustálé opakování pub(crate), tohle samo už dělá zbytečný "šum", který by šlo nějakou vyšší vrstvou odstínit.
Jen se tak ptám, třeba někoho jednou napadne to rozvíjet i v tomto ohledu.
Rust jsem zkusil, to, co slibuje, skutečně splňuje. Ale rozhodně nemám dojem, že by to byl jazyk, který má vše, co má C nebo C++, ale bezpečněji.
Největší mou kritikou je to, že není modulární na binární úrovni, jinak řečeno, neuděláte si sdílené knihovny jako DLL/so soubory. Ano, lze to provést, ale kompilátor vůbec nezaručuje binární kompatibilitu mezi verzemi, takže vytvořit takovou DLL je vlastně nebezpečné, protože při takovém slinkování za běhu se může stát cokoli.
Na argument, kdo dnes potřebuje DLL, řeknu, že si nedokážu poředstavit třeba linuxovou distribuci, že kde by každá aplikace byla zkompilována staticky. To je návrat o desítky let k prvotním Unixům. Ta instalace by se pěkně nafoukla.
Ale i kdybyste argumentovali, že jednou budeme mít exabytové disky, pořád je nepříjemné, že nemůžete udělat modulární software, kam přidáte něco později, aniž byste museli vše zkompilovat znova.
Stejnou kritiku mám ostatně k golang, kde je problém obdobný.
Takže Rust i golang jsou jazyky vhodné buď na nemodulární všeobecné nebo úzce customizované aplikace, kde zákazníkovi dáte binárky, kde bude jen to, co kód dělá a nic víc dodatečně.
Co se týče samotných jazykových vlastností Rustu, už to bylo mnohokrát zmíněno, není to jazyk, kde by se psaly pohodlně struktury se složitými odkazy mezi sebou typu graf. Ano lze to poskládat ze smart pointerů, ale psát v tom je pěkný a nepřehledný code bloat. Takže ten graf typicky implementují pomocí typu vector (nebo analogicky strukturovaný kontainer) a pointery jsou nahrazeny indexy do kontainteru. A náhle se nám vracejí problémy s pointery, i když v odlehčené verzi ... ano, nelze ukázat mimo daný kontainer, ale lze mít různé analogické situace typu užití už uvolněného prvku v kontaineru, atd.
Dále je borrow checker přísnější než se hodí, protože pokud nedokáže prokázat v dané situaci korektnost kódu, přikloní se k variantě, kdy vám nedovolí , co si umím´dokázat. Asi je to tak lepší řešení, ale zdržuje to a ohýbáte svůj kod tak, abyste dodrželi omezení Rustu, ne logiku aplikace.
Typický problém je, že potřebujete předat někam dvě reference na dva prvky ze stejného vectoru, ale to bohužel nejde, protože borrow prvku implikuje borrow kontaineru a ten nelze provést (lze jen u vícenásobného čtení).
Takže zapoměňte, že byste si napsali funkci, která by třeba kopírovala něco mezi dvěma prvky - strukturami, které jsou ve stejném vectoru.
Psát GUI aplikaci je taky pěkně na divoko ...
Nemám tedy dojem, že by Rust byl jasnou lepší náhradou C-C++.
Všechny use case nepokrývá, a typická rustová aplikace je jakýsi backendový konzolový monolit ...
30. 12. 2024, 23:03 editováno autorem komentáře
Struktury se složitými odkazy se dnes (často) nedělají pomocí pointerů ani v C++. Protože cache locality a výkon.
Rust pointery používat umí, unsafe totiž jen znamená, že vývojář explicitně deklaroval, že tento kód je "bezpečný", i když to Rust neumí dokázat.
Stejně tak Rust umí přenositelné dynamické knihovny. Stačí cargo nakonfigurovat na výstup typu cdylib.
Samozřejmě, že jsou situace, kdy se člověk zasekne na přísném borrow checkeru. Ale zase tak často se to nestává. Na druhou stranu Rust hlídá Send+Sync za uživatele, takže udělat race condition ve vícevláknovém kódu je mnohem mnohem těžší.
A v C++ jsou zase situace, kdy člověk omylem napíše nějakou chybnou konstrukci a překladač ji neodchytí (tady v té diskuzi je zrovna jedna taková ukázána). A celosvětově jsou paměťové chyby největším zdrojem CVE a pádů aplikací.
Takže ano, Rust nedovolí všechno co C++ a C++ nedovolí všechno co ASM. Kdysi jsme dělali samomodifikující se programy.. dnes už to není obvyklé (a vzhledem k NX flagům ani možné).
Při záseku na borrow checkeru jsou zpravidla dvě možnosti jak reagovat. Buď nadávat že v C++ by to prostě takhle napsané fungovalo, nebo si uvědomit že sice ano, ale nejspíš by to bylo unsound.
"Stejně tak Rust umí přenositelné dynamické knihovny. Stačí cargo nakonfigurovat na výstup typu cdylib."
Tak tohle jsem nevěděl. Vyzkoušeno a funguje. Pro ty dva případy, kdy bych to teoreticky potřeboval super.
Díky!
DLLka beru, sice jsem zkusil uvažovat, nakolik je to validní argument a nakolik opravdu potřebuji dynamické nahrávání modulů, ale nechť, uznávám pádnost.
"Co se týče samotných jazykových vlastností Rustu" - bylo tu už mnohokrát demonstrováno, že uživatelé nepochopili co chtějí. Rust aktivně brání konstrukcím, které by si stejně nechtěl používat, pokud by si byl dostatečně soudný. Zastánci C++ chtějí prodej heroinu, LSD, a kokainu na volném trhu s poznámkou v příbalovém letáku. Zastánci Rustu chtějí použití těchto drog jen licencovanými, proškolenými a registrovanými lékaři.
"Psát GUI aplikaci je taky pěkně na divoko ..." -- má zkušenost je opačná.
Někdy mám skoro pocit, že tyto projekty a teamy když už neví co by nového a užitečného přidaly tak to převedou do jiného jazyka(a marketingově zdůvodní). Hnedka je práce tak na rok či dva kterou jim zase někdo platí a je na hypotéku či dovolené.
Hm, četl jsi ten blog? Nikde jsem nenašel, že by zmiňovali nějaké sponzory. Naopak mezi zmiňovanými motivacemi přepisu je udržení stávajících a nalezení nových dobrovolných přispěvatelů, což by se jim s C++ nepodařilo.
Kdo presne ze plati ten vyvoj fishe, ze se vyvojarum vyplaci prepisovat do rustu, misto aby si koupili tryskac, radili v kasinu a zalozili vlastni vesmirny program?
Ahojte. Tak toto som v diskusii ohľadne správičky nečakal až 124 príspevkov! Ja teraz idem najmä Javu, píšem si v tom svoj projekt. A občas rozmýšľam, že zo zábavy by som si niečo len tak nakódil v inom jazyku. A obzerám sa aj po C-čku a aj po Ruste. Programovať som sa učil na strednej škole Pascal, potom starý Visual Basic.
Čítam diskusiu, ktorá ma veľmi zaujíma. Viete čo má spoločné Rust a C++, že prvé verzie u oboch jazykoch napísal de facto jeden človek.
Rust - Graydon Hoare
C++ - Bjarne Stroustrup
Len tak rozmýšľam, či by nebolo predsa len rozumné SPOLOČNE - SO SPOLOČNÝMI SILAMI a spoločnou snahou vytvoriť nový jazyk, ktorý by vyhovoval čo najväčšiemu počtu programátorov. Väčšinu úspešných jazykov odštartoval buď jednotlivec alebo úzka skupina ľudí - čo by sa stalo, ak by "sme si sadli" za "jednej stôl" a vytvorili niečo úplne nové????? Len taká myšlienka.
Ohľadne C++ ma zaujal aj Linus Torvalds, ktorý sa tiež k tomuto jazyku vyjadril.
S ohledem na to, že lidem v téhle debatě evidentně vyhovují věci které se navzájem vylučují by tohle nejspíš vedlo k jazyku který sice není secure by design jako Rust, ale zato ho nesnáší všichni stejně.
Možná Vás zaujme autorský tým stojící za Golang. Zejména se podívejte na jména Thompson a Pike. A na historický důvod vzniku Golang (nelíbilo se jim C++).
"Väčšinu úspešných jazykov odštartoval buď jednotlivec alebo úzka skupina ľudí - čo by sa stalo, ak by "sme si sadli" za "jednej stôl" a vytvorili niečo úplne nové????? Len taká myšlienka."
Řekl bych, že nic. Určitě nic užitečného natož funkčního. Tohle nefunguje ani normálně. Natož v meritokratické společnosti co programátoři do značné míry jsou.