Po objevení Rustu se pro mě stal C, C++ mrtvou záležitostí.
Ano, samozřejmě, Rust není všespásnej, člověk se musí namahat a přemejšlet a vůbec. Ale prostě ty benefity které poskytuje jsou nepřehlédnutelný.
- Přátelštější syntaxe se zajímavými typy.
- Přejícné chybové hlášky.
- Defenzivní přístup (panic!() musíš napsat, ne, že se ti prostě stane.)
- Moderní ekosystém cargo a spol.
Zním fanaticky? A to se ještě krotím! :-)
Rust nemá ten sedmdesátkový vibe (preprocesor, make a podobné chutnosti) - prostě je to moderní jazyk s moderním ekosystémem, ale C a C++, když je nouze, taky umím použít. Trochu je mi líto mladších vývojářů, kteří tohle nezažili a najedou hned třeba na Python nebo JS/TS a tuhle kovářinu nemají pod kůží.
Na Rustu se mi líbí dvě věci: nesnaží se za každou cenu přidávat další a další možnosti (co takhle OOP, nebylo by? a co garbage collector, nehodil by se?). Pak komunita, která opravdu poctivě přemýšlí, jaké věci zlepšit a jak vyřešit omezení, které Rust (záměrně) má jako jazyk - self-referential structs atd.
C a C++ jsou v pohodě, ale co mi na tom přijde příšerné je (ne)přenositelnost bez něčeho jako CMake a ten zrovna jednoduchý není. Hlavně na windows takové úlohy jako nakopíruj DLL ze tří knihoven k binárce, kde je to pro každou řešené jinak.
Rust jsem zkoušel asi dva roky zpět a po pravdě úplně nevím, co bych v něm psal, nějaké aplikace s GUI ne, nebyly dobré frameworky a na práci s obrázky. Nějaké serverové části webové aplikace by asi šly.
Byť vidím nějaké výhody (cargo, je těžké napsat program s nedefinovaným chováním - raději definovaně spadne). Ale že pro něj nemám využití, neznamená, že není pro některé aplikace vyloženě dělaný a ekosystém se za dva roky také nejspíš zlepšil.
Dva roky je dost vody.
https://crates.io/ hodně jede.
gtk3, gtk4 je.
qt mi zlobilo
Podpora obrázků celkem je, včetně vektorů (tady bez záruky).
V mém případě se rust právě vyprofiloval jako jazyk pro desktop a webservice.
1. 11. 2023, 16:19 editováno autorem komentáře
Hele a ty máš porovnání s rozsáhlým vývojem v C/C++ jako mission/safety critical systémy vs Rust? Nebo se ti Rust líbí pro domácí programování? V práci jedeš PHP pokud se nepletu.
Ne že by ten jazyk nebyl zajímavý -- sám tu někde dohledáš moje debilní otázky na téma "Co říkáte na jazyk Rust v0.999?" snad před 8 lety s odpověďmi kupodivu tenkráte vcelku chladnýma. Myslím dokonce ještě před prvním článkem P. Tišnovského. Za ty roky sem ale nějak taky lehce ochladnul.
Radek M. má, dle mého názoru, fakt v mnoha ohledech správný a kritický úsudek. Není standard, není formální důkaz, není zkušenost...
Jinak dohledat si tady články a názory o Rustu třeba z roku 2016 je fakt srandy kopec.
[[citace: "Protože Rust je typický zbytečný programovací jazyk, po kterém za pár let ani pes neštěkne. Byl vyvinut proto, že "chceme používat jen co si vymyslíme sami"]]
:D
S rozsáhlým? Jak rozsáhlým?
Prostě C/C++ znám. Mám s ním nějaké zkušenosti. Dělal jsem v něm nějaké kšefty. Mám zkušenosti s dalšími jazyky. A když jsem hledal na jeden "rozsáhlejší" projekt kandidáta, tak na základě určitých analýz/prototypů C/C++ totálně propadl, a Rust zazářil.
Pochopitelně, je to mé prohlášení člověka z internetu, a nebudu ti mít za zlé, když si jím podložíš kytku.
U Rustu se setkávám s jedním nešvarem. Objeví se někdo jako já, který začne básnit. A pak se zvedne vlna nevole, která začne prohlašovat:
- Rust nemá standard (neměl)
- Rust nevyřeší všechno (to nikdo netvrdí).
- Rust dělá Mozilla a určitě zhebne (oba)
- Jsou lepší jazyky jak Rust (ne ve stejné situaci)
- V práci nakázali C
- Máme code base v C
- a další
Cože je všechno pravda a vůbec. Ale nic to nemění na skutečnosti, že Rust je horkej kandidát na zabijáka C/C++. Né Javy, Haskellu, C#. C/C++.
Ale beru tě vážně. Jen sem se ptal.
(Tak se ptáš co je C/C++ a pak to sem prdneš sám :D). Výrazu C/C++ se štítili protože měli mindrák, že se to míchá dohromady a C++ se tím usurpuje nebo naopak?
Pro zábavu, to je Rust fanatik, v dobrém slova smyslu: https://www.youtube.com/watch?v=LbmvbXPj8Fs
Tady se ukazuje, jak vzniká nedorozumění. Já pochopil to jako že narážíš na výraz co to je "C/C++" a tím odsouváš pozornost na ten termín, který je pro někoho jak red flag. A tys to myslel úplně jinak. Promiň tedy. A máš pravdu, C a C++ není z tohoto, kromě historického důvodu, moc vhodné. To byla a je Ada a SPARK. Rust už radši nechávám stranou, rozhodně se na to ale hodí víc než C/C++.
3. 11. 2023, 15:10 editováno autorem komentáře
Já jsem samozřejmě tak nějak vytušil, co chtěl předřečník říci, aniž bych mu teda viděl do hlavy a chtěl mluvit za něj. Že vznikne vždycky nějaký nový (a v něčem nutně lepší) jazyk, je pravda a je to skvělé.
A on taky obyčejně řeší věci, které ty předchozí dělaly špatně. Konkrétně Java se zdála dobrým řešením tristní situace aplikací psaných v C a C++ - C# přišel dost dlouho po Javě, když se Microsoftu nepovedlo Javu unést pro svoje účely. A Python je o 9 let starší než C#, jen pro úplnost.
Argumentovat tímhle, tak povrchně jako to děláš a ještě zjevně špatně chronologicky, ale k ničemu zajímavému nevede. Rust není nový Python ani nová Java.
A to ako dostavate v praci zadanie? Toto mi tu urob. Mame zakupeny kompilator pre C/C++ aj nejake kniznice, mame build prostredie a kazdy to tu ovlada ale vies co, kludne to urob v Zig-u tomu tu nikto nerozumie to bude super.
Ja som velky fanusik Zig-u ale to co pisete mi pride z pohladu zamestnaneho programatora ako nezmysel.
Ak neviete tak ten Android mate uz aj v chladnickach a napriklad Javu v cipe na vasej bankomatovej karte pripadne obcianskom preukaze (https://en.wikipedia.org/wiki/Java_Card).
Asi zalezi co myslite v tej 'klasickej'. Zalezi kto kde nakupuje, napriklad tu mate Visa card s Javou:
https://www.alibaba.com/product-detail/CR80-JCOP-J3D145-Java-Bank-Card_1600739096024.html
Ne, to jsem nevěděl, ale připouštím, že něco, co musí mít velký displej, GUI a wifi připojení někam do cloudu, může mít Android a je to nejspíš i správná cesta.
Jenže my jsme se bavili o něčem jiném. O tom, že použití Javy bylo zamýšleno do jednoduchých zařízení právě tam, kde se mělo ušetřit za jednočipy. A to se nestalo, protože stále i v dnešní době je levnější (rychlejší na vývoj i údržbu) použít malý a levný jednočip pro primitivní zařízení, než počítač na úrovni mobilu, který je přece jen dražší. Hardware pro Java je pro primitivní aplikace stále dražší, než hardware pro ty samé aplikace napsané třeba v C. Zdůzarňuji slovo "primitivní", tj. toastovač, lednička bez GUI nebo zmíněný mixér.
Ale na Androide ziadna JVM nebezi. Pozrite si Android Runtime(ART) pripadne starsi Dalvik (https://source.android.com/docs/core/runtime).
No, Android používá jiný bytecode (více tříd v jednom souboru, register-based namísto stack-based). Ale jinak to je v podstatě Java. Je to založené na OpenJDK (od verze Nougat; předtím používali Apache Harmony). Samozřejmě to kvůli jinému bytecode musí používat jinou JVM. (Možná není korektní tomu říkat JVM, když používá jiný bytecode.)
Jiný bytecode má nejspíš hlavně historický význam. Asi bude obvykle menší (nejsem si jist, jestli na tom dnes opravdu záleží, ale OK), a asi v době interpretace byl rychlejší (JIT přišla ve verzi 2.2 Froyo, AOT v 5.0 Lollipop, resp. experimentálně už v 4.4 KitKat), ale dnes se používá nejspíš hlavně ze setrvačnosti.
Jiný bytecode byl politickou resp. právnickou nutností. Protože Androidí aplikace běží na mobilních zařízeních a pro ty není (tedy nebyla) k dispozici Java SE (SE=Standard Edition). Pro tato zařízení je určena Java ME (Mobile Edition), jenže ta už není/nebyla zadarmo.
Takže pokud by Google postavil své řešení na ME, musel by za každé zařízení s Androidem a JVM platit Oraclu, což se jim samozřejmě nechtělo (navíc jak to zařídit u třetích stran).
Takže si museli udělat vlastní "JVM která z právního hlediska není JVM" a tedy i odlišný bajtkód. Byly kolem toho i žaloby (lze dohledat) mezi Oracle a Googlem, ale do podrobností tady jít nemůžu (jako ex-autor OpenJDK a IcedTea; tam to bylo taky na hraně).
Takže Dalvik může být v něčem rychlejší, ale to nikdy nebyl hlavní důvod jeho vzniku.
Moc se těším na další budoucnost Rustu, Ada se Sparkem se ve své době prosadila, ale nových profi projektů je buď jako šafránu nebo jsou pod pokličkou - mimochodem moc se těším na otevření Adamantu:
https://www.nxtbook.com/smg/special-report/23SR07B-25-Space-Technology/index.php#/p/14
Právě Adacore a Ferrous se minulý rok dohodli na spolupráci:
https://blog.adacore.com/adacore-and-ferrous-systems-joining-forces-to-support-rust
kterou brzy ukončili a nyní Adacore nabízí svým zákazníkům plnou podporu nejen pro Adu a C/C++, ale také pro Rust:
https://blog.adacore.com/adacore-has-two-announcements-about-rust
Takže potenciál zde rozhodně je, Rust s ISO certifikací podporovaný jednou z těchto společností možná bude tím důvodem, proč jej ve firemní sféře plně nasadit, uvidíme.
Hledal jsem, zda se Ada v České republice profesionálně využívá, ale nebyl jsem úspěšný, jedinou společnost jsem nalezl u našich východních bratrů (autor článku je v poslední době velmi aktivní na Ada fóru):
https://www.ipesoft.com/sk-blog/vyber-programovacieho-jazyka-pre-realtime-systemy
Rust situaci možná změní, vypadá to, že v Eře o něm uvažují:
https://kariera.era.aero/volne-pozice/vyvojar-sw-c/
Otázkou samozřejmě zůstává, zda je v době stálého vylepšování umělé inteligence tak důležitý výběr programovacího jazyka, dnes možná ano, zítra třeba ne. Časem ChatGPT, Phind nebo jiná aplikace provede matematickou formální analýzu sama i bez Sparku (který pokud vím zatím nemá plnohodnotného konkurenta ve svém oboru).
Ano, s tím nelze nesouhlasit, ChatGPT jsem dával jen jako příklad. Ono je to s tou bezpečností a spolehlivostí vždy relativní, např. diskutéři na Gitteru nebo Redditu poukazují na příliš velikou závislosti komponent nabízených společností Adacore na jazyce Python a neopomíjejí ani Spark nástroj gnatprove, který rozhodně není bez chyb. Ale jsem rád, že se Ada stále vyvíjí a její aktuální verze 2022 nedávno dostala ISO/IEC 8652:2023(E), určitě je nejen v oblastech letectví, železnic, automobilů a třeba i ekonomie zajímavou volbou, uvidíme, kam se dostane Rust. Podobně jako u jiných jazyků vidím veselé kopírování, Adin nástroj Alire jako by z oka vypadl Cargu a jsem za něj opravdu vděčný, jen škoda, že GUI knihovny (Gnoga, GTK, komunitně QT) jsou slaběji podporované.
31. 10. 2023, 14:41 editováno autorem komentáře
Osobně Rust používám už ve druhé firmě pro vývoj mikroservis a je v něm radost vyvíjet :) Na Embedded si s ním zatím hraju jen pro nějaké ty domácí IoT experimenty.
A jako jo, když vidím že jsou Rust komunitní srazy snad v každém větším městě v Německu, o Londýně kde se odehrává RustNation ani nemluvě...
Fakt to něco minimálně v Praze a Brně chce.
Mimochodem, byl někdo odsud na EuroRust nebo RustNation? Připadala jsem si tam jako jediný člověk z CZ, ale třeba jsem ostatní minula :D
lifetime se mi taky nelibi.
kdyz mam v rustu smart pointery a delaji levny move, tak je mam treba do ukladaci struktury presunout/move a struktura ma vlastnit ten objekt.
vubec se mi nelibi, ze treba struktura uklada referenci s definovanym lifetime. nebo funkce co prijimaji reference ve funkci si reference nejak prekopiruji a vraceji zas reference viz. priklad z knihy, mi prijde hnusne.
tak kdyz dovnitr funkce pro porovnani poslu dve reference na stringy, tak nevim proc nemuzu jen vratit int s delkou textu.
treba upravim ten priklad z knihy a nepotrebuju lifetime.
fn longest(x: &str, y: &str) -> u8 {
if x.len() > y.len() {
1
} else {
2
}
}
fn main() {
let string1 = String::from("abcd");
let string2 = "xyz";
let result = longest(string1.as_str(), string2);
println!("The longest string is {}", result);
}
Docela dobrá rada pro nováčky co se rozbije u lifetimes kterou jsem slyšela od nějakého známějšího Rust vývojáře (Už si nepamatuju kdo): Kašli na to a klonuj co jde. I tak bude výsledek podstatně výkonnější než většina jazyků "shora", a dá to manévrovací prostor pro postupné učení se.
Já k tomu přišla z obou směrů (Předtím jsem dělala Python a C++) a lifetimes a borrow checker jsou zpočátku komplikované s pohledu obou, je to prostě unikátní koncept. Ale bez nich to holt nejde, respektive ne tak jak Rust potřebuje :) A ve chvíli kdy si na ty koncepty člověk zvykne jsou nějaké záseky spíš vzácné.
Nevím jak kolega, ale nás pro vývoj v Rustu používáme Visual Studio Code. Pokud vím, existuje nějaký plugin do Intellij a JetBrains má v preview RustRover https://www.jetbrains.com/rust/.
Mám už roky placený All Products Pack od Jetbrains, takže jsem začala s tím. (CLion + Rust plugin) Jednu dobu ale jejich plugin předběhli lidi co vyvíjí rust_analyzer (konkrétně v expanzi procedurálních maker), takže jsem dočasně přešla na VS Code - můj kód byl silně macro-heavy.
Teď už jsou na tom vlastnostma dost podobně a jsem zpátky u Jetbrains, tentokrát s RustRover.
Občas na rychlou úpravy zdrojáků použiju i Helix.
Zatiaľ nik nespomenul oblasť, kde sa Rust už ujal a má svetlú budúcnosť: crypto.
https://github.com/rust-in-blockchain/awesome-blockchain-rust
Keď chcete vytrieskať čo najviac transakcií, tak je zdá sa Rust ideálna voľba. Napr. nový projekt (mimochodom, oplatí sa tam investovať zopár forintov) Kaspa prepisuje svoj kód z Go do Rustu.
Stretol som sa s ním ešte v terminálových aplikáciách, tam začína byť tiež populárny. Podľa môjho názoru je tu vhodnejšia voľba Go, nie je tak náročný, má obrovské množstvo knižníc pre terminál a prípadný rozdiel v efektivite tu veľmi nehrá rolu.
Primysel a embedded nie je moja parketa; je tam ešte zopár zaujímavých konkurentov, ako nap. Zig.
Těch jazyků, co se snaží nahradit C++ je spousta (Nim, Zig, Hylo, Vale, Scala Native, Cone, ...).
Rust patří spíš mezi ty komplikovanější. A paradoxně řada velice oblíbených knihoven obsahuje unsafe kód, který nebyl formálně verifikován a teoreticky může způsobit problémy jako v C++ (někdy i prakticky - např. Unsoundness in owning_ref).
> Těch jazyků, co se snaží nahradit C++ je spousta (Nim, Zig, Hylo, Vale, Scala Native, Cone, ...).
Zrovna Scala Native (ostatní neznám) se sice kompiluje do nativního kódu, ale má GC. Takže mi přijde jako trochu jiná kategorie než
> A paradoxně řada velice oblíbených knihoven obsahuje unsafe kód, který nebyl formálně verifikován a teoreticky může způsobit problémy jako v C++
To platí i pro Python, Ruby, server-side JS a (od oka méně často) pro Javu. Akorát tam nejde o unsafe blok, ale o nativní kód v nějakém unsafe jazyce. Samozřejmě se bude lišit frekvence.
Ne, pointa je množství unsafe snížit na naprosto nutné minimum (i když programů které unsafe nemají vůbec je dost). Kontrolovat pár unsafe bloků na soundness je rozhodně snazší než kontrolovat kvůli tomu celý program včetně ne jedné, dvou, ale všech závislostí.
A opět, i Unsafe v Rustu je pořád bezpečnější než to samé v C++.
Nikdy nezapomenu na situaci, kdy se v C++ upstream jedné námi linkované knihovny rozhodl v nové verzi zahodit thread safety. Nikdo si toho nevšiml, kompilace na nové verzi debianu proběhla v pohodě, pak nám to v produkci začalo padat. Debugging byla opravdu radost. V Rustu se taková věc prostě nezkompiluje.
31. 10. 2023, 19:24 editováno autorem komentáře
Tak on v podstatě každý program používá nějaký unsafe kód. I hello world v libovolném jazyce. Někdy je unsafe skryt v kompilátoru, někdy ve standardní knihovně, často v obojím.
Tím nechci říct, že na tom nezáleží. Lze se snažit množství unsafe kódu redukovat, a ten, co zůstane, co nejlépe prověřit. A Rust oproti Cčku nabízí zajímavý posun.
Příklad je internování (třeba stringů nebo složitějších struktur).
Strukturu, která se používá vícekrát, nahradím indexem do tabulky. A tyto indexy chci třídit podle hodnot, na které odkazují.
> To už bych raději implementovala funkci jako "order_with" nebo podobně.
To bych klidně udělal. Jenže třeba BTreeMap, BTreeSet a BinaryHeap nedovolují takovou funkci použít. A musíte je znovu implmentovat. Viz crate copse
Něco takového? https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=770005eaed00475037695723393eec07
Dá se to ještě zlepšit dalším kontejnerem a hozením BTreeSet - u do inner + nějaké pocné funkce na tvorbu, ale… Nevidím problém?
Obskurní možná, ale měla 11 milionů stažení, což není málo. A kde je záruka, že to nedělají ostatní knihovny s unsafe kódem? Bohužel i změna v safe části může ovlivnit chování unsafe části programu. Takže teoreticky by se při každém commitu měl reviewovat celý projekt.
Hlavní prodejní heslo Rustu je bezpečnost. Přičemž řada oblíbených knihoven si nevystačí s bezpečnou podmnožinou jazyka.
> Jazyky, které nezískaly momentum a nemají rozumnou komunitu a podporu, ale nejde srovnávat s Rustem.
Záleží, co hraje roli pro konkrétní projekt. Třeba Nim i Zig se používají v produkci a mají k dispozici i dost C a C++ knihoven.
Osobně si nechávám přes cargo-geiger vypsat knihovny s unsafe a dvakrát si rozmýšlím jestli konkrétní knihovnu vůbec použít.
I tak se ale bavíme o knihovně s nějakými unsafe bloky, která pořád těží třeba z borrow-checkeru (ten unsafe nevyřadí) a které můžou být teoreticky unsound. A v případě problému je hned jasné kde hledat.
V porovnání s knihovnou v C/C++, kde může být unsound naprosto cokoliv a má podstatně větší prostor k chybě vývojáře.
> A v případě problému je hned jasné kde hledat.
Ne úplně. Příčinnou může být chyba v safe kódu. Například invariant, který by měl platit, ale neplatí.
Cituji Rustonomicon:
> This program is now unsound, Safe Rust can cause Undefined Behavior, and yet we only modified safe code. This is the fundamental problem of safety: it's non-local. The soundness of our unsafe operations necessarily depends on the state established by otherwise "safe" operations.
Co jsem se bavila s lidma z Ferrous systems a podobně, ono je třeba zavádějící koukat se na množství inzerátů. Třeba v Embedded je dost firem které Rust už začaly používat, ale žádná zajetá firma nenajme hned celý team rust devů - prostě najmou konzultanta a začnou školit stávající lidi.
Takže nejvíc nabídek je asi vidět ze strany startupů, kde se občas rozhodnou celý stack řešit na Rustu už od začátku (moje předchozí práce)
Mne se Rust taky libi. Na vetsinu novych jazyku se radsi ani nedivam, objevuji se tak rychle... Rust byl vyjimka a podival jsem se a libi se mne to. Nejsem si jistej jestli prekonam druhy krok lenosti a zacnu v tom neco psat. Mozna to bude u ostatnich taky tak, takze za par let se ukaze. V kazdym pripade vidim ze MS zacal prepisoval kod Windows a uz je to u v jadru linuxu, takze to vypada nadejne.
Nejhorsi smejd vsech smejdu ....
Jednak to neumi prelozit ani samo sebe (viz gentoo, stahuje to binarni kompilator aby to mohlo zkopilvoat kompilator ...)
Druhak to nefunguje na 5let starem HW (ja vim, patri do popelnice) protoze CPU neumi ubermegafrikulinskou featuru, bez ktere to prece nemuze byt.
A to vse jen proto, aby se prekompilovala jedina pythoni knihovna.
Povesit kazdeho kdo v tom napise jediny radek by bylo prilis milosrdne.
Něco děláš špatně. Počítač mám z února 2018, Rust mi jede jak z praku. Pak je asi chyba, že se snažíš přeložit kompilátor nebinárním kompilátorem. Když pominu, že normální uživatel Rustu používá rustup, chtěl bych podotknout, že zdroják kompilátoru se fakt nikdy sám nepřeloží, vždycky je potřeba ho přeložit kompilátorem binárním.
31. 10. 2023, 17:21 editováno autorem komentáře
Ano, měl by se objevit do pár týdnů/měsíců na YouTube na kanálu TechMeetup Ostrava (https://www.youtube.com/@techmeetupostrava).
Za mě je Rust super jazyk pro tvorbu GraphQL api nebo RPC. Hlavně z hlediska výkonu. Oproti skriptovacím jazykům (PHP, NodeJS/Javascript) je úplně jinde.
Oproti Go je taky výkonnější a to hlavně, protože má lepší správu paměti (nemá garbage collector). Co se týče syntaxe jazyka má blíž k skriptovacím jazykům. Go mi přijde, že má blíže k C++.
Pro GraphQL api používám kombinaci knihovny Actix-web (http server) a Juniper (GraphQL protokol). Líbí se mi, že http server běží ve více vláknech + v Rustu asynchronní programování je stejné jako v Javascriptu (jenom Promise se tam jmenuje Feature).
Mimo to v Rustu existuje frontendový framework Yew, který funguje stejně jako React. Jsou v něm funkcionální komponety, states, kotexty, pomocí maker je tam něco JSX, ... . Celý projekt se kompiluje do WebAssembly.
31. 10. 2023, 20:47 editováno autorem komentáře
V Rustu mi příjde, že je přehledněší typování (používá se dvojtečka) a v asynchroním programování používá await.
use tokio::time::{Duration, sleep}; use futures::future::join_all; #[tokio::main] async fn main() { let strings: Vec<&str> = vec!["apple", "banana", "cherry"]; let tasks = strings.iter().map(|&s| async_task1(s)); let results = join_all(tasks).await; // Zde můžete pracovat s výsledky úkolů for result in results { match result { Ok(res) => println!("Task result: {}", res), Err(err) => eprintln!("Task error: {}", err), } } } async fn async_task1(s: &str) -> Result<String, Box<dyn std::error::Error>> { // Simulace asynchronního úkolu sleep(Duration::from_secs(2)).await; let result = format!("Processed: {}", s); Ok(result) }
Zde je kód v Go:
package main import ( "fmt" "time" ) func asyncTask1(input string, ch chan string) { // Simulace asynchronního úkolu time.Sleep(2 * time.Second) result := "Processed: " + input ch <- result } func main() { strings := []string{"apple", "banana", "cherry"} ch := make(chan string) for _, s := range strings { go asyncTask1(s, ch) } results := make([]string, len(strings)) for i := 0; i < len(strings); i++ { result := <-ch results[i] = result } // Zde můžete pracovat s výsledky úkolů for _, result := range results { fmt.Println(result) } }
Zde je ještě pro porovnání Typescript, který má viditelně podobnější sytaxi k Rustu. Proto mi přijde jednoduší přechod z PHP nebo NodeJS do Rust než do Go.
async function asyncTask1(input: string): Promise<string> { // Simulace asynchronního úkolu await new Promise((resolve) => setTimeout(resolve, 2000)); // 2 sekundy return `Processed: ${input}`; } const strings: string[] = ["apple", "banana", "cherry"]; async function main() { const promises: Promise<string>[] = strings.map(async (s) => asyncTask1(s)); const results: string[] = await Promise.all(promises); // Zde můžete pracovat s výsledky úkolů results.forEach((result) => console.log(result)); } main();
Moje kratší zkušenost s Rustem je taková, že když už kompilátor konečně kód akceptuje a zkompiluje, program/změna obvykle na první pokus běží. S C/C++ obvykle bojuji, abych vychytal paměťové "pasti", do kterých vždy spadnu, a program nekolaboval. Takže z mého pohledu je Rust pro non-seasoned céčkaře přívětivější. Píše se mi v něm skoro jako v javě (až na hlídání borrowcheckeru), high-level struktury (mapy, množiny, atd.), funkcionální zápis ala javovské streamy, oproti javě užitečné návratové tuples. Vlastně featury javy v posledních letech (match/switch, var) míří stejným směrem, takže Rust byl ještě higher-level. A zkompilovaný výsledek běží daleko rychleji a úsporněji.
Další obrovská výhoda je z mého pohledu snadný vývoj i na windows. Jenom rozchodit kompletní kompilační chain pro C je pro linuxového občascéčkaře docela boj. Ve win Rustu stačí spustit binárku rustup, stáhnout windowsí Ideu a do ní (bohužel již deprecated) rustí plugin. A možná by si ten plugin i spustil rustup sám :-)
Dělal jsem WASAPI Exclusive JNI DLL pro javasound https://github.com/pavhofman/csjsound-wasapi a bez Rustu bych se do toho vůbec nepustil. V Rustu to šlo docela pohodlně, generování DLL byly dva řádky v Cargo.toml. Samozřejmě jsem poté postupně měsíce ladil problémy nahlášené uživateli, ale to se týkalo hlavně korektního volání API WASAPI a víceméně nesouviselo s Rustem, fungující základ (včetně komunikace mezi několika vlákny) byl hotový za pár dnů.
Jako ano, je to asi hlavně otázka úhlu pohledu. Třeba z hlediska správy paměti Go půjde do úplně jiné kategorie (spíše vedle Javy než C/C++/Rust). A Rust je dost specifický na úrovni kódu, ale za běhu odpovídá správa paměti C/C++.
Rust umožňuje dost low-level věcí, často ale (narozdíl od C a částečně i C++) se statickou kontrolou. A řekl bych, že Linusovi Torvaldsovi se Rust zdál blíž C než C++…
Pro mě rust moc složitej, hodně věcí se píše jinak a zejména hodně věci se píše stejně a dělá něco jiného.
Zatím zůstanu u C++. aktuálně začínám 23.
Souhlas, že C++ je ještě složitější, ale to proto, že má dlouhou historii. Niméně nováček se nemusí učit Céčko, aby začal C++. A už vůbec nedoporučuju učit se C++ chronologicky. Třeba s příchodem C++20 se velká část konceptů platných s C++11 stala obsolete. Tady jednoznačně vidím problém ve výuce. Je těžké učit něco, co se mění.
IIUC když omylem udělám move, znamená to dvě věci:
1. Na původním místě to již nemohu použít. To v zásadě nevadí, resp. pokud to vadí, kompilátor se ozve a odmítne to zkompilovat. (Myslím, že lint/linter se používá spíše pro program, který primárně hledá chyby/podivnosti, které kompilátorem projdou.)
2. Potenciálně dojde ke mělkému zkopírování na jiné místo v paměti. Většina struktur asi bude celkem malá (případné obří pole nebude nejspíš přímo součástí struktury, stejně typicky jeho velikost nevíme předem), takže dopad na výkon nebude příšerný. Takže hlavní bude si to ohlídat ve specifickém případě, kdy i mělká kopie bude drahá.
Tak operace move IIUC bez optimalizací znamená, že dojde ke kopii, a data na původním místě se již nemají používat. S optimalizacemi to může znamenat, že data zůstanou na původním místě, ale ne vždy je to korektní – pokud se na původním může paměť uvolnit příliš brzy (nebo nemůže, ale kompilátor si to nezvládne odvodit), je potřeba kopírovat.
Tady se imo rozchází terminologie.
Rust rozlišuje "Copy" (aplikovatelné pro typy u kterých se dá bezpečně udělat bitová kopie jako třeba primitivní typy) a "Clone".
Z pohledu Rustu C++ by default neprovádí Copy, ale Clone. Což je věc která se musí v Rustu dělat explicitně.
Jediná výjimka z "move everything" jsou právě proměnné implementující Copy, kde je možné poslat funkci kopii bez nějakého většího výkonnostního dopadu.
Jedna z výhod je, že Rust defaultuje k výkonnější variantě. Clone musí být explicitní a je víc vidět kde se duplikují data.
1. 11. 2023, 12:20 editováno autorem komentáře
Zrovna std::move() je v C++ docela bastl. Ono to udělá move jen v případě, že má objekt move construktor, není konstantní a nemá nějaké konstantní membery (respektive všechno v hierarchii dědičnosti musí být nekonstantní a mít move constructory). Jinak to tiše fallbackne na copy. Takže když vidím v C++ zdrojáku std::move(), nevím vlastně nic. Může to udělat move i copy. To má hodně daleko k dobrému řešení, je na tom hodně vidět, že move sémantika byla dolepená až v C++11.
Dokážu si představit rozumný scéář pro přesun konstantního objektu :
Dostanu nějaký objekt. U sebe ve funkci ho nechci měnit, jen číst. Takže dává smysl ho mít jako const, abych si ho náhodou neupravil.
A pak ho chci vrátit nebo poslat někam dál a už s ním nic dalšího nedělat. Tam zase dává smysl ho movnout.
A pak je tu problém, jestli nějaký typ dostane defaultní move, nebo jen copy. Když mám nějakého nepřesunutelného membera, tak se zbytek taky kopíruje, nebo se kopíruje jen to, co nejde přesunout? Přiznám se, že z hlavy nevím a smysl dávají obě možnosti. Takže je to další pravidlo k naučení.
1. 11. 2023, 13:29 editováno autorem komentáře
> U sebe ve funkci ho nechci měnit, jen číst. Takže dává smysl ho mít jako const, abych si ho náhodou neupravil.
Nikdo ti nebrání si to aliasovat na const ref a s tím pracovat, ale často se to nevidí (s výjimkou nějakých lambd)
Pokud ti vadí defaultní chování některých memberů, nadefinuj si u objektu vlastní move constructor a tam si zadefinuj způsob, jak se má objekt přesouvat a jak má naložit s konstantnímy membery. Nemusí pak kopírovat celý objekt, ale jen ty konstantní membery.
U některých objektů nelze kopírovat ani přesouvat, například std::mutex. Tam pak je nutné oba konstruktory napsat vlastní... nebo objekt vytvářet dynamicky a použít unique_ptr nebo shared_ptr.
Jasně že to umím obejít. A není to žádný zásadní problém. Ale jde mi o to, že čistý návrh by dával smysl trochu jinak.
Tím, že si vytvořím alias si nezavřu přístup k původnímu nekonstantnímu objektu. A stále na něj omylem můžu nějak hrábnout. Leda že bych udělal alias se stejným jménem v nějakém vnořeném bloku.
Problém s move je, že se používá hlavně k relokaci tj move+destroy. Relokace const objektu (ne const reference) je naprosto rozumná operace. Move, kdy mi vykuchané zbytky zůstávají pro nějaké pozdější použití, je vlastně dost obskurní věc, bez které bych se dokázal i obejít.
A spousta věcí je ještě lépe relokovatelná než jen movnutelná, třeba ten unique_ptr.
1. 11. 2023, 14:19 editováno autorem komentáře
No mně by se taky líbilo, kdybych nikdy nedělal chyby, ale žijeme v reálném světě. Programátor, který si myslí, že se celkem běžně nemýlí je nebezpečný sobě i okolí.
A že je move v současné podobě dost omezené si uvědomuje i dost lidí z c++ komise. Proto se snaží standardizovat tu relokaci, protože takový unique_ptr nebo vector relokujete pomocí jednoduchého memcpy, ale standardní move je nepříjemně složitější kvůli oddělené destrukci.
Taky moc nevím, jak udělat move v C++ lépe, protože je potřeba zachovat zpětnou kompatibilitu, takže move sémantika v C++ je takový kočkopes.
Rust tohle historické dědictví nemá a řeší to velmi elegantně. Move je default, pokud nezavolám explicitně clone(), provede se move a ne copy. Move je destructible, po přesunutí objektu původní objekt zaniká a nejde použít (hlídá to borrow checker). Move je možné udělat na všech objektech jako memcpy, v Rustu neexistuje objekt, který by move nepodporoval nebo se musel dělat nějak složitěji než pomocí memcpy. Takhle definovaný move hodně zjednodušuje práci překladači i vývojáři.
> Zeptám se tedy, kde ten objekt žije? Zřejmě žije asi na heapu. To ne vždycky chci.
V Rustu move nesouvisí se stackem nebo heapem. Je úplně jedno, jestli je objekt na stacku nebo heapu, protože ve chvíli, kdy můžu udělat move jako memcpy, můžu udělat move i mezi stackem a heapem a opačně. Samozřejmě do toho pak vstupuje lifetime objektů na stacku, ale to už je jiný koncept, to hlídá borrow checker.
V Rustu můžeš objekt vytvořit kde chceš, na stacku nebo heapu a libovolně dělat move mezi stackem a heapem. Myslím, že nejlépe to osvětlí příklad:
struct A { name: String, } fn main() { // Instance A na heapu let a_heap = Box::new(A{name: String::from("John")}); // Move A instance z heapu na stack let a_stack = *a_heap; // Vypise John println!("{}", a_stack.name); // Toto se nezkompiluje, protoze probehl destructive move: // error[E0382]: borrow of moved value: `*a_heap` println!("{}", a_heap.name); }
jen reaguju čistě na vás, jako že nejsem znalec Rustu
šlo mi o to, jestli Rusr při přesunu objektu pri volání funkce sám se rozhodne, kam objekt přesune jestli na stack nebo do heapu, nebo to má v rukou programátor? dokážu si představit funkci, která dostane parametr a s ním spustí vlákno kam přesune ten parametr, tedy opravdu se musí přesouvat, protože původní lokace objektu se stane neplatnou
pak to funguje jako v c++ a žádný benefit tam nevidím.
Benefity move sémantiky v Rustu oproti C++ jsou docela zásadní:
Move je default. Když chci udělat kopii, musím to explicitně napsat.
Nemusím psát move konstruktor, všechny objekty mají move implicitně (kromě primitivních typů jako integery, tam move nedává smysl).
Move je destructible, původní objekt po move přestává existovat a hlídá to borrow checker. Nejde udělat chybu přístupu k objektu po move, jako v C++.
Move je interně implementován jako memcpy, žádné volání kódu objektu, tudíž vyšší výkon.
Neexistují obezličky jako std::move u kterých nikdo pořádně neví, jestli to move opravdu udělá, nebo ne. V Rustu je move možný vždy. Jasná, jednoduchá a výkonná implementace, ne jako ten přílepek v C++.
Memcpy v Rustu je vždy OK. Rust nic relokovat nemusí, protože v Rustu nejde v objektu udělat vnitřní reference sám na sebe. Tím pádem ukazují všechny pointery ven z objektu a memcpy se používá na move všech objektů. Vývojář nemusí nic řešit, nemusí psát žádné move konstruktory, překladač má jednoduchou práci a nic rychlejšího než memcpy na move neexistuje.
Vnitřní objekt ve smysu, že referencuje něco ze svého potomka nebo jiný sub-objekt v rámci objektu? Tohle jsem nedělal a nemám to v plánu, považuji to za špatný design. Ale chápu, že se to někomu takový nápad třeba může líbit.
Pokud máš potřebu dělat takové věci, není Rust jazyk pro tebe a nevyužiješ jeho výhody. Je škoda, že se na to nedokážeš podívat s nadhledem a apriori odmítáš všechno, co je jinak než v C++. Zrovna C++ je spíš příklad toho, jak by se to nemělo dělat, spousta špatného designu hlavně z historických důvodů, protože museli zachovat zpětnou kompatibilitu. Move sémantika je toho dobrým příkladem, v Rustu je vyřešená o světelné roky lépe, než v C++.
Ty designy jsou překonané, hype OOP už naštěstí skončilo a dneska už se necpe všude. Rust na to jde jinak, nemá klasické OOP.
Starého psa novým kouskům nenaučíš, někdo prostě pokrok odmítá a zuby nehty se drž horších překonaných řešení. Bohužel to vede k horší kvalitě kódu s nižší bezpečností a výkonem.
5. 11. 2023, 00:11 editováno autorem komentáře
Nějaká motivace a existující implementace rozebírají v https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p1144r7.html
Ještě ten rozdíl move vs relokace komplikuje věci jako předávání unique_ptr registrem, ale do tohohle se ten paper nepouštěl. Tohle je separátní problém.
na to zda se udela opravdu move je nejlepsi jednoducha pomocna tabulka,
ktera rika co vyjde kdyz je parametr nejaky typ a co do nej leze.
a z tabulky je videt, ze se move udela jen v poslednim pripade kdy funkce bere && a leze do ni taky prava reference.
T& & ---> T&
T& && ---> T&
T&& & ---> T&
T&& && ---> T&&
found this :-)
//Hello. I want my own local copy of your Widget that I will manipulate,
//but I don't want my changes to affect the one you have. I may or may not
//hold onto it for later, but that's none of your business.
void foo(Widget w);
//Hello. I want to take your Widget and play with it. It may be in a
//different state than when you gave it to me, but it'll still be yours
//when I'm finished. Trust me!
void foo(Widget& w);
//Hello. Can I see that Widget of yours? I don't want to mess with it;
//I just want to check something out on it. Read that one value from it,
//or observe what state it's in. I won't touch it and I won't keep it.
void foo(const Widget& w);
//Hello. Ooh, I like that Widget you have. You're not going to use it
//anymore, are you? Please just give it to me. Thank you! It's my
//responsibility now, so don't worry about it anymore, m'kay?
void foo(Widget&& w);
Bacha, "void foo(Widget&& w);" ten widget movnout může a nemusí. Může zůstat nezměněný, nebo v nejakém neznámém ale validním stavu.
Překladač musí předpokládat, že ten objekt můžeš dál používat, stačí ho vyresetovat.
A žádné zodpovědnosti to programátora taky nezbavuje. Nemusím ho řešit jen pokud bych ho nemusel řešit ani kdybych žádné foo nevolal. Pokud ten widget potřeboval nějaký manuální úklid, tak ho musím uklidit tak jak tak. Protože foo ten move může řešit třeba tak, že mi do toho widgetu nasype vnitřnosti nějakého jiného starého widgetu.
A "template<typename T> void foo( T && t )" je překvapivě úplně jiná potvora. To může být kterákoliv verze, kromě té první.
A teď mi řekněte, jak tohle učit, aby človek nemusel vytírat zbytky vybuchlých hlav :D
Pokud je Widget normální typ, tak rozhodně ne. Pokud nemáte foo přetížené i pro normální reference, tak do toho lvalue ani nenacpete. Nezkompiluje se to.
Ta tabulka se používá jen u šablon, kde to && pak není rvalue reference ale říká se jí třeba "forwarding reference". Bez nějakého šablonového parametru nemáte odkud vzít druhou referenci ke spojení.
"template<typename T> void foo( T && t )"
tam není žádná věda, je třeba vidět, co je v T. Pokud je tam Obj &, pak funkce foo(Obj &) a pokud tam je Obj, pak foo(Obj &&).
Pokud volám tuto funkci a parametrem je proměnná, překladač za T dosadí referenci nebo const referenci. Pokud funkci volám s hodnotou, která vzniká jako dočasná instance, pak se za T dosadí přímo typ toho objektu, nebo může jít o návratovou hodnotu jiné funkce, i tam figuruje dočasná instance.
Ona rvalue reference se opravdu špatně chápe, ale přitom je to easy. Uvnitř funkce je to pořád reference a ta komunikace je pouze vně ve vztahu s volajícím. Rvalue reference pro volajícího znamená, že nesmí do parametru uvést lvalue referenci, tedy použít proměnnou jako parametr. Pokud tohle chce obejít, pak musí použít std::move(). a tím dává najevo, že proměnná ho od toho okamžiku nezajímá (jestli se přesune nebo ne je pak jiná věc, ale mě jako volajícího už nezajímá obsah a pokud se nepřesune, destruktor to vyčistí)
Pokud funkce nemá ani lvalue referenci, ani rvalue referenci, pak normálně konstruuju parametr konstruktorem. Ten mohu konstruovat jako kopii (copy constructor), nebo přesunem (move constructor) a to tak, že použiju std::move. Pokud objekt má move constructor, překladač ho upřednostní a tím je opět simulován přesun. Pokud ho nemá, použije se copy constructor. Pokud nemá ani copy constructor, dojde k chybě při překladu
Alex :
Ne, ta tabulka neříká, jestli se udělá move. Ta tabulka říká, jestli to co na první pohled vypadá jako rvalue reference je opravdu ona, nebo něco jiného. Je to jen jeden malý dílek z mozaiky.
A že je někde rvalue reference opravdu neznamená, že se ten move udělá. A jak psal ON, že nikde v dohledu nejsou žádné ampersandy neznamená, že se nemovuje. Ani std::move nemusí být někde v dohledu, stačí return nebo "foo( bar() )"
Jestli k tomu něco můžu, tak co jsem posbíral různě za nářky, tak lidi na Rustu nejvíc trápí/vadí/nesedí: makra, koncept lifetimes, atributy, nečitelnost syntaxe (což je různé, ale třeba proti Zigu je Rust opravdu dost nečitelný) no a klasicky ne-OOP :-)
1. 11. 2023, 17:09 editováno autorem komentáře
Nic ad hominem jsem tam nenapsal. Jenom to, že se chováš jako troll, ke každému článku o jazyku, který by snad někoho mohl zajímat, přicvakneš off topic vlákno o Leanu nebo Idrisu a ten jazyk, o kterém je článek, ideálně pomluvíš, aspoň náznakem.
A ten sock puppet samozřejmě byla taky poznámka o Tvém chování zde (dva účty v jedné diskusi). Nic k osobě.
Není k tomu asi moc co napsat, koukám, že ty jeho urážky smazali a s tím i můj komentář. Označuje trolí a sám stále trolí. Dle mého tu nikdo neuráží Rust ani jeho komunitu. Dokonce se tu sešli vývojáři v C++ a níže debatují. Nic proti nikomu.
Mě rozhodně nevadí, když se nesouhlasí, ale tyhle výkřiky nemám rád. Pak čeká že na to někdo bude reagovat a když nic nepřichází nasází někde osobní útok.
Popravdě, několikrát sem se tu chytnul, to se stává, ale někdy je třeba couvnout zpět. Jsme tu docela individua. Opravdu neznamená že někomu nemusím dát za pravdu, i když s ním v 90% času nesouhlasím.
Jinak co se čeká v diskuzi o jazyku s typovým systémem jako má Rust? Haskell, Idris, Lean se přeci nabízejí pro srovnání. A že se někdo objevuje v diskuzích, kde se o tom vždy zmíní spíš souvisí s tím, že ty diskuze jsou o tématu, které ho zajímá, což jsou zjevně tyhle jazyky.
Jako blbce ze sebe občas udělám, ale tak systematicky po někom jít je opravdu výkon.
Už to nebudu rozmazávat, vzhledem k tomu, že ty jeho příspěvky už jsou pasé.
2. 11. 2023, 13:31 editováno autorem komentáře
No, třeba Azure CTO na to má trochu jiný názor. A není to jen planý výkřik - microsoft přepisuje core libraries do Rustu.
Google by k tomu taky měl co říct.
Vivo teď ohlásili nový OS napsaný v Rustu.
Jako, vidím tu v diskuzi samé komentáře jak je Rust hype, ale který z dalších hype jazyků prorazil takhle hluboko do velkých firem a skutečně začal nahrazovat C/C++?
[Kate]
Zadny. Aspon ja to tak vidim. Podle mych informaci* C++ za posledni rok spis roste a drzi se mezi nejpouzivanejsimi jazyky (C, C++, Java, PHP, atd..).
Me spis napada jina otazka: A potrbujeme vubec nahradu za C++? Ja se spis obavam, zda nebudem za chvilu zachranovat samotne puvodni paradigma C++. Protoze jak uz tu kdysi zaznelo i od zkusenejsich kolegu, C++ uz zacina pomalu byt uplne jiny jazyk (a po nedavnem predstaveni B. Stroustrupa* jeho uvah o tom, kam by se tento jazyk mel ubirat, to citim jeste nalehaveji) ... Velke stesti, ze C++ zustava zpetne kompatibilni i ze starymi specifikacemi. Takze to asi nebude hned nutne. Zatim...
*omluvam se ze to nepodkladam odkazem - musel bych jej hledat na mobilu, ale v pripade velkeho a vazneho zajmu se pokusim...
2. 11. 2023, 19:14 editováno autorem komentáře
S ohledem na to, kolik průšvihů s dost nepříjemnými následky už způsobily memory related chyby a s tím jak je Rust řeší (viz odkaz od Google), řekla bych že ano.
Ano, C++ se mění k nepoznání - z jedné strany ty změny chápu (Třeba snaha o nějakou memory safety ve formě smart pointerů), z druhé strany mi přijde že se do toho jazyku snaží nacpat jakoukoliv moderní věc co proletí kolem a je z toho „pejsek a kočička vařily dort“.
Jenže to první to nespasí - garance jsou mnohem slabší a "insecure by default" prostě pořád vede k chybám.
C++ má obrovskou setrvačnost. Ale čím dál tím častěji vidím u lidí i ve firmách úvahy na téma „OK, začínáme nový projekt, má smysl začít používat Rust?“ - viz MS, Google, Vivo. Všechny ty projekty by byly (Nebo opravdu byly) původně v C++.
Další místo kde vidím že se prosazuje dost slušně je právě webový backend, kde se začíná prát s Go. Zvlášť ve chvíli kdy je důležitá efektivita. https://hackernoon.com/how-using-aws-lambda-with-rust-saved-3x-the-cost-compared-to-using-python-or-net
Zrovna jsem dopsala jednoduchou microservice která řeší nginx forward outh pro OIDC. Celý kontejner zabírá 26 MB, při běhu je skoro pod rozlišovací schopnosti process monitoru.
Promiňte ale ten odkaz, to je přeci úplně zavádějící. Já Vám mohu nasdílet zase odkazy jak odchod z AWS nám ušetřil miliony. Jestli to bylo v Rustu nebo Pythonu je jedno. Já klidně budu psát v Rustu, dokonce i v Javě, když mne za to někdo bude platit a bude to intelektuálně zajímavé, ale takhle tlačit technologii mi přijde dětinské nebo lépe řečeno ideologické.
(Nicméně obdivuju jaké máte zaujetí, dokonce myslím, že jste mnohem vzdělanější než já, ale pochopte také nás přízemní dělníky :D)
Třeba APL je memory safe, to bych tlačil já ;)
2. 11. 2023, 20:02 editováno autorem komentáře
Tak každý jazyk má nadšence. Go, Python, JS... A zvlášť s tím jak se na jedné straně zvyšuje výkon a na druhé straně snižuje komplikovanost, je vidět slušné přesahy na jednu i na druhou stranu v doménách kde je ty technologie vidět. Python a Java na MCU, low level programovací jazyky na webu.
Osobně jsem se Rust začala učit v době kdy vycházel článek na Rootu, a ukázalo se to pro mě jako něco co mě opravdu baví a vyřešilo mi to spoustu problémů které mě na jiných technologiích štvaly. A teď to i relativně slušně vydělává :)
2. 11. 2023, 20:17 editováno autorem komentáře
"Osobně jsem se Rust začala učit v době kdy vycházel článek na Rootu".
Já bohužel také, příliš brzy :D V mé doméně to ale prostě bude minoritní jazyk i kdyby se prosadil sebevíce. Tak já si o víkendu otevřu, vedle Leanu, zapomenuté přiklady v Rustu :D. Pěkný večer.
2. 11. 2023, 20:30 editováno autorem komentáře
[BoneFlute]
A to je presne ono.
Pojem "moderni jazyk" je neco za co se da schovat uplne vsechno. Z mnoha diskuzi se ta fraze da prekladat napr. takto : "Sice presne nevim, co by to melo byt, ale musi to byt neco jineho, protoze to stavajici bytostne nesnasim, uz proto ze me do toho ti stari brontosauri nutili...." Nebo: "Musi se to ucit, premyslet u toho, vyvijet mentalni aktivita, a to je prace a to dneska uz absolutne neni IN." Nebo take: "Hlavne at je to klikaci a barevne!" Atpd.... Tedy vzor 'moderni .*' povazuji za dost neurcity pojem (tedy - pokud nejsi modni navrhar, popr. krejci/svadlena).
Souhlasim s tim, ze jsou situace, na ktere je nejaky konkretni jazyk vhodnejsi vic nez jiny. Kdyby jsi si mohl vybrat: V BASHi muzes vytvorit program pro spravu telefonich kontaktu. V Lue nepochybne take. V Jave take. Presto typuji ze hrabnete spis po Jave. Vidis - a ja bych uvazoval jako prvni o Lue.
Lopata - existuje spousta lopat. S kratsi, ci delsi nasadou, s operkou, naslapnikem, siroke, uzke, kovove, plastove... Vsechno je to lopata, kazda ma sve plusy a minusy a kazdemu cloveku se bude hodit jina a to casto i pro stejny typ cinnosti. Programovaci jazyk neni vice ani mene nez lopata programatora. Co je na co vhodne je dano mnoha faktory, vcetne povahy projektu, zadani, osobnich preferencich, a v neposledni rade hloubce znalosti daneho jazyka. A podle me takove generalizovani je uplne trochu nicem.
A tim se vracim ke sve otazce. Potrebujem v soucasne dobe nahradu za C++? Ja myslim, ze ne. Jazyku je obrovska spusta, presto C++ se drzi leta na prednich prickach oblibenosti. Nahrady uz jsou, a tam kde to vyvojari povazovali za ruzemne je uz pouzili. V ostanich pripadech jej z ruznych duvodu povazovali za rozumnou volbu.
> Potrebujem v soucasne dobe nahradu za C++?
Je tu filozofická otázka, co vlastně znamená náhrada za C++. C++ se uplatnilo v nějakých oblastech, ale v každé oblasti může mít potenciálně jinou náhradu. Někde to může být Java, někde Go, někde Rust. A někde zatím z různých důvodů vhodnou náhradu nemusí mít.
[Vít Šesták]
Jiste, to je pravda. Jen se zapomina faktor casu.
Setrvala pozice C++ v desitce nejoblibenejsich jazyku doklada, ze to nebude jen "nekde". A kdyz se podivame na soucasnou pozici treba Rustu a C++ a k tomu vezmu v uvahu jak dlouho tu ten jazyk je (a hype jaky kolem nej jeho komunita dela), pak se mi zda, ze bud na to jdou od zakladu spatne a nebo proste je zajem o nahradu za C++ celkem maly.
To je počet PRs, takže zahrnuje stávající projekty. Na tu otázku spíš odpovídá https://octoverse.github.com/2022/top-programming-languages
jen by mě zajímala metodika a data, Github tam moc sdílně nevypadá.
https://www.statista.com/statistics/793628/worldwide-developer-survey-most-used-languages/ kreslí taky zajímavá čísla, ale za zdroje se mi platit úplně nechce.
[Kate]
Jasne, asi to neni uplne presne to na co se Vit ptal (nic lepsiho jsem po ruce nemel), ale zas na druhou stranu vychazim z toho ze PRs mas jak do novych tak do stavajicich projektu. I tak z tech dat od tebe vsude vidim C++ v prvni desitce. A minimalne jak muj, tak i tvuj prvni odkaz ukazuje na rostouci tendence u C++. Myslim, ze to lze jen tezko svest na pouhou udrzbou starych projektu - viz to moje upozorneni na faktor casu.
Předpokládám že to navíc bude ukazovat počet PR do projektu podle detekovaného jazyka projektu, což vede k paradoxům kdy třeba aktuálně probíhající přepis Fish shellu do Rustu počítá jako C++ :) To samé ze strany Pythonu matrix server Synapse, kde se do Rustu přepisují výkonově náročné části kódu, Python si s Rustem rozumí velmi dobře.
Pokud je ten můj první odkaz braný z nových repozitářů, byl by to lepší ukazatel.
3. 11. 2023, 08:45 editováno autorem komentáře
Zkus se zeptat Fabiana https://github.com/faho (případně na Mastodonu @faho@octodon.social)
[Vít Šesták & Kate]
Ano to chapu, ale i kdyz vezmu v uvahu vase argumenty, jsem naprosto presvedceny, ze pokud by upadal zajem o dany jazyk - v nasem pripade C++, pak by jsme nutne museli pozorovat sestupnou tendenci behem let. V horizontu roku by nutne musely mit ty grafy drive ci pozdeji nezadrzitelnou a vyznamnou sestupnou tendenci. Podle me by prubeh oblibenosti jazyka mel mit vicemene hyperbolicky prubeh v case (setrvacnost). Nove projekty v danem jazyce by vznikaly v cim dal mensi mire. Mnoho dalsich by postupne upadalo v zapomeni, protoze by byly nahrazovany novymi (ci prepisovany), nebo by proste zastaravali. Nutne se to musi projevit i celkovem poctu PR do daneho jazyka. Ano to co pisete, by ten sesup krivky zadrzovalo, to ano, nemyslim, ze by to melo silu ten pad dlouhodobe zadrzet. Spis to ovlivni a zakulati tvar te krivky prubehu.
Jenze my tu zatim zadny vyznamny (radove v rocich) setrvaly upadek C++ nepozorujeme (a na druhou stranu ani stejne tak nepozrujeme nijak vyznamy vzestup Rustu - jakozto jazyka, ktery si klade za cil C++ nahradit). A rekl bych ze i grafy od Kate to vicemene podporuji.
10 let je v IT cely eon a ja z tech grafu vidim, ze pokud uz zajem o C++ vylozene nestoupa, pak je s relativne malymi vychylkami stabilni na vysoke urovni. :-)
3. 11. 2023, 11:04 editováno autorem komentáře
Zrovna tabulka "Growth in programming languages 2021 - 2022"
Additionally, Rust saw a more than 50% increase in its community, driven in part by its security and reliability. And Python continued to see gains in its usage across GitHub with a 22.5% year-over-year increase driven, in part, by its utility in data science and machine learning.
C v té tabulce je (to by vysvětlil rostoucí zájem o embedded), C++ chybí.
Celkem nečekám že by někdo začal přepisovat stávající obří C / C++ projekty. V jednom z mých bývalých zaméstnání jsme měli v C++ celý webový backend, tuna starého kódu, a fakt si nedovedu představit že by někdo v brzké době investoval čas a peníze do rewrite. Je to performance critical kód, Go nebo Rust by tomu slušely, někdo tehdy navrhoval i Clojure, což by taky byla zajímavá volba, ale ten čas prostě nikdo nezaplatí. Tak se šlo cestou postupných vylepšování toho co je.
S přibývajícím množstvím vývojářů a nutností udržovat stávající projekty bude zákonitě počet C++ vývojářů přinejhorším stagnovat, nejspíš pozvolna růst. Nikdo nečeká že C++ zanikne. Vždyť se drží i jiné jazyky, které měly historicky mnohem menší podíl. (Object Pascal, Visual Basic…). Pochybuju že by mnoho lidí volilo Object Pascal pro novou desktop app, ale zároveň pochybuju že Ghisler přepíše Total Commander třeba do Pythonu.
Co je místy vidět jsou přepisy dílčích knihoven (Windows, Curl přidávající možnost používat Rustí http / TLS knihovny jako backend, Android) a kód v nových OS (Fuchsia, Vivo BlueOS)
Zajímavý je zároveň pohled na GTK / Gnome ekosystém, kde je Rust celkem běžná volba pro nové aplikace.
[Kate]
Ale, prosim te...
50% narust bez uvedeni kontextu vsech ostatnich vyznamnych jazyku muze klidne znamenat, ze ke vsem ctyrem stavajicim projektum pribyli dva nove (kdyz to trochu prezenu). Podobne statisticke ukazatele pouzivalo PR oddeleni ODS, aby presvedcilo sve volice jak skvele si ODS vede. Jenze to byla fabulace a skutecnost byla pohledem obecnejsich statistik diametralne odlisna.
Samotny Rust se nedostal do prvni desitky ani v jednom z tech grafu a jediny graf co mame v teto diskuzi momentalne k dispozici, kde lze urcovat v kontextu ostanich jazyku je ten Gihub2, kde se nacahzi nekde na spodu prvnich 20 oblibenych jazyku a jen velmi mirne a pozvolna roste aspon podle PR
Ja jsem ve svem predchozim prispevku ani v nejmensim nenaznacil jakoukoliv predikci, kde by jazyk C++ mel skoncit ve svem pripadnem padu v oblibenosti. Natoz vubec zaniknout. Naopak predpokladam, ze by graf znazornujici jeho oblibenost mel mit hyperbolicky tvar. Jak znamo Hyperbola jde od nekonecna do nekonecna. Osobne predpokladam, ze by to vypadalo takto: bude v nejakem bode zacinat a prudce klesat, postupne se bude pad zpomalovat a nakonec se ustali nekde na spodu prvni dvacitky oblibenych jazyku - coz maji prave na svedomi projekty ktere bude (lhostejno z jakeho duvodu) nutno udrzovat a nadsenci. Mohu se samozrejme zmylit v rychlosti padu oblibenosti, a pak se bude tvar krivky mene strmy. V kazdem pripade to nebude (s privrenim oci) rovna primka vicemene soubezna s casovou osou.
Ja osobne si vubec netroufam rict, jak velky vliv by na to vsechno mohl mit stoupajici pocet vyvojaru, jednak na to nemam relevantni data a jednak tusim, ze to rozlozeni novych sil bude silne nelinearni a tezko predikovatelne. Klidne tak muzeme vysvetlovat treba ten zajem o Go, nebo JavaScript (zrona webove zazivaji velky boom, takze se da predpokladat, ze se budou nove sily soustredit hodne tam)
[Kate]
Musim se omluvit za jeden svuj omyl.
Nevim jak, ale nejak mi uniklo, ze ty statisky oblibenosti co jsi postovala zobrazuji vic pozic, vsiml jsem si toho az ted.
Kde mezi C++ a Rustem je nejakych 8% rozdil. Jenze mi to nesedi pak s temi PR.
Asi ma nakonec pravdu Churchill :(
3. 11. 2023, 15:10 editováno autorem komentáře
Já si myslím, že vzestup Rustu je docela na začátku.
Stáří Rustu – otázka úhlu pohledu. Začátky lze sledovat již v roce 2006, oficiální oznámení 2010, verze 1.0 až v roce 2015.
Rychlost adopce – ono dost záleží. Teoreticky jazyku stačí kompilátor, prakticky se hodí vývojářské nástroje a knihovny. V případě knihoven jednak záleží na oblasti použití a jednak na tom, jak moc je ten jazyk schopen využít knihovny z jiného jazyka, což může usnadnit nástup. Například Kotlin/JVM má celkem dobrou interoperabilitu a Javou (chybí tam hlavně informace o nullability, ale i s tím lze pracovat), takže lze použít Javové knihovny. V Rustu patrně půjde použít Cčkové knihovny, ale prakticky to znamená nejspíš napsat wrapper, který pořeší lifetimes, safety apod. To plyne z návrhu jazyka. Ano, šlo by ten jazyk udělat konzervativněji, aby lépe interoperoval s C nebo C++, ale tím by se vytratily i výhody.
Potkal jsem různé vznikající jazyky. Mnoho z nich umělo skvělé věci. Chvilku jsem se jim věnoval - ale opatrně: Napíšu v tom něco zajímavějšího a rozsáhlejšího, a co budu dělat, když autor ten jazyk zařízne? A taky že jo.
A ona je to spojitá nádoba. Jazyk potřebuje adoptery, kteří ten jazyk podpoří tím, že ho budou používat. Jenže vývojáři se bojí používat jazyk, který nemá slibnou budoucnost.
Dle mého odhadu, tuto fázi má Rust úspěšně za sebou. Dokonce snad má za sebou i fázi, řekněme, "jazyka na okraji zájmu", kam třeba patří Haskell, Idris, Crystal, D, etc.
Řekl bych, že je dostatečně zabydlen. A nyní záleží jak moc velký koláč si urve. Což je ale zase na druhou stranu otázka, jestli mě to trápí. Maximálně když bych sháněl vývojáře.
Moderní jazyk já osobně chápu tak, že vznikl v (poměrně) nedávné době a jeho tvůrci se ze všech sil snažili ho navrhnout s využitím zkušeností z předchozích jazyků. Opakem jsou jazyky, kde se ty zkušenosti už aplikovat nedají a když ano, tak ten jazyk stejně pořád nese s sebou překonané způsoby fungování a jazyk bobtná a bobtná. Jazyk C++ při nejlepší snaze za moderní označovat nelze, protože to je 10 jazyků v jednom. Bude expandovat? Nemyslím si. Bude v něm pořád dost obživy? Nejspíš ano - pro generace, které na Root chodí, určitě.
3. 11. 2023, 06:51 editováno autorem komentáře
[Ink]
Ano, i tak to da definovat.
Jenze na to se da taky kontrovat, ze uplne vse z toho co kritizujes na "nemodernich" jazycich a naopak zase vyzdvihujes na tech novodobych lze vzdycky dosahnout nejakym zpusobem i u te opacne skupiny. A spousta lidi tak trochu ignoruje, ze zastanci te druhe katyegorie to taky dost casto rikaji. Jinymi slovy kvalitni projekt i naprosty smejd jsi schopen udelat v jakemkoliv jazyce, vzdycky v prve rade zalezi na lidech, kteri na tom projektu pracuji, jak a za jakych podminek k nemu pristupuji.
S tim nic neudelaji ani ty nejdumyslnejsi technologie, zabudovane do daneho jazyka. Navic, je mohou nekteri uzivatele takovehoi jazyka povazovat za omezujici a zbytecny bastl. Ani to, ze autor jazyka vezme ze vsech moznych dneska existujicich jazyku to o cem je presvedcen, ze je to to nejuzitecnejsi, co dosavadni svet programovacich jazyku nabidnul, narve tam jeste neco svyho a voala - mame tu zachranu vsech problemu sveta. Nemame, bohuzel naopak, vetsinou vznikne kockopes, ktery je sam moloch, interne pouziva jiz nejaky existujici jazyk, blbe se uci a chyby mu ... no jak bych tak rekl, urcita konzistence. Krasny priklad je prave Rust ci Vala.
Mimochodem, jen na okraj, tahle diskuze mi hodne pripomina prvni dve povidky T. Prattcheta Barva kouzel a Magicke Fantasticno. Tam taky presne na tehle bazi, probihal odveky, vlekly a nikam nevedouci spor o konceptu magie mezi starou a mladou generaci magu :)
3. 11. 2023, 11:41 editováno autorem komentáře
lze vzdycky dosahnout nejakym zpusobem i u te opacne skupiny
Však tohle by bylo super! Memory safe a garantovaně thread safe C / C++ kód by byla skvělá věc! Jen to prostě už z principu designu jazyka nejde. Ve chvíli kdy by to začal řešit, bude muset zahodit zpětnou kompatibilitu a začne se chovat jako Rust. A to že jde částečně některých vlastností dosáhnout přidáním spousty kódu navíc nepovažuju za řešení. Systém který nemá security by default není secure - což třeba ukazují statistiky chyb v kódu Androidu.
Jinak zrovna konzistentní chování a útěk od molochu byl pro mě důvod vyměnit C++ za Rust :D
(A jako mladá generace mágů si moc nepřipadám, začala jsem programovat na osmibitech)
[Kate]
Nechci zabrednout do uz stokrat omletych hadek, uz jen proto ze sam nemam vlakna rad a navic je povazuji za naduzivanou vec.
Zkusme to jinak. Co myslis, kdo je vlastne ze zakladu zodpovedny za vznik memory leaku? Podle me jsou jen dve moznosti: vykonavany kod (tedy kompilator, interpreter, proste dany jazyk), nebo nevhodne pouzite instrikuce jazyka (tedy ... navrh/programator, proste clovek)?
Oba? Lidská chyba je nejběžnější zdroj chyb v jakémkoliv systému. Design systému tak aby lidským chybám předcházel je esenciální prakticky kdekoliv kde je bezpečnost braná vážně.
(Mimochodem, memory leak je možný snad s každým paměťovým modelem, můžu třeba cachovat do hashmapy a zapomenout mazat záznamy. Bavíme se spíš o zábavách jako use after free, buffer overflow, z null pointer dereference, problémech s thread safety…)
A pak, pokud to necháš čistě na lidech, budeš dělat kompletní audit každé knihovny po každém update? Budeš znova kontrolovat každou funkci která mohla být safe v původním kontextu, ale v novém už není?
Už jsem tu zmínila zábavnou příhodu kdy upstream knihovna přestala být thread safe a nikdo si toho nevšiml. Tohle se hlídá fakt blbě. To samé memory safety. Opt-in safety prostě nefunguje. Opt-out naopak umožňuje izolovat místa kde může k problému dojít.
Teorie že „Dobrý programátor nebude dělat chyby“ je sice pěkná, ale skutečnost tomu neodpovídá a nikdy neodpovídala. Statistiky od Google to ukazují fakt dobře, to samé statistiky od Mozilly. Naopak, osobně se raději kódu kohokoliv kdo mi bude sebejistě tvrdit že jeho C / C++ kód je zaručeně safe vyhnu.
Zodpovědný? Stroj. Protože lidi jsou neschopní.
Delší verze: Rozhodnutí jak to udělat se musí v každé situaci. Rozdíl je v tom, jestli to rozhodnutí bude dělat:
1/ Každý vývojář extra s různým skillem a možná s reviewerem.
2/ Autoři jazyka, kteřý zobecní všechno možné, a ti autoři obvykle bejvají z těch lepších, a navíc mají nad sebou bič v mnoha dalších vývojářích, kteří jim to dál kritizují.
ad moderní jazyk: Ano, je to zkratka. Ale já si pod tím představuju cokoliv, co mi usnadní život.
- traity
- pattern matching, destructuring assignment
- enum s hodnotou (nevím jak se tomu říká, jen vím, že to má Haskell a Rust, a nemá žádný mainstraimový jazyk a já to strašně rád.)
- silný jazyk, který mě bude hlídat
- a další
To jsou všechno věci, které chci protože je umím masivně použít a opírám se o ně.
Můj základní bod zlomu, kdy jsem nad C/C++ zlomil lopatu jsi vyjádřil větou:
> "Musi se to ucit, premyslet u toho, vyvijet mentalni aktivita, a to je prace a to dneska uz absolutne neni IN."
U C/C++ stejně jako u Rust musíš přemýšlet. (V Rustu možná dokonce víc.) Rozdíl je v tom, co za tu námahu dostaneš. Když jsem si toto uvědomil, C/C++ umřel.
Ne, ne, a ne. C/C++ tu měl svůj význam. Protože nebyly jazyky, které by ho mohli plně nahradit. Každý z nich (Java/C#, Lua, Python) měl nějakou daň, kterou jsi musel zaplatit za benefity, které to proti C/C++ přineslo. Rust tohle zlomil.
(Tady se omlouvám všem jazykům, které neměli to štěstí a nedosáhli správného hype.)
ad Java/Lua - tipuješ špatně. Hrábnul bych po Lue. O Javě bych vůbec neuvažoval. Java je na vydělávání peněz.
Rust je jazyk, který hodně chce a hodně za to dává. Naučit se ho je dost náročné a nekomfortní. Kdo ho ale rozumně ovládne, často si ho zamiluje, v žebříčcích oblíbenosti boduje: https://survey.stackoverflow.co/2023/#section-admired-and-desired-programming-scripting-and-markup-languages
Je jasné, že pokud je někdo spokojený a naskillovaný třeba v C++ nebo Javě, po přechodu toužit nemusí, dtto Python, i když tam je PyO3 docela fajn volba. Otázkou samozřejmě je, jak k němu přistupují firmy, ale Google, FB, Amazon, Microsoft, Discord atd. jsou docela dobré příklady, že o Rust zájem je.
Odhliadnuc od toho, ze Rust je v porovnani s inymi jazykmi o dost tazsie naucitelny jazyk, prisiel aj v nespravnom case, ked su stale k dipozicii ine velmi dobre etablovane jazyky.
Myslim, ze ten jazyk sa moc v praxi neuplatni. Teraz je tam sice nejake nadsenie, ale casom to zanikne.
Je to podobny pribeh ako Ruby vs Python a Perl, alebo PL/I vs Fortran a COBOL - pozri: https://cacm.acm.org/blogs/blog-cacm/274388-lessons-from-pl-i-a-most-ambitious-programming-language/fulltext
Měla jsem známého co v té době v PHP psal commandline tooly :)
Jinak je na té době docela vidět jakou mají některé technologie setrvačnost. Delphi byla celkem běžná volba pro snadný vývoj desktopových aplikací, a díky tomu se tak nějak drží doteď. Zajímalo by mě kolik lidí tu pamatuje Borland Kylix :D
Proč by PHP nešlo použít na desktopové aplikace? Existuje pro něj Gtk, různé další knihovny, jenom holt ten jazyk "prohrál". Podobně jako Perl a to CPAN byl jednu dobu opravdu úctyhodná studnice knihoven. Jestli ho "nikdo nechtěl", to neumím říct - já bych v Perlu nedělal ani za zlatý prase, ale lidi mají různé preference. Vysvětluju si to tak, že Python měl vizi a dostatek lidí, kteří jí věřili.