Kas yra „Rust“ ir kodėl jis toks populiarus?
Ketverius metus iš eilės „Rust“ buvo mylimiausia „Stack Overflow“ kalba, rodanti, kad daugelis tų, kurie turėjo galimybę naudoti „Rust“, ją pamilo. Tačiau maždaug 97% apklausos respondentų, kurie nenaudojo „Rust“, gali susimąstyti: „Kas yra su„ Rust “?“
Trumpas atsakymas yra tas, kad Rust išsprendžia skausmo taškus, esančius daugeliu kitų kalbų, suteikdamas tvirtą žingsnį į priekį su ribotu neigiamų pusių skaičiumi.
Parodysiu, ką „Rust“ siūlo kitų programavimo kalbų vartotojams ir kaip atrodo dabartinė ekosistema. Tai ne visos Rust-land rožės, todėl kalbu ir apie minusus.
Kilęs iš dinamiškai surinktų kalbų
Argumentai tarp programuotojų, kurie teikia pirmenybę dinaminio, o ne statinio tipo sistemoms, greičiausiai išliks dar kelis dešimtmečius, tačiau sunku ginčytis dėl statinių tipų pranašumų. Jums tereikia pažvelgti į tokių kalbų kaip „TypeScript“ ar tokių funkcijų kaip „Python“ tipo patarimai populiarėjimą, nes žmonės nusivylė dabartine dinaminio spausdinimo būsena šiandien didesnėse kodų bazėse. Statinio tipo kalbos leidžia sudarytojui patikrinti duomenų ir jų elgesio apribojimus, palengvinti kognityvines pridėtines išlaidas ir nesusipratimus.
Tai nereiškia, kad visos statinio tipo sistemos yra lygiavertės. Daugelyje statiškai įvestų kalbų šalia yra didelė žvaigždutė: jos leidžia vartoti sąvoką NULL
. Tai reiškia, kad bet kokia vertė gali būti tai, ką ji sako ar nieko, efektyviai sukuriant antrą galimą kiekvieno tipo tipą. Kaip ir „Haskell“ bei kai kurios kitos šiuolaikinės programavimo kalbos, „Rust“ šią galimybę užkoduoja naudodama neprivalomas tipas, o kompiliatorius reikalauja, kad jūs tvarkytumėte None
atveju. Tai užkerta kelią baimės įvykiams TypeError: Cannot read property 'foo' of null
vykdymo laiko klaida (arba kalbos atitikmuo), vietoj to, kad ją sukurtumėte į kompiliavimo laiko klaidą, kurią galite išspręsti, kol vartotojas niekada nematys. Štai pavyzdys, kaip pasveikinti ką nors, nesvarbu, ar žinome jo vardą; jei būtume pamiršę None
byloje match
ar bandė naudoti name
tarsi tai būtų visada esanti String
vertės, skųs kompiliatorius.
fn greet_user(name: Option<String>) {
match name {
Some(name) => println!("Hello there, {}!", name),
None => println!("Well howdy, stranger!"),
}
}
Statinis „Rust“ spausdinimas daro viską, kad išvengtų programuotojo kelio, tuo pačiu skatindamas ilgalaikę priežiūrą. Kai kurios statiškai įvestos kalbos programuotojui uždeda didelę naštą ir reikalauja, kad jis kelis kartus pakartotų kintamojo tipą, o tai trukdo įskaitomumui ir pertvarkymui. Kitos statinio tipo kalbos leidžia daryti išvadą apie visos programos tipą. Nors tai patogu pradinio kūrimo metu, tai sumažina kompiliatoriaus galimybę pateikti naudingos informacijos apie klaidas, kai tipai nebeatitinka. Rūdis mokosi iš abiejų šių stilių ir reikalauja, kad aukščiausio lygio elementai, pvz., Funkcijų argumentai ir konstantos, turėtų aiškius tipus, tuo pačiu leidžiantys daryti išvadas funkcijos kūnuose. Šiame pavyzdyje Rust kompiliatorius gali padaryti išvadą apie tipą twice
, 2
ir 1
nes val
parametras ir grąžinimo tipas yra deklaruojami kaip 32 bitų pasirašyti sveikieji skaičiai.
fn simple_math(val: i32) -> i32 {
let twice = val * 2;
twice - 1
}
Kilęs iš šiukšlių surinktų kalbų
Vienas didžiausių sistemos programavimo kalbos naudojimo pranašumų yra galimybė kontroliuoti žemo lygio detales.
„Rust“ suteikia galimybę pasirinkti kaupti duomenis rietuvėje ar kaupe ir kompiliavimo metu nustato, kada nebereikia atminties ir ją galima išvalyti. Tai leidžia efektyviai naudoti atmintį ir daugiau prieigos prie atminties. Ankstyvasis „Rust“ savo „Skylight“ produkcijos vartotojas Tilde nustatė, kad sugebėjo sumažinti atminties naudojimą nuo 5GiB iki 50MiB, perrašydamas tam tikrus „Java“ HTTP galinius taškus į idiomatinę „Rust“. Tokios santaupos greitai padidėja, kai debesų tiekėjai ima aukščiausios kainos už padidėjusią atmintį ar papildomus mazgus.
Nereikia nuolat dirbti šiukšlių surinkėjo, „Rust“ projektai yra tinkami naudoti kaip bibliotekos kitose programavimo kalbose per užsienio funkcines sąsajas. Tai leidžia esamiems projektams pakeisti našumui svarbius elementus greitu „Rust“ kodu be atminties saugumo pavojaus, būdingo kitoms sistemų programavimo kalboms. Kai kurie projektai netgi buvo perrašyti „Rust“, naudojant šias technikas.
Turėdamas tiesioginę prieigą prie aparatūros ir atminties, „Rust“ yra ideali kalba įterptųjų ir plikų metalų kūrimui. Galite rašyti ypač žemo lygio kodą, pvz., Operacinės sistemos branduolius ar mikrovaldiklių programas. Pagrindinės „Rust“ rūšys ir funkcijos, taip pat daugkartinio naudojimo bibliotekos kodas, spindi šiose ypač sudėtingose aplinkose.
Iš kitų sistemų programavimo kalbų
Daugeliui žmonių „Rust“ dažniausiai laikomas alternatyva kitoms sistemų programavimo kalboms, tokioms kaip „C“ arba „C ++“. Didžiausia „Rust“ nauda, palyginti su šiomis kalbomis, yra skolintis tikrintuvą. Tai yra kompiliatoriaus dalis, atsakinga už tai, kad nuorodos nebūtų pergyvenusios jų nurodytus duomenis, ir tai padeda pašalinti visas klaidų klases, kurias sukelia atminties nesaugumas.
Skirtingai nuo daugelio esamų sistemų programavimo kalbų, „Rust“ nereikalauja, kad visą laiką praleistumėte smulkmenose. Rust stengiasi, kad jų būtų kuo daugiau nulio sąnaudų abstrakcijos kiek įmanoma – abstrakcijos, kurios yra lygiai tokios pat efektyvios kaip ir lygiavertis ranka parašytas kodas. Šiame pavyzdyje parodome, kaip iteratoriai, pirminė Rūdžių abstrakcija, gali būti naudojami glaustai kuriant vektorių, kuriame yra pirmieji dešimt kvadratinių skaičių.
let squares: Vec<_> = (0..10).map(|i| i * i).collect();
Kai saugu, „Rust“ negali išreikšti tam tikros sąvokos, galite ją naudoti nesaugus Rūdys. Tai atveria keletą papildomų galių, tačiau mainais už tai, kad programuotojas yra atsakingas už tai, kad kodas būtų tikrai saugus. Tada šį nesaugų kodą galima suvynioti į aukštesnio lygio abstrakcijas, kurios garantuoja, kad visi abstrakcijos naudojimo būdai yra saugūs.
Nesaugaus kodo naudojimas turėtų būti apskaičiuotas sprendimas, nes teisingam jo naudojimui reikia tiek pat apgalvoti ir rūpintis, kiek ir bet kuria kita kalba, kur esate atsakingi už neapibrėžto elgesio vengimą. Sumažinti nesaugų kodą yra geriausias būdas sumažinti sutrikimų ir pažeidžiamumo dėl atminties nesaugumo galimybes.
Sistemų programavimo kalbos numanomai tikisi, kad jos bus veiksmingos amžinai. Nors kai kuri šiuolaikinė plėtra nereikalauja tokio ilgaamžiškumo, daugelis įmonių nori žinoti, kad jų pagrindinė kodų bazė bus naudojama artimiausioje ateityje. „Rust“ tai pripažįsta ir sąmoningai priėmė sprendimus dėl suderinamumo ir stabilumo atgal; tai kalba, sukurta ateinantiems 40 metų.
Rūdžių ekosistema
„Rust“ patirtis yra didesnė nei kalbos specifikacija ir kompiliatorius; daugelis gamybos kokybės programinės įrangos kūrimo ir palaikymo aspektų traktuojami kaip pirmos klasės piliečiai. Keletą vienu metu esančių „Rust“ įrankių grandinių galima įdiegti ir valdyti per „rustup“. „Rust“ diegimas yra su „Cargo“, komandinės eilutės įrankiu, leidžiančiu valdyti priklausomybes, vykdyti bandymus, generuoti dokumentus ir dar daugiau. Kadangi priklausomybės, testai ir dokumentai yra numatytieji, vyrauja jų naudojimas. crates.io yra bendruomenės svetainė, skirta dalytis ir atrasti „Rust“ bibliotekas. Bet kurios bibliotekos, paskelbtos svetainėje crates.io, dokumentacija bus sukurta ir paskelbta docs.rs.
Be įmontuotų įrankių, „Rust“ bendruomenė sukūrė daugybę kūrimo įrankių. Lyginamoji analizė, fuzzingas ir nuosavybės testavimas yra lengvai prieinami ir gerai naudojami projektuose. Papildomų kompiliatorių puošmenų yra „Clippy“, o automatinį idiomatinį formatavimą teikia „rustfmt“. IDE palaikymas yra sveikas ir kiekvieną dieną tampa vis pajėgesnis.
Peržengdamas techninius aspektus, Rustas turi gyvybingą, svetingą bendruomenę. Yra keletas oficialių ir neoficialių būdų žmonėms gauti pagalbos, tokių kaip pokalbis, vartotojo forumas, „Rust“ subbreddit ir, žinoma, „Stack Overflow“ klausimai ir atsakymai bei pokalbių kambarys. „Rust“ turi elgesio kodeksą, kurį įgyvendino nuostabi moderavimo komanda, siekdama įsitikinti, kad oficialios erdvės yra malonios, o dauguma neoficialių erdvių taip pat stebi kažką panašaus.
Neprisijungus „Rust“ visame pasaulyje rengia kelias konferencijas, tokias kaip „RustConf“, „Rust Belt Rust“, „RustFest“, „Rust Latam“, „RustCon Asia“ ir kt.
Tai dar ne visos rožės
Stipri „Rust“ tipo sistema ir atminties saugumo akcentavimas – visa tai vykdoma kompiliavimo metu – reiškia, kad renkant kodą itin dažnai pasitaiko klaidų. Programuotojams, kurie nėra įpratę prie tokios nuomonės turinčios programavimo kalbos, tai gali būti nemalonus jausmas. Tačiau „Rust“ kūrėjai praleido daug laiko, kad pagerintų klaidų pranešimus ir užtikrintų, kad jie būtų aiškūs ir veikiami. Neleiskite akims blizgėti skaitydami „Rust“ klaidas!
Ypač dažnai tenka girdėti, kaip kas nors skundžiasi, kad jie „kovojo su skolų tikrintoju“. Nors šios klaidos gali atgrasyti, svarbu pripažinti, kad kiekviena iš nurodytų vietų galėjo sukelti klaidų ir galimų pažeidžiamumų ta kalba, kuri neatliko tų pačių patikrinimų.
Šiame pavyzdyje mes sukuriame kintamą eilutę, kurioje yra pavadinimas, tada paimame nuorodą į pirmuosius tris vardo baitus. Nors ši nuoroda yra išskirtinė, mes bandome pakeisti eilutę ją išvalydami. Dabar nėra jokios garantijos, kad nuorodos į galiojančius duomenis ir jų išskyrimas gali lemti neapibrėžtą elgesį, todėl kompiliatorius mus sustabdo:
fn no_mutable_aliasing() {
let mut name = String::from("Vivian");
let nickname = &name[..3];
name.clear();
println!("Hello there, {}!", nickname);
}
error[E0502]: cannot borrow `name` as mutable because it is also borrowed as immutable
--> a.rs:4:5
|
3 | let nickname = &name[..3];
| ---- immutable borrow occurs here
4 | name.clear();
| ^^^^^^^^^^^^ mutable borrow occurs here
5 | println!("Hello there, {}!", nickname);
| -------- immutable borrow later used here
For more information about this error, try `rustc --explain E0502`.
Naudinga, kad klaidos pranešime yra mūsų kodas ir sunkiausiai bandoma paaiškinti problemą, nurodant tikslias vietas.
„Rust“ prototipų kūrimo sprendimai gali būti sudėtingi dėl jų statiško pobūdžio ir dėl to, kad „Rust“ reikia aprėpti 100% sąlygų, o ne tik 99%. „Edge“ bylose turi būti taikomas kodas, net jei programuotojas dar nežino, ką turėtų daryti laimingas kelias. Vykdant ankstyvąją plėtrą, šie kraštutiniai atvejai dažnai gali būti išspręsti, sukeldami programos gedimą, o vėliau gali būti pridėtas griežtas klaidų tvarkymas. Tai yra kitokia darbo eiga nei tokiose kalbose kaip „Ruby“, kur kūrėjai dažnai išbando kodą REPL ir tada perkelia jį į prototipą, visiškai neatsižvelgdami į klaidų atvejus.
Rūdys vis dar yra gana nauja, o tai reiškia, kad kai kurių norimų bibliotekų dar nėra. Teigiama yra tai, kad yra daug derlingos žemės šioms reikalingoms bibliotekoms kurti, galbūt netgi pasinaudojant naujausiais įvykiais atitinkamose kompiuterių mokslo srityse. Dėl šios ir „Rust“ galimybių kai kurios „Rust“ bibliotekos, tokios kaip „Regex“ dėžutė, yra geriausios veislės bet kurioje kalboje.
Nors „Rust“ yra tvirtai pasiryžęs stabilumui ir atgaliniam suderinamumui, tai nereiškia, kad kalba yra baigta. Konkrečiai problemai gali nebūti prieigos prie kalbos ypatybių, dėl kurių ją būtų paprasčiau išreikšti ar galbūt net būtų įmanoma išreikšti. Pavyzdžiui, „Rust“ turi asinchroninius ateities sandorius daugiau nei trejus metus, tačiau stabiliai async
/ await
palaikymas pačia kalba yra tik keli mėnesiai.
„Rust“ kompiliatorius yra pastatytas ant LLVM, o tai reiškia, kad tikslinių platformų skaičius bus mažesnis nei C arba C ++.
Ateik ir prisijunk prie mūsų!
Nepaisant to, kurias programavimo kalbas dabar mėgstate, būtinai atsiras kažkas, kas jus jaudina ar intriguoja dėl „Rust“. Tai yra keletas priežasčių, kodėl aš ir kiti taip myliu Rustą, ir yra daug daugiau. Jei ieškote papildomos savo projekto struktūros, greitesnio ar efektyvesnio kodo ar galimybės greičiau ir saugiau parašyti atlikėjų kodą, laikas jums pamatyti, ar „Rust“ bus tavo kita mėgstamiausia kalba!
Žymos: programavimas, rūdys …