03/29/2024

7 motive pentru a folosi Rugina pentru următorul proiect de dezvoltare

Sunteți un dezvoltator și doriți să învățați Rust? Pentru a vă ajuta să decideți, acest articol vă prezintă câteva dintre caracteristicile Rust, unul dintre cele mai populare limbaje de programare a sistemelor.

În acest articol, vom explora limbajul de programare Rust și caracteristicile sale, cum ar fi sistemul de tip, siguranța memoriei și proprietatea. De asemenea, vom trece peste o listă de resurse care vă pot ajuta să învățați Rust.

Sa incepem!

Ce este Rugina?

Rust este un limbaj de programare a sistemelor. A început ca un proiect personal al lui Graydon Hoare, un dezvoltator, în 2006. În mai puțin de un deceniu, a devenit alegerea de preferat pentru programarea sistemelor și aplicațiile conexe. Salariul mediu al unui programator Rust este de aproximativ 120.000 USD.

Așadar, dacă vrei să treci de la C++ la Rust sau vrei să înveți o nouă limbă, învățarea Rust poate fi o alegere excelentă! Potrivit sondajului StackOverflow Developer, Rust a fost votat cel mai iubit limbaj de programare – timp de șapte ani la rând.

Sursa imagine: StackOverflow

Rust oferă viteza limbajelor de programare de nivel scăzut, cum ar fi C și C++, și siguranța limbajelor de programare de nivel înalt, cum ar fi Python.

De la proiecte notabile precum Dropbox și Firefox la WebAssembly și programare încorporată, Rust este utilizat pe scară largă în toate domeniile dezvoltării software. Rust oferă asistență gata de gestionare a pachetelor prin Cargo.

Cargo: Managerul de pachete pentru Rust

Cargo este managerul de pachete pentru Rust. Puteți folosi cargo pentru a instala pachete din lăzi, registrul pachetelor Rust. Pe lângă faptul că este un manager de pachete care vă permite să căutați, să instalați și să gestionați pachete, cargo servește și ca un test runner, un generator de documente și un sistem de compilare.

Acum că aveți o privire de ansamblu asupra Rust, să aruncăm o privire mai atentă la unele dintre caracteristicile Rust care îl fac să iasă în evidență ca limbaj de programare a sistemelor cu adoptare largă.

Mesaje de eroare utile

În calitate de programator începător, veți întâlni erori și veți petrece o perioadă semnificativă de timp depanând codul. Veți folosi mesajele de eroare și avertismentele furnizate de compilator pentru a remedia aceste probleme. Și mesajele utile vă pot ajuta să depanați mai rapid.

Un exemplu de mesaj de eroare

Când codul dvs. nu se compila cu succes, Rust oferă mesaje de eroare utile care oferă explicații despre ce trebuie remediat în codul dvs. și unde.

În acest exemplu, variabila num2 este definită în interiorul funcției inner(). Prin urmare, este limitată la domeniul de aplicare al funcției. Dacă încercați să îl accesați în afara funcției, compilatorul afișează o eroare:

fn main() {
    let num1 = 10;
    fn inner(){
        let num2 = 9; 
    }
    println!("The value of num2 is: {}", num2);
}

Și mesajul de eroare oferă informații despre ceea ce trebuie remediat.

error[E0425]: cannot find value `num2` in this scope
 --> src/main.rs:6:42
  |
6 |     println!("The value of num2 is: {}", num2);
  |                                          ^^^^ help: a local variable with a similar name exists: `num1`

Avertismente în timpul compilării

Compilatorul oferă, de asemenea, avertismente utile cu privire la problemele din codul dvs. Când definiți variabile, dar nu le utilizați niciodată în restul programului, Rust vă oferă un mesaj de avertizare, așa cum se arată.

fn main() {
    let num1 = 10;
    let num2 = 9;
    println!("The value of num1 is: {}", num1);
}

Aici, variabila num2 este declarată, dar niciodată utilizată.

warning: unused variable: `num2`
 --> src/main.rs:3:9
  |
3 |     let num2 = 9;
  |         ^^^^ help: if this is intentional, prefix it with an underscore: `_num2`
  |

Limbaj puternic tipizat

