Rust je moderní jazyk pro systémové programování nabízející bezpečnou správu paměti verifikovanou v době překladu. K dalším výhodám patří poměrně silný typový systém (s podporou GADT). K nevýhodám patří pomalý překladač a silná závislost na LLVM.
Někdo chce vyvolat flame war?
3. 12. 2021, 20:56 editováno autorem komentáře
"Závislost" lze vždycky brát jako nevýhodu, ale koho tohle v praxi zajímá? Rust je "general-purpose language" a spousta lidí ho používá prostě proto, že se jim v něm (fakt!) píše dobře a má slušné výsledky. Superoptimalizace, které by třeba zvládlo gcc a překladač Rustu je teď neumí, jsou úplně mimo zájem většiny vývojážů.
3. 12. 2021, 21:09 editováno autorem komentáře
"Docela snadno" bych neřekl, přece záleží na tom, jaký kód překládáš - když budeš mít v Rustu hodně maker a různých složitých abstrakcí, bude to určitě překládat delší dobu, než když budeš z Rustu dělat nějakou obdobu C. Release build je pochopitelně delší než devel build - který se počítá? Co teda budeš měřit, aby to dávalo smysl? Vzít do ruky stopky a umět odečíst čas ještě neznamená, že měření bude dávat smysl.
Calculon, který psal zprávičku, mluví o relativní pomalosti, tak OK - s čím to chceš porovnávat, s Pascalem? A hlavně - kdy už je "pomalejší překladač" pomalý a kdy je ještě v pohodě?
4. 12. 2021, 08:05 editováno autorem komentáře
Ano, aby porovnání dávalo smysl, je potřeba překládat kód, který dělá to samé. Ale to není nepřekonatelný problém. Pokud budu porovnávat více jazyků, stejně v nich budu muset napsat kód, který dělá to samé – a pak budu porovnávat dobu překladu, paměťovou náročnost překladu, efektivitu přeloženého programu (jak z hlediska výpočetního výkonu tak z hlediska paměti), velikost přeloženého programu, snadnost programování, předcházení chybám… Změřit dobu překladu je z toho skoro to nejjednodušší.
Počítat můžete oba buildy, důležitější je pochopitelně devel build. Porovnávat to budu s jakýmkoli jazykem, který zvažuju jako alternativu – s C, C++, C#, Javou, Go, Kotlinem… Můžu to porovnávat i s interpretovanými jazyky, když na to přijde.
A hlavně - kdy už je "pomalejší překladač" pomalý a kdy je ještě v pohodě?
Myslím, že ve zprávičce to má ten význam, že je viditelně pomalejší, než jiné obdobné jazyky. Rust bych srovnával asi hlavně s C a C++, protože to jsou jeho nejbližší konkurenti.
> Ano, aby porovnání dávalo smysl, je potřeba překládat kód, který dělá to samé.
Pokud se nesoustředíš na nějaké triviální algoritmy, je to skoro nemožné. Když vyvíjíš nějaký produkt, můžeš dojít ke stejné funkčnosti mnoha různými způsoby.
> Změřit dobu překladu je z toho skoro to nejjednodušší.
Ano, je to úplně jednoduché, když to uděláš blbě a je to skoro úplně k ničemu, když se budeš snažit hodnotit "snadnost programování" a "předcházení chybám", protože tam ta měřitelnost je iluzorní. Můžeš se spolehnout na komplexní zkušenost nějakého týmu, který úspěšně změnil jazyk/technologii, ale tam už o nějaké objektivní měřitelnosti nemůže být řeč vůbec.
> Rust bych srovnával asi hlavně s C a C++, protože to jsou jeho nejbližší konkurenti.
Srovnávat ho můžeš s čím chceš, klidně s Haskellem nebo Pythonem, ale největší smysl má srovnání s C++, protože Rust se jím inspiroval hodně a má podobné cíle (zero cost abstractions apod.). Rust nemá moc smysl srovnávat s C, to bych spíš sáhnul po něčem jako Zig.
Myslím, že je dost nepravděpodobné, že by překladač překládal pomalu implementace triviálních algoritmů a větší projekty pak překládal (relativně) výrazně rychleji. Nebo naopak. Takže to srovnání na implementaci triviálních algoritmů se dá extrapolovat.
Nevím, proč bych měl rychlost překladu měřit blbě. Jak se má správně měřit rychlost vykonání nějakého programu je známo. Většinou stačí pustit program se stejným vstupem opakovaně, aby se porovnávala doba běhu, když se vše čte z cache a nebyla tam penalizace čtení dat z disku.
> Myslím, že je dost nepravděpodobné, že by překladač překládal pomalu implementace triviálních algoritmů a větší projekty pak překládal (relativně) výrazně rychleji. Nebo naopak. Takže to srovnání na implementaci triviálních algoritmů se dá extrapolovat.
Nejde ani tak o "větší projekty", nýbrž o složitější abstrakce (generické typy, makra...) apod. Znovu se vracím k nesmyslnosti srovnání kompilace jazyků typu C a třeba Rustu.
> Nevím, proč bych měl rychlost překladu měřit blbě.
Blbě znamená neužitečně (byť klidně přesně a můžeš se poplácat po zádech, jak jsi na to vyzrál). To znamená v kontextu reálného projektu změřit, že pokaždé znovu čekám na build více než (třeba) 5 sekund a je to pro mě z těchto konkrétních důvodů neakceptovatelně.
To je lepší, ale pořád to ještě není ono. Papírové parametry jsou fajn, ale existuje něco jako mezní užitek. Je otázka, kde ta "pomalost" ještě vadí a jak moc. Nepotřebuješ dělat hřebíky z nástrojové oceli a nepotřebuješ drahý závodní vůz, abys dojel pohodlně z Prahy do Brna.
4. 12. 2021, 11:04 editováno autorem komentáře
> Za prvé, pokud je něco pomalé, je to objektivně pomalé i tehdy, i když mi to subjektivně nevadí.
To je zatím nejvtipnější, co jsi napsal. "Pomalý" je subjektivní pojem a ne objektivní.
> Za druhé, abych mohl zodpovědně říct, zda mi pomalost vadí nebo nevadí nebo jak moc mi vadí, musím ji nejdřív umět změřit.
Zde se shodneme. Změř to, ale v reálné praxi. Pak se můžeme bavit o tom, proč to vadí a co se s tím dá dělat. Rust má dost nevýhod, ale bavme se o nich inženýrsky, prakticky.
No tak jinak. Představ si, že jsi člověk, který se porozhlíží po světě, umí trochu (nebo víc) programovat v nějakém jazyce, třeba v Javě nebo Pascalu nebo Ruby apod. Chodí na Root, přečte si Tvoji zprávičku a čte tam, že překladač Rustu je pomalý. Slabší povahy to může až vyděsit, protože "pomalý" může znamenat cokoli od "pomalejší než Turbo Pascal" po "prakticky nepoužitelný". A já si vzpomínám, že třeba překlad Scaly byl někdy pomalý tak, že se člověk na to chtěl vykašlat. Takové zážitky jsem s Rustem nikdy neměl.
Já úplně chápu, že s Jirsákem považujete "pomalý" a "pomalejší" skoro za synonyma a dokážu si mezi řádky tyhle vaše myšlenkové pochody zhruba představit, to mi nikdo nemusí "objasňovat". Ale holt si myslím, že podobné snahy o přidanou hodnotu můžou úplně zbytečně čtenáře odradit a to by přece byla škoda.
Ink: Pokud někoho vyděsí, že se dočte, že Rust je pomalý, pak ho asi musí děsit kdejaká hloupost. Zprávička nebyla primárně o rychlosti Rustu, aby tam byla nějaká měření.
Pochopil bych, kdybyste přišels nějakými čísly ukazujícími, že překladač Rustu je srovnatelně rychlý, jako třeba MSVC. Zatím mi to ale připadá, že si myslíte, že rychlost překladu Rustu má být tabu a všemi možnými i nemožnými prostředky se snažíte ostatní přesvědčit, že nemá smysl se o tom bavit.
Zase ty Tvoje demagogické šrouby, Jirsáku. Celou dobu jsem chtěl, aby někdo řekl, co je u někoho z vás pomalé a co rychlé. Až bude rustc rychlejší než MSVC, vydáš nějaký certifikát? Já jsem si, na rozdíl zcela jistě od Tebe, třeba ten ripgrep dnes zkoušel komplet zkompilovat a včetně závislostí to bylo IMO rychlé dost. Tvrzení, že je pomalý, by měl teda prokázat a zdůvodnit ten, kdo s ním přišel.
> Já vydám klidně certifikát, až bude překladač Rustu rychlejší než překladač Go. Přinejmenším v kontejnerech :)
Konečně ses vymáčknul, co jsi myslel - s čím jsi to implicitně srovnával. Jinými slovy, co je ten příslovečný slon v místnosti. ;)
Když srovnám Rust s Go, jsou tam z mého pohledu závažnější rozdíly, než je rychlost překladu. Na jednu stranu máš vývojáře, kteří se Rust nikdy nenaučí nebo ani nechtějí a na druhé lidi, kteří se Go nedotknou ani klackem nebo jen s krajním odporem.
Zajímavé je i srovnání dostupných knihoven. Živelný vývoj Rustu tady někdo zmiňoval, překážkou může být i dost velká závislost na Internetu.
Co se mi na Rustu líbí je, že všechny tyto věci někoho trápí a aktivně se řeší. Třeba vedle toho gcc backendu existovala snaha udělat výrazně rychlejší devel build do Craneliftu, ale dělal to myslím jeden člověk a to, že se to zatím nedostalo k širšímu využití, může znamenat, že s tou rychlostí překladu vesměs rusťáci dokážou bez větších problémů žít.
> Pokud někdo o nějakém jazyce nebo konceptu řekne, že by se ho nedotknul ani klackem, že v něm vzbuzuje odpor, že je to odpad apod., je akorát tak vypatlaný idiot. A je úplně jedno, jestli jde o Javu, Cobol, Lisp, PHP, APL, OOP, s-výrazy, ORM...
No tak to neřekne (aby o něm Calculon neřekl, že je ...) a prostě to nepoužije, protože mu to nestojí za to úsilí a nervy. Koneckonců, proto vznikají nové jazyky, že asi všichni sice chtějí psát v Cobolu a PHP, ale jen tak z plezíru a přebytku volného času si přidají něco dalšího.
5. 12. 2021, 11:57 editováno autorem komentáře
U překladače je rychlé a pomalé subjektivní pocit. Pomalé je to tehdy, když má vývojář pocit, že na každé spuštění programu musí čekat a že ho to brzdí v práci. Ve srovnání s Go je překladač Rustu v tomto smyslu bezesporu pomalý; je to i názor samotných tvůrců a vývojářů rustu, protože se snaží to vylepšit. Tak okamžitý a bezbolestný, jako Go, Rust nejspíš nikdy nebude, ale být znatelně rychlejší, než clang komplikující C++ je dosažitelný cíl.
Pokud bude překlad C++ kódu trvat 20 sekund a stejný kód v Rustu se bude překládat 50 sekund, je ten překlad Rustu objektivně pomalejší než překlad C++. Subjektivní je to, zda mi to vadí nebo nevadí.
To není tak úplně správně. Je to metodická otázka. Musel byste ještě měřit ku stejně kvalitativnímu výsledku.
A nebo uplatnit to tvrzení o rychlosti pouze na vybranné, porovnatelné úseky.
4. 12. 2021, 13:49 editováno autorem komentáře
To není tak úplně správně. Je to metodická otázka. Musel byste ještě měřit ku stejně kvalitativnímu výsledku.
A nebo uplatnit to tvrzení o rychlosti pouze na vybranné, porovnatelné úseky.
Je to správně. Když chci měřit rychlost překladače, měřím rychlost překladače. Když chci měřit efektivitu výsledného kódu, měřím efektivitu výsledného kódu. Když chci porovnávat snadnost vývoje nebo sklon k chybování, zjišťuju snadnost výboje nebo sklon k chybování. Při výběru jazyka pak pravděpodobně budu brát v úvahu víc kritérií, ale to neznamená, že při měření jednoho kritéria do toho mám motat jiné kritérium.
Je to správně. Když chci měřit rychlost překladače, měřím rychlost překladače. Když chci měřit efektivitu výsledného kódu, měřím efektivitu výsledného kódu. Když chci porovnávat snadnost vývoje nebo sklon k chybování, zjišťuju snadnost výboje nebo sklon k chybování. Při výběru jazyka pak pravděpodobně budu brát v úvahu víc kritérií, ale to neznamená, že při měření jednoho kritéria do toho mám motat jiné kritérium.
Samozřejmě, když chcete měřit rychlost atleta na 100 metrů, co na tom jestli jeden běží sprint a druhý přes překážky nebo štafetu, dráha je 100 metrů ... sice jste roztomile nebral v úvahu žádné další kritérium, jenže pak je výrok "pomalejší" naprosto k ničemu.
6. 12. 2021, 20:54 editováno autorem komentáře
Samozřejmě, když chcete měřit rychlost atleta na 100 metrů, co na tom jestli jeden běží sprint a druhý přes překážky nebo štafetu, dráha je 100 metrů ... sice jste roztomile nebral v úvahu žádné další kritérium, jenže pak je výrok "pomalejší" naprosto k ničemu.
Odpověď jsem pro vás napsal dopředu, najdete ji zde: https://www.root.cz/zpravicky/vysel-rust-1-57/1082326/
> Jestli to tvoje “bavme se inženýrsky, prakticky” znamená říkat o jiných jazycích, které Rustu v některých oblastech úspěšně konkurují, že jsou odporné a odpad, tak to asi nemá cenu.
Jenže já jsem to nenapsal ani tady a ani nikdy. Mně se třeba Go kdovíjak nelíbí a psát v něm nechci (ale klidně budu, když nebude jiná možnost, zas tak moc mi nevadí), nicméně respektuju, že někomu přijde fajn a používá ho. Ty si to bereš osobně, jako kdybych Ti pomluvil bráchu. ;) Zrovna tak jakýkoli jiný jazyk - proč by mě mělo vzrušovat, že někdo chce používat APL nebo LISP? Maximálně se zajímám, co by ten jazyk mohl dát navíc. A zrovna tak respektuju, že někdo za živý svět nechce dělat v Rustu nebo Go nebo PHP a nebudu o něm tvrdit, že je idiot.
Pane Jirsáku, to, že se to dá změřit neznamená, že na to nemohou existovat subjektivní pohledy. Ostatně děje se to běžně zvlášť, co se právě rychlosti týká. A to dokonce i mimo IT.
Ono je to ostatně celkem logické. Některým lidem vadí, že se jim systém nastartuje o pět vteřin pomaleji než by chtěli. A mně je úplně jedno, jestli se startuje minutu nebo dvě. Ano, je to můj subjektivní názor, ale ačkoliv to je změřitelné, pro mě to pomalé není a jiný by z toho zešedivěl.
Ink: Je tam napsáno „pomalý překladač“. Kdyby to tam nebylo, nerozpoutal jste tu tuhle diskusi. Nejsou tam tedy vypsané hodnoty z konkrétních měření, je tam jen souhrn slovem „pomalý“. Pokud vám z měření vychází něco jiného, je jediná možnost – že sem ta čísla dáte. Protože bez čísel se tu můžete dohadovat donekonečna.
Jirsáku, už jsme si vysvětlili rozdíl mezi prvním a druhým stupněm přídavného jména "pomalý".
Co vy jste si vysvětlil je mi jedno. První stupeň přídavných jmen se běžně používá pro označení, že má něco danou vlastnost víc, než jiné věci. Např. lidé běžně říkají, že tráva je zelená – jenom Ink vyskočí jak čertíček z krabičky, že zelenost je subjektivní pojem a že je možné objektivně říci jenom to, že tráva je zelenější než například dřevo.
Žádná čísla evidentně nemáte, takže tu jenom mlátíte prázdnou slámu.
Až po Tobě, Jirsáku. Kdybys uznal, že "pomalý" je subjektivní pojem, mohli jsme to uzavřít. Jenže Ty nikdy chybu neuznáš, do každé diskuse přijdeš vykřikovat svoje "moudra" a musíš mít vždycky poslední slovo. Tak teď už si piš, co chceš, na rozdíl od Calculona, který očividně ví, proč napsal, co napsal, je mi Tvoje prázdná sofistika ukradená.
6. 12. 2021, 10:29 editováno autorem komentáře
Je vazne nesmysl vydavat "verze jazyka", ktere umoznuji neco, co predtim nebylo mozne.
Jiste, me Gentoo si s tim poradi, dle dependencies ktere jsou verzovane, ale co bezny clovek, co napise kod, a pak zjisti ze na ctyrech setrojich se to chova peti zpusoby, protoze maji jinou verzi prekladace?
Dobrej priklad je v tomto PHP - jenom major verze (4,5,6,7,8) meni samotne moznosti a chovani jazyka, minor verze pak jenom opravuji mensi implementacni bugy. To me prijde jako rozumne.
Některé jazyky deklarují garanci zpětné kompatibility v rámci major verzí. Je to podobné verzování knihoven, kde se s major verzí může měnit API. Rust je zrovna trochu partyzánština, ale většina změn, které něco rozbijí či deaktivují, je právě vinou LLVM.
Pokud jó záleží na verzi překladače, stačí to nacpat do Dockeru :)
BTW hezký příklad jazyka, který prošel enormními změnami, je Fortran (ten má mimochodem velice rychlý překladač a generuje extra rychlý kód).
Jsem už moc starej, když mi makra a metadata-atributy přijdou jako zvrhlost? Ještě tak metadata-atributy pro testování a vývoj, ale řídit tím nějakou produkční logiku... A makra... copak se to nedá řešit pomocí objektů/struktur?
"makra... copak se to nedá řešit pomocí objektů/struktur"
Nedá, Rust nemá runtime (a jeho tvůrci se tím ještě chlubí), proto se kód musí prošpikovat makry. Ono to nemusí být na škodu, některé věci je lepší řešit v době překladu. V Rustu jsou makra a atributy v postatě generátory kódu zabudované do překladače.
No nevím, jak s tím runtimem, ale nejčastější makra, se kterými se zřejmě uživatel Rustu potká od samého začátku, jsou println!, format! apod., to znamená formátování řetězce s kontrolou právě v době překladu. Málokterý jazyk má tohle vyřešeno tak inteligentně a bez maker by to podle mě nešlo jinak, než nějakou ad hoc jednoúčelovou magií.
Vtip vidím v tom, že makro většina programátorů nemusí nikdy napsat a přesto z něj má velký užitek. Těch příkladů je celá řada.
Já jen, že nejsem velký příznivec maker, ale makra asi jak byla prezentována v C, tedy jako něco, co pracuje s textem bez znalosti kontextu daného jazyka.
A to je asi nejvíc evil na makrech v jazycích C a C++ (speciálně tam).
Nevím, jak je to s makry v Rustu, já jen že při slově makro se mi otevírá nůž v kapse :-)
Při psaní maker v Rustu se přímo manipuluje syntax tree jazyka. Není to jen tupý generátor textu. Navíc jsou makra psaná opět v Rustu, není pro to potřeba žádná speciální syntax jako v C.
Pro začínajícího programátora může být psaní maker (hlavně procedurálních maker) poměrně strašidelné, ale výhody v DRY které to někdy poskytuje jsou neskutečné. Osobně mám třeba napsanou knihovnu s makry, které z jednoduše abstrahované specifikace celkem složitého protokolu s desítkami objektů vygeneruje veškerý kód rozsáhlé api knihovny, všechny settery, testy, dokumentaci… Psát to ručně, zblázním se z toho :)
Makra v Ruste si netreba predstvovat ako tie v C, alebo ako templaty v C++. Tu su na uplne inej urovni a robi sa s nimi naozaj dobre. Nie je to hlupe replacovanie textu, ale skutocna sucast jazyka a mainpoulacia s AST. navyse Rust s nimi vie aj perfektne zobrazit chyby... takze ziadne hladanie chyby v niecom co ani v zdrojakoch nie je.
Plní víceméně podobnou funkci, ale není. Viz https://doc.rust-lang.org/reference/attributes/derive.html a odkazy na derive macros apod.