Un alt motiv pentru care ar trebui să utilizați Rust pentru proiectele dvs. de dezvoltare este sistemul său de tip. Rugina este un limbaj puternic tipizat, ceea ce înseamnă că nu acceptă constrângerea de tip. Coerciția de tip este atunci când o limbă poate converti implicit o valoare dintr-un tip de date în alta.

  Cele mai bune 10 instrumente pentru monitorizarea rețelelor locale

De exemplu, codul Python din următoarea celulă de cod va rula fără erori. Acest lucru se datorează faptului că în Python, un număr diferit de zero are o valoare de adevăr True și, prin urmare, instrucțiunea if rulează fără erori – chiar dacă numărul 10 este un număr întreg – și nu un boolean.

num1 = 10
if num1:
    num2 = 9
print(f"num2 is {num2}")

# Output: num2 is 9

Pe de altă parte, Rust nu constrânge tipurile. Deci următorul cod va genera o eroare:

fn main() {
    let num1 = 10;
    if num1{
        let num2 = 9; 
    }
}

Eroarea raportează o nepotrivire de tip, unde era de așteptat un boolean și a fost găsit un întreg.

error[E0308]: mismatched types
 --> src/main.rs:3:8
  |
3 |     if num1{
  |        ^^^^ expected `bool`, found integer

Siguranța memoriei

Siguranța memoriei este o altă caracteristică a Rust care îl face atrăgător pentru programatori. Vom încerca să oferim o prezentare generală a modului în care funcționează.

Variabilele trebuie să fie inițializate înainte de a fi utilizate

În Rust, toate variabilele trebuie inițializate înainte de a putea fi utilizate. În limbaje precum C, următorul cod în care num nu este inițializat se va compila și rula fără erori. Valoarea variabilei neinițializate este o valoare gunoaie.

#include <stdio.h>

int main(void) {
    int num;
	printf("The value of num is %d", num);
	return 0;
}
// Output: The value of num is 0

Dacă încercați să faceți ceva similar în Rust, veți întâlni o eroare de compilare. Rugina, prin urmare, nu are noțiune de colectare a gunoiului.

fn main() {
    let num:i32;
    println!("The value of num is: {}",num);
}
error[E0381]: used binding `num` isn't initialized
 --> src/main.rs:3:40
  |
2 |     let num:i32;
  |         --- binding declared here but left uninitialized
3 |     println!("The value of num is: {}",num);
  |                                        ^^^ `num` used here but it isn't initialized
  |

Siguranța memoriei la momentul compilării

Rust asigură siguranța memoriei în timpul compilării. Să luăm un exemplu simplu. Aici, chiar dacă instrucțiunea condiționată if are o valoare booleană true, ceea ce înseamnă că valoarea lui num va fi întotdeauna 100, obținem o eroare când încercăm să tipărim valoarea lui num.

fn main() {
    let num:i32;
    if true{
        num = 100;
    }
    println!("The value of num is: {}", num);
}

Acest lucru se datorează faptului că evaluarea condiționată are loc în timpul rulării, iar compilatorul nu va putea garanta că num are o valoare în timpul compilării.

error[E0381]: used binding `num` is possibly-uninitialized
 --> src/main.rs:6:41
  |
2 |     let num:i32;
  |         --- binding declared here but left uninitialized
3 |     if true{
  |        ---- if this `if` condition is `false`, `num` is not initialized
4 |         num = 100;
5 |     }
  |      - an `else` arm might be missing here, initializing `num`
6 |     println!("The value of num is: {}", num);
  |                                         ^^^ `num` used here but it is possibly-uninitialized

Dacă aruncați o privire mai atentă la mesajul de eroare, veți vedea că, cu o declarație else, ne putem asigura că num va avea o valoare. Deci următorul cod va rula fără erori. Deoarece în acest fel, compilatorul poate determina că num va avea o valoare – la momentul compilării – astfel încât să nu existe erori.

fn main() {
    let num:i32;
    if true{
        num = 100;
    }
    else{
        num = 50;
    }
    println!("The value of num is: {}", num);
}
The value of num is: 100

Imuabilitatea variabilelor

De asemenea, este util să rețineți că variabilele din Rust sunt imuabile în mod implicit. Aceasta înseamnă că, în calitate de dezvoltator, nu trebuie să vă faceți griji cu privire la suprascrierea accidentală a valorii unei anumite variabile. Iată un exemplu:

fn main() {
    let num1 = 10;
    num1 = 5;
    println!("The value of num1 is: {}", num1);
}

Deoarece num1 este inițializat la 10, când încercați să-i atribuiți o valoare de 5, primiți un mesaj de eroare care spune „nu se poate atribui de două ori variabilei imuabile num1”.

error[E0384]: cannot assign twice to immutable variable `num1`
 --> src/main.rs:3:5
  |
2 |     let num1 = 10;
  |         ----
  |         |
  |         first assignment to `num1`
  |         help: consider making this binding mutable: `mut num1`
3 |     num1 = 5;
  |     ^^^^^^^^ cannot assign twice to immutable variable

Proprietatea și împrumutul

Proprietatea asigură siguranța memoriei. Din punct de vedere funcțional, proprietatea în Rust poate fi rezumată după cum urmează:

  9 cele mai bune instrumente de decupare a imaginilor pentru a vă pregăti imaginea pentru rețelele sociale

Fiecare obiect ar trebui să aibă un singur proprietar. Dacă proprietarul iese din domeniul de aplicare, atunci obiectul este aruncat.

Să luăm un exemplu simplu. Aici, inițializam un șir str1 și apoi îi mutăm valoarea în str2. Deoarece orice obiect poate avea un singur proprietar, obiectul str1 este abandonat de îndată ce valoarea lui este mutată în str2.

fn main() {
    let str1 = String::from("Rust");
    let str2 = str1;
    println!("The value of str1 is: {}", str1);
}
error[E0382]: borrow of moved value: `str1`
 --> src/main.rs:4:42
  |
2 |     let str1 = String::from("Rust");
  |         ---- move occurs because `str1` has type `String`, which does not implement the `Copy` trait
3 |     let str2 = str1;
  |                ---- value moved here
4 |     println!("The value of str1 is: {}", str1);
  |                                          ^^^^ value borrowed here after move

Deși acest lucru pare intuitiv, pentru a înțelege și a aprecia mai bine cum funcționează proprietatea, este util să înveți conceptele de împrumut și referințe.

Dezvoltare rapidă

Până acum, am discutat câteva caracteristici utile ale limbajului de programare Rust. Pentru a revizui câteva:

  • Rugina este optimizată atât pentru viteză, cât și pentru siguranță.
  • Vine cu un instrument de gestionare a pachetelor încorporat și construiește un sistem.
  • Are, de asemenea, o bibliotecă standard bogată.

În esență, Rust oferă tot ceea ce un dezvoltator poate cere. Prin urmare, cu Rust, puteți dezvolta rapid aplicații cu depanare minimă și versiuni mai rapide.

Dezvoltare multi-platformă

Cu Rust, puteți alege să dezvoltați pe o platformă la alegere. Rust acceptă cele mai comune platforme: Linux, MacOS și Windows.

Dezvoltarea aplicației este în general ușoară, deoarece puteți compila codul sursă Rust într-un executabil fără a depinde de alte instrumente de compilare și compilatoare externe.

  Cele mai bune 10 instrumente pentru monitorizarea rețelelor locale

O comunitate de susținere face un drum lung în simplificarea călătoriei tale de învățare. Rust are o bază uriașă de utilizatori care crește doar cu fiecare an care trece.

Popularitatea lui Rust în sondajul pentru dezvoltatori StackOverflow indică faptul că există o comunitate mare de utilizatori, cu o mulțime de dezvoltatori experimentați dispuși să-și împărtășească cunoștințele și expertiza.

Pe lângă documentația oficială, există și un site de documentare generat de utilizatori și un forum de discuții. Puteți verifica, de asemenea, grupurile Rust subreddit și LinkedIn pentru discuții relevante.

Resurse de învățare pentru a începe cu Rust

Această secțiune listează câteva resurse utile pentru a vă ajuta să începeți cu Rust. Aceasta nu este o listă exhaustivă, dar include câteva tutoriale, cursuri și cărți recomandate pentru a vă ajuta în călătoria dvs. de învățare.

#1. Rugină Prin Exemplu

Rust By Example vă va învăța bazele Rust și bibliotecile standard printr-o serie de exemple pe care le puteți codifica într-un editor online.

Subiectele abordate includ lăzi, încărcătură: instrumentul de gestionare a pachetelor pentru Rust, generice, trăsături, gestionarea erorilor și multe altele.

#2. Foşnet

Rustlings este o altă resursă oficială de învățare pentru limbajul de programare Rust. Este similar cu Rust prin exemplu. Cu toate acestea, este necesar să vă configurați mediul de dezvoltare local, să clonați un exemplu de depozit și să rezolvați probleme simple pentru a învăța aceste concepte.

#3. Exercițiu Rust Track

Rugina Track on Exercism are peste 100 de exerciții pentru a vă ajuta să învățați și să vă testați înțelegerea Rust. Exercism este o platformă gratuită în care poți fi îndrumat de către programatori experimentați, în plus față de codificarea exercițiilor.

#4. Ultimate Rust Crash Course

Cursul Ultimate Rust Crash predat de Nathan Stocks pe Udemy acoperă următoarele:

  • Fundamentele programării Rust
  • Sistem de module în Rust
  • Tipuri de date și flux de control
  • Referință și împrumut
  • Structuri, trăsături și colecții

#5. Ultimate Rust 2: Concepte intermediare

Ultimate Rust 2 este un curs de continuare la Ultimate Rust Crash Course și acoperă următoarele subiecte:

  • Închideri
  • Iteratori
  • Eroare de manipulare
  • Test de unitate și de integrare
  • Înregistrare, multithreading și canale

#6. Rust lang: Ghidul complet pentru începători 2023

Acest curs Udemy predat de Catalin Stefan este un curs cuprinzator despre programarea Rust. Unele dintre subiectele abordate includ:

  • Fundamentele ruginii
  • Tipuri de date, structuri de control
  • Funcții, trăsături
  • Gestionarea memoriei
  • Concurență

#7. Programming Rust: Dezvoltare rapidă și sigură a sistemelor

Programming Rust de O’Reilly este o carte populară de programare Rust care vă va învăța următoarele:

  • Tipuri fundamentale de date
  • Proprietatea și împrumutul
  • Programare asincronă
  • Aplicații rapide multithreading
  • Închideri, iteratoare
  • Colecții

#8. Limbajul de programare Rust, ediția a 2-a

Limbajul de programare Rust este creat de colaboratori renumiți ai comunității Rust. Această carte acoperă tot ce trebuie să știți despre Rust, inclusiv:

  • Proprietatea și împrumutul
  • Generic, trăsături
  • Indicatoare inteligente, multithreading
  • Testare și tratare a erorilor

#9. Ghidul complet de referință pentru programarea Rust

Ghidul complet de referință pentru programarea Rust de la Packt acoperă următoarele:

  • Implementarea structurilor de date în Rust
  • Scrierea componentelor reutilizabile și testabile în Rust
  • Proiectarea aplicațiilor multithreaded proiectarea algoritmului și
  • Aplicații ale Rust în aplicații WebAssembly, rețele și linie de comandă

#10. Proiecte creative pentru programatorii Rust

Dacă sunteți un dezvoltator cu experiență care învață Rust, atunci construirea unor proiecte în domeniul dvs. de interes va fi suficientă pentru a înțelege bine limba. Proiecte creative pentru programatori Rust de la Packt este o carte care învață Rust aplicându-le la proiecte precum:

  • Construirea de servicii web odihnitoare
  • Jocuri 2D cu
  • Dezvoltare de aplicații web folosind WebAssembly
  • Emulatori de limbaj mașină
  • și altele!

Concluzie

Acest articol a prezentat o prezentare generală a Rust ca limbaj de programare a sistemelor, incluzând caracteristici precum siguranța memoriei, gestionarea îmbunătățită a pachetelor și multe altele. De asemenea, am enumerat resurse de învățare pentru a vă ajuta să începeți să utilizați Rust.

Ca pas următor, puteți alege una sau mai multe dintre resursele de învățare menționate pentru a afla elementele de bază ale Rust. Programare Rust fericită!

De asemenea, puteți explora câțiva cei mai buni furnizori de găzduire pentru servere Rust.