Linguaggio arrugginito. Il linguaggio di Rust e perché abbiamo bisogno di conoscerlo. Caratteristiche amichevoli, ma anche sintattiche

Golovna / Ottimizzazione del lavoro

Ruggine- Nuovo linguaggio di programmazione sperimentale che Mozilla sta abbandonando. Il linguaggio è compilato e multiparadigmatico, posizionato come alternativa al C/C++, il che è di per sé positivo, poiché non ci sono così tanti contendenti alla concorrenza. Puoi indovinare D Walter Bright e Go da Google.
Rust incoraggia la programmazione funzionale, parallela, procedurale e orientata agli oggetti, ecc. Esiste anche tutta una serie di paradigmi che possono effettivamente essere esplorati nella programmazione applicata.

Non mi prendo la briga di tradurre la documentazione (peraltro è addirittura scarsa ed è in continua evoluzione, visto che non c'è ancora stata un'uscita ufficiale del film), perché vorrei evidenziare alcune caratteristiche del film. Le informazioni sono state raccolte sia dalla documentazione ufficiale che da numerosi misteri della lingua su Internet.

Primo nemico

La sintassi del linguaggio sarà in stile tradizionale si-like (che non può essere ignorato, poiché è già uno standard de facto). È chiaro che il design di C/C++ è protetto con tutti i mezzi.
Il tradizionale Hello World si presenta così:
usa standard; fn main(args: ) ( std::io::println("ciao mondo da " + args + "!"); )

Calcio pieghevole - funzione dell'espansione fattoriale:

Fn fac(n: int) -> int ( sia risultato = 1, i = 1; mentre i<= n { result *= i; i += 1; } ret result; }

Come è ovvio dal butt, le funzioni differiscono dallo stile “funzionale” (questo stile presenta alcuni vantaggi rispetto al tradizionale “int fac (int n)”). Bachimo identificazione automatica del tipo(parola chiave let), la presenza di tondi nell'argomento while (simile a Go). Altro aspetto importante è la compattezza delle parole chiave. I creatori di Rust hanno mantenuto in modo efficace e mirato tutte le parole chiave brevi e, a dire il vero, è meno appropriato.

Caratteristiche amichevoli, ma anche sintattiche

  • È possibile inserire un alias in una costante numerica. È una cosa utile, puoi aggiungere rapidamente molte nuove lingue.
    0xffff_ffff_ffff_ffff_ffff_ffff
  • Doppie costanti. Naturalmente, il programmatore corretto è responsabile della conversione di bin in esadecimale in modo ragionevole, altrimenti è molto più semplice! 0b1111_1111_1001_0000
  • I corpi degli eventuali operatori (apparentemente formati da un'unica struttura) sono posti in posizione serrata vicino alla figura dell'arco. Ad esempio, potresti scrivere if(x>0) foo(); , in Rust devi mettere rigorosamente le forme dell'arco accanto a foo()
  • Non ci sono argomenti per il se, mentre affermazioni e simili non hanno bisogno di essere messe in testa.
  • In molti casi, i blocchi di codice possono essere visualizzati in modo diverso. Zokrema, forse così:
    let x = if the_stars_align() ( 4 ) else if qualcos_altro() ( 3 ) else ( 0 );
  • La sintassi della funzione è prima la parola chiave fn, poi l'elenco degli argomenti, il tipo dell'argomento è indicato dopo il nome, poi quando la funzione ruota il valore - la freccia "->" e il tipo del valore da ruotare
  • Allo stesso modo, puoi specificare la modifica: la parola chiave let, il nome della modifica, dopo la modifica puoi utilizzare la doppia casella per specificare il tipo, e quindi assegnare i valori cob.
    contiamo: int = 5;
  • dopo aver lavato i baffi i cambiamenti sono immutabili; Per disattivare l'audio delle parole chiave mutabili, viene utilizzata la parola chiave mutabile.
  • I nomi dei tipi base sono i più compatti di tutti, che sono meno comuni: i8, i16, i32, i64, u8, u16, u32, u64, f32, f64
  • Una volta designato un prodotto, viene incoraggiata la sostituzione automatica dei tipi
I nostri programmi locali sono stati sviluppati:
Parola chiave fallire completa il processo attuale
Parola chiave tronco d'albero invia qualunque cosa Viraz Movi al log (ad esempio, a stderr)
Parola chiave affermare verifica l'espressione e, in caso contrario, completa il processo corrente
Parola chiave Nota consente di visualizzare informazioni aggiuntive in caso di interruzione di emergenza del processo.

Omaggi ai tipi

Rust, simile a Go, supporta tipizzazione strutturale(Sebbene, secondo le affermazioni degli autori, la lingua si sia sviluppata in modo indipendente, ciò è dovuto all'infusione dei loro predecessori di successo: Alef, Limbo, ecc.). Cos'è la tipizzazione strutturale? Ad esempio, i tuoi file non hanno struttura (o, nella terminologia Rust, "record")
tipo punto = (x: float, y: float);
Puoi esprimere una serie di funzioni diverse con i tipi di argomento "punto". Poi, qui in un altro posto, potrete votare per qualsiasi altra struttura, per esempio
Il MioSuperPunto = (x: float, y: float);
Tali modifiche di questo tipo saranno completamente diverse da quelle del tipo punto.

Al contrario, la tipizzazione nominativa è adottata da C, C++, C# e Java non consente tali costruzioni. Secondo la tipizzazione nominativa, la struttura della pelle è un tipo unico, che non è comune ad altri tipi.

Le strutture in Rust sono chiamate record. Esistono anche tuple: i record stessi, nonché i campi senza nome. Gli elementi di una tupla non possono essere modificati nella sezione di immissione degli elementi.

Є vettori - per certi aspetti simili agli array primari e in alcuni casi - come std::vettore con stl. Quando si inizializza con un elenco, vengono utilizzate le braccia quadre invece delle forme come C/C++

Sia myvec =;

Protezione vettoriale: struttura dinamica dei dati, zokrem, concatenazione del supporto vettoriale.

Sia v: mutabile =; v + =;

Emergono modelli. La sua sintassi è completamente logica, senza l'ingombro dei "template" del C++. Sono supportati modelli di funzioni e tipi di dati.

Fn per_rev (v: [T], act: block(T)) ( let i = std::vec::len(v); while i > 0u ( i -= 1u; act(v[i]); ) ) tipo circolare_buff = (inizio: uint, fine: uint, buf:);

La lingua supporta questo nome tag. Non è altro che un'unione con C, con un campo aggiuntivo: il codice dell'opzione utilizzata (cioè c'è differenza tra consolidamento e riassicurazione). Oppure, dal punto di vista teorico, si tratta di dati di tipo algebrico.

Forma del tag (cerchio(punto, float); rettangolo(punto, punto); )

Nella forma più semplice, il tag è identico alla riorganizzazione:

Tag animale ( cane; gatto; ) let a: animale = cane; a = gatto;
Nelle lesioni cutanee piegate, l'elemento di “sforzo eccessivo” è una struttura indipendente che ha il proprio “costruttore”.
Un altro esempio utile è una struttura ricorsiva, in cui viene specificato un oggetto del tipo “lista”:
elenco dei tag ( zero; contro (T, @list ); ) lascia una: lista = contro(10, @contro(12, @nil));
I tag possono prendere parte alle visualizzazioni, che possono essere pieghevoli.
alt x ( contro(a, @contro(b, _)) ( process_pair(a,b); ) contro(10, _) ( process_ten(); ) _ ( fail; ) )

Corrispondenza del modello

Per cominciare, puoi considerare il modello corrispondente come un interruttore. Viene cercata la parola chiave alt, dopodiché viene analizzato il virus e quindi viene utilizzato il corpo dell'operatore per trovare modelli e schemi.
alt mio_numero ( 0 ( std::io::println("zero"); ) 1 | 2 ( std::io::println("uno o due"); ) Da 3 a 10 ( std::io::println ("da tre a dieci"); ) _ ( std::io::println("qualcos'altro"); ) )
Come “pateroni”, puoi usare non solo costanti (come in C), ma anche espressioni complesse – variabili, tuple, intervalli, tipi, simboli segnaposto (segnaposto, “_”). Puoi scrivere frasi aggiuntive dietro l'operatore quando, che appare immediatamente dopo il modello. Esiste una versione speciale dell'operatore per la corrispondenza dei tipi. È possibile che i frammenti nella lingua siano un tipo di variante universale Qualunque oggetti di qualsiasi tipo possono vendicarsi di qualsiasi tipo.

Docce. Oltre agli indicatori "intelligenti" più comuni, Rust supporta speciali indicatori "intelligenti" con un supporto speciale: box condivisi e box unici. Ha l'odore di shared_ptr e unique_ptr di C++. La sintassi è: @ per condiviso e ~ per unico. Per gli indicatori univoci, invece della copia, l'operazione speciale principale è lo spostamento:
sia x = ~10; lascia che tu<- x;
Dopo tale spostamento, l'indicatore x viene deiinizializzato.

Zamikannya, stagnazione parziale, iteratori

È qui che inizia la programmazione funzionale. Rust enfatizza fortemente il concetto di funzioni di ordine superiore: funzioni che possono prendere argomenti come propri e ruotare altre funzioni.

1. Parola chiave lambda Vikoryst viene utilizzato per chiarire la funzione annidata e il tipo di dati funzionali.

Fn make_plus_function(x: int) -> lambda(int) -> int ( lambda(y: int) -> int ( x + y ) ) let plus_two = make_plus_function(2); asserisci più_due(3) == 5;

Questa applicazione utilizza la funzione make_plus_function, che accetta un argomento "x" di tipo int e trasforma la funzione nel tipo "int->int" (qui lambda è la parola chiave). Questa funzione descrive la sua funzione. L'importanza dell'operatore “ritorno” è significativa, tuttavia per FP è di primaria importanza a destra.

2. Parola chiave bloccare Viene utilizzato per spiegare il tipo di funzione: l'argomento di una funzione che può essere sostituito, simile a un blocco di codice iniziale.
fn map_int(f: block(int) -> int, vec: ) -> (let result = ;

Qui abbiamo una funzione, il cui input è un blocco - essenzialmente una funzione lambda di tipo "int->int" e un vettore di tipo int (maggiori informazioni sulla sintassi dei vettori di seguito). Il “blocco” stesso nel codice richiamato è scritto in modo simile alla sintassi non primaria (| x | x + 1). Particolarmente più adatto per me è il C# lambdi, il simbolo | Viene prima trattato come un po' ABO (poiché, prima di parlare, in Rust è uguale a tutte le altre operazioni simili).

3. Stasi parziale - creazione di una funzione sulla base di un'altra funzione con un gran numero di argomenti inserendo il significato di alcuni argomenti per un'altra funzione. A cosa serve la parola chiave? legamento Questo è il simbolo sostitutivo "_":

Sia daynum = bind std::vec::position(_, ["mo", "tu", "we", "do", "fr", "sa", "su"])

Per essere più chiaro, dico subito che puoi anche guadagnare soldi in primo luogo creando il burn più semplice, come questo:
const char * daynum (int i) (const char * s = ("mo", "tu", "noi", "do", "fr", "sa", "su"); return s [i]; )

Ale stasi parziale è uno stile funzionale, non procedurale (prima del discorso, dal punto di vista, non è chiaro come creare una stasi parziale per rimuovere la funzione senza argomenti)

Altro esempio: viene utilizzata la funzione add con due argomenti int, che ruota int. Poi arriva il tipo funzionale single_param_fn, che accetta un argomento int e ruota int. La funzione bind è supportata da due oggetti funzionali add4 e add5, creati sulla base della funzione add, che spesso hanno argomenti.

Fn add(x: int, y: int) -> int ( ret x + y; ) tipo single_param_fn = fn(int) -> int; let add4: single_param_fn = bind add(4, _); let add5: single_param_fn = bind add(_, 5);

Gli oggetti funzionali possono essere richiamati allo stesso modo delle funzioni primarie.
assert (aggiungi(4,5) == aggiungi4(5)); assert (aggiungi(4,5) == aggiungi5(4));

4. Funzioni pure e predicati
Funzioni pure: si tratta di funzioni che possono avere effetti collaterali (ad eccezione di altre funzioni pure). Tali funzioni sono rappresentate dalla parola chiave pura.
puro fn lt_42(x: int) -> bool ( ret (x< 42); }
I predicati sono funzioni pure che ruotano il tipo bool. Tali funzioni possono essere modificate nel sistema di tipo potenza (div. oltre), in modo da poter essere utilizzate in fase di compilazione per varie verifiche statiche.

Macro sintattiche
È prevista una funzionalità, ma è davvero interessante. La ruggine è ancora nella fase di sviluppo della pannocchia.
std::io::println(#fmt("%s è %d", "la risposta", 42));
Un virus simile al nostro printf, ma compilato al momento della compilazione (a quanto pare, tutte le modifiche agli argomenti vengono rilevate in fase di compilazione). Sfortunatamente, c'è pochissimo materiale sulle macro sintattiche e l'odore stesso è ancora in fase di sviluppo, ma c'è la speranza che assomigli al tipo di macro Nemerle.
Prima di parlare, oltre a Nemerle, ho deciso di vedere le macro sintatticamente dietro il simbolo aggiuntivo #, rispetto anche quelli alfabetizzati: una macro è un'essenza, anche suddivisa in una funzione, e rispetto quelle importanti fin dal primo sguardo, i codici chiamano funzioni e dove - macro

Attributi

Il concetto è simile agli attributi C# (e anche con una sintassi simile). Grazie mille ai distributori per questo. Di conseguenza, gli attributi aggiungono metainformazioni all’essenza che annotano,
# fn registro_win_service() ( /* ... */ )
È stata inventata un'altra opzione per la sintassi degli attributi: quella stessa riga, con il punto alla fine, annota il contesto esatto. Questi sono quelli che indicano alle braccia ricci più vicine che bramano un simile attributo.
fn Register_win_service() ( #; /* ... */ )

Calcoli paralleli

Forse uno degli elementi più preziosi della lingua. Tuttavia, al momento non è descritto nel tutorial :)
Un programma Rust è costruito a partire da un “albero factory”. La funzione della pelle ha la funzione di input, drenaggio dell'umidità, interazione con altri compiti: canali per le informazioni in uscita e porte per l'input e l'acqua di alcuni oggetti in un acquisto dinamico.
Molti comandi Rust possono essere eseguiti all'interno di un singolo processo del sistema operativo. I compiti di Rust sono “leggeri”: il compito della skin ha meno memoria del processo del sistema operativo, e la comunicazione tra loro si traduce in una minore comunicazione tra i processi del sistema operativo (qui, forse, sono in gioco i “thread”).

L'attività è costituita da almeno una funzione senza argomenti. L'avvio dell'attività viene effettuato utilizzando la funzione di spawn aggiuntiva. La pelle può anche utilizzare canali attraverso i quali trasmette informazioni ad altre parti. Un canale è un tipo di modello speciale chan, parametrizzato dal tipo di dati del canale. Ad esempio, chan è un canale per la trasmissione di byte senza segno.
Per trasmettere un canale viene utilizzata la funzione di invio, il cui primo argomento è il canale e l'altro è il valore di trasmissione. Infatti questa funzione consiste nel trasferire i valori del buffer interno sul canale.
Per estrarre i dati, è necessario utilizzare la porta vikory. Port è una porta di tipo modello, parametrizzata dal tipo di dati della porta: port - porta per la ricezione di byte senza segno.
Per leggere dalle porte, utilizzare la funzione recv, il cui argomento è la porta, e i valori che vengono ruotati sono i dati della porta. La lettura è dunque bloccata dall'oscurità. Se la porta è vuota, l'ordine è di spostarsi alla stazione di recupero finché l'altro ordine non viene inviato al canale dati connesso alla porta.
Collegare i canali alle porte è semplice come inizializzare il canale con una porta usando la parola chiave chan:
lascia reqport = porta();
lascia che reqchan = chan(reqport);
È possibile collegare più canali a una porta, ma non la stessa cosa: un canale non può essere collegato a più porte contemporaneamente.

Stato tipo

Ancora non conosco la traduzione illegale in russo del concetto di "tipostato", quindi lo chiamo "diventare tipi". L'essenza di questa funzionalità è che, oltre al controllo di tipo di base adottato nella tipizzazione statica, sono possibili ulteriori controlli contestuali in fase di compilazione.
In questo caso, i tipi diventeranno familiari a tutti i programmi: con la conoscenza del compilatore, "le modifiche verranno apportate senza inizializzazione". Il compilatore determina il luogo in cui viene modificato, ogni volta che non c'è stata alcuna registrazione, viene utilizzato per la lettura e appare in anticipo. In un modo più convenzionale, l’idea è questa: l’oggetto pelle ha una serie di condizioni che possono essere adottate. Sulla pelle di questo oggetto sono indicate operazioni accettabili e inaccettabili. E il compilatore può rimuovere i controlli, se un'operazione specifica su un oggetto è consentita in un'altra posizione del programma. È importante che le revisioni siano completate nella fase di compilazione.

Ad esempio, se abbiamo un oggetto di tipo “file”, allora può essere “chiuso” o “aperto”. L'operazione di lettura dal file non è consentita se il file è chiuso. Nelle lingue odierne, abilita la funzione di lettura e lancia un messaggio accusatorio o gira il codice di grazia. Il sistema di tipi potrebbe rilevare tale distorsione nella fase di compilazione - proprio come il compilatore presuppone che un'operazione di lettura avvenga prima di ogni possibile operazione di scrittura, bi significa che il metodo "Leggi" è valido nel paese "File aperto", fare clic su Metodo "Apri" per trasferire l'oggetto in questa posizione.

Rust ha un concetto di "predicati" - funzioni speciali che non hanno effetti collaterali e invertono il tipo bool. Tali funzioni possono essere utilizzate dal compilatore per l'input in fase di compilazione controllando staticamente altre menti.

Vincoli: si tratta di modifiche speciali che possono essere apportate in fase di compilazione. A questo scopo viene utilizzata la parola chiave Check.
pure fn è_meno_di(int a, int b) -< bool { ret a < b; } fn test() { let x: int = 10; let y: int = 20; check is_less_than(x,y); }
I predicati possono essere “appesi” ai parametri di input di una funzione in questo modo:
fn test(int x, int y) : è_meno_di(x,y) ( ... )

Ci sono pochissime informazioni sul tipo di alimentazione, quindi molti punti non sono ancora chiari, ma il concetto è comunque un fallimento.

È tutto.

È del tutto possibile che mi siano persi alcuni bei momenti, ed è per questo che mi sono gonfiato così tanto. Per ora puoi scaricare subito il compilatore Rust e provare a giocare con diversi strumenti. Informazioni su questa collezione possono essere trovate su

Sono nuovo in Rust, ma probabilmente sta diventando il mio programma preferito. Voglio scrivere piccoli progetti in Rust che siano meno ergonomici e richiedano più di un'ora (sapete, con me dietro le quinte), il che mette in discussione il modo in cui penso alla progettazione dei programmi. Le mie battaglie con il compilatore diventano meno frequenti man mano che imparo cose nuove.

Il resto del team di Rust ha concentrato gran parte dei propri sforzi sull'input/output asincrono, implementato nella libreria Tokio. È meraviglioso.

  • Molti dei partecipanti allo studio, poiché non lavoravano con server web e discorsi correlati, non capivano cosa volevamo ottenere. Dato che di queste cose si è parlato durante le ore della versione 1.0, non posso fare a meno di notare qualcosa di cui non si è mai parlato prima. Com'è -?
  • I/O asincrono Cos'è il corutini ( )?
  • coroutine Cosa sono i flussi di passeggeri ( )?
  • fili leggeri Cos'è il futuro? )?

  • futuri

Come possono i puzzi mangiarsi a vicenda? Ti mostrerò come scrivere un piccolo programma che catturerà una riga () in formato JSON, analizza e visualizza un elenco di note sulla console in una vista formattata.

Eravamo tutti coinvolti in un codice breve. Yak? Meravigliati sotto il gatto.

La parola chiave unsafe è una parte invisibile del design di Rust. Per coloro che non la conoscono: unsafe è una parola chiave che, in termini semplici, è un modo per aggirare il controllo del tipo ( controllo del tipo) Ruggine.

L'uso della parola chiave non è sicuro per i ricchi e i non iniziati. Non è vero che i programmi che non si bloccano quando vengono eseguiti in memoria non sono una caratteristica di Rust? Se sì, perché esiste un modo semplice per aggirare il sistema dei tipi? Questo potrebbe essere un difetto nella progettazione del film.

Tuttavia, secondo me, il pericolo non è lontano. In verità, questa è una parte importante della lingua. Unsafe svolge il ruolo di una valvola di output, il che significa che possiamo eseguire il debug del sistema di tipi in codici semplici, consentendoti di eseguire il debug di tutti i trucchi di cui desideri eseguire il debug del tuo codice. Speriamo solo che tu utilizzi i tuoi metodi (codice non sicuro) dietro astrazioni esterne sicure.

Questa nota rappresenta la parola chiave unsafe e l’idea di una “insicurezza” limitata. In effetti, questa è una nota, quindi sono tentato di scriverne un po’ quest’anno. Vaughn discute il modello di memoria di Rust, che indica cosa può e cosa non può funzionare in un codice non sicuro.

Essendo nuovo in Rust, ero confuso dai diversi modi di definire le righe. Il libro sul linguaggio Rust ha una sezione “Riferimenti e prestiti”, in cui vengono descritti tre diversi tipi di cambi di riga nei butts: String, & String e & str.

Infine c'è una differenza tra str e String: String è la struttura dati in espansione, che si vede sul mercato, mentre str è la riga immutabile del reddito fisso, Qui in memoria.

Molti programmatori stanno già programmando con il linguaggio orientato agli oggetti. Rust non è un classico linguaggio orientato agli oggetti, ma gli strumenti OOP di base possono essere integrati in uno nuovo.

In questo articolo vedremo come programmare in Rust in stile OOP. Stiamo lavorando sul prezzo nell'applicazione: creeremo una gerarchia di classi nel compito iniziale.

La nostra pianta è un robot dalle forme geometriche. Li visualizzeremo sullo schermo in una visualizzazione testuale e calcoleremo la loro area. Il nostro insieme di figure è retto, quadrato, ellisse, colo.

Rust è un linguaggio elegante che si differenzia da molti altri linguaggi popolari. Ad esempio, invece di utilizzare classi diverse e ridurle, Rust introduce un potente sistema di tipi basato sui tipi. Tuttavia, rispetto il fatto che i programmatori ricchi che sono nuovi a Rust (come me) non abbiano familiarità con i design pattern.

In questo articolo voglio discutere del modello di progettazione nuovo tipo(newtype), così come i tipi From e Into, che aiutano con i tipi ricreati.

Per il resto del tempo ho passato molto tempo a pensare ai modelli di progettazione e alle tecniche che utilizziamo nella programmazione. È davvero meraviglioso: inizia a seguire il progetto e impara i modelli e gli stili familiari che hai sentito più di una volta. Ciò rende il progetto più facile da comprendere e consente di velocizzare il lavoro.

A volte stai lavorando a un nuovo progetto e ti rendi conto che devi fare lo stesso che hai fatto nell'ultimo progetto. Ciò potrebbe non far parte della funzionalità o della libreria, ma potrebbe non essere possibile racchiudere una macro sottile o un piccolo contenitore. Potrebbe trattarsi semplicemente di un modello di progettazione o di un concetto strutturale che inquadra meglio il problema.

Un modello semplice che spesso si blocca in tali problemi è la “mitragliatrice Kintseviy”. Vorrei dedicare qualche ora per capire a cosa sto prestando attenzione a queste parole e perché sono così importanti.

Di seguito è riportata una descrizione grafica dello spostamento, della copia e della memorizzazione del programma Rust. Fondamentalmente questi concetti sono specifici di Rust e spesso rappresentano un ostacolo per i principianti.

Per evitare confusione, ho cercato di mantenere il testo al minimo. Questa nota non sostituisce i vari sussidi iniziali ed è piuttosto elaborata da coloro che apprezzano che le informazioni visive siano più facili da comprendere. Se hai iniziato a imparare Rust e sei interessato a questi grafici, ti consiglio di contrassegnare il tuo codice con diagrammi simili per una facile comprensione.

L'implementazione dell'aritmetica dei numeri naturali con l'aggiunta dei numeri di Peano è un compito popolare nella programmazione. È stato interessante che possano essere implementati in Rust.

Pertanto, il mio compito è scrivere i numeri naturali e confrontarli con tipi uguali.

Secondo Wikipedia “Gli assiomi di Peano sono uno dei sistemi di assiomi per i numeri naturali, introdotti nel XIX secolo dal matematico italiano Giuseppe Peano”.

Possiamo identificarne due: per aiuto, puoi introdurre e utilizzare i numeri naturali:

  • 1 è un numero naturale
  • Anche il numero che viene dopo il naturale è naturale.

Scriviamo parola per parola in ruggine per chiedere aiuto:

1 2 3 4 enum Nat (Zero, Succ (Nat))

Nat è zero o un numero naturale.

Rispetto: il progetto futures-rs ha subito riorganizzazioni e molti discorsi sono stati rinominati. È possibile, è possibile, è stato aggiornato.

Cominciamo a lavorare con il futuro

Questo documento ti aiuterà a sviluppare un contenitore per la programmazione Rust: i futures, che garantirà l'implementazione di futures e stream con rilascio zero. Futures è disponibile in una varietà di altri linguaggi di programmazione, come C++, Java e Scala, e il contenitore futures attinge da queste librerie. Tuttavia, è importante ergonomicamente, e anche perseguire la filosofia dell'astrazione con versatilità zero, il potere di Rust e di se stesso: per la creazione di composizioni future, la memoria non è richiesta, ma per Task è necessaria. , è necessaria una sola allocazione. I futures sono la base per input/output asincroni e altamente produttivi in ​​Rust, e le prime storie sulla produttività mostrano che un semplice server HTTP che richiede futures è molto veloce.

Questa documentazione è suddivisa in diverse sezioni:

  • “Ciao, luce!”;
  • digitare futuro;
  • digitare Flusso;
  • futuri e flussi specifici (Stream);
  • svolta del futuro;
  • Compito e futuro;
  • dati locali.

Rispetto: il progetto futures-rs ha subito riorganizzazioni e molti discorsi sono stati rinominati. È possibile, è possibile, è stato aggiornato.

Una delle principali radure nell'ecosistema Rust è efficiente ed efficace ingresso/video asincrono. Abbiamo un'ottima base dalla libreria mio, e ancora di più: dobbiamo aprire manualmente le macchine finali e destreggiarci tra i clic del cancello.

Vorremmo qualcosa di più radicale, con una bella ergonomia, ma non è abbastanza buono disposizione sostenere un ecosistema di astrazioni asincrone che lavorano insieme. Sembra molto familiare: lo stesso meta è stato riesaminato Cos'è il futuro?(o promesse) in molte lingue che sostengono la perfezione sintattica nell'apparenza asincrono/attendo in cima.

Gli obiettivi attraenti sono tipi numerici, supportati da processori, che sono vicini a un insieme infinito di numeri interi utilizzati per operare nella vita reale. Questa espressione è sempre paragonabile ai numeri reali, ad esempio 255_u8 + 1 == 0. Molto spesso, un programmatore dimentica tutte queste differenze, il che può portare a bug.

Rust è un tipo di programmazione che evita i bug concentrandosi sull'eliminazione di quelli più disponibili, salvando il lavoro dalla memoria e cercando anche di aiutare il programma a evitare altri problemi: scusa e, come preferiamo, rinnova i numeri interi.

Un po' di ferro

Iron è un framework web di alta qualità scritto dal mio programma Rust e basato su un'altra iper libreria. Disintegrazione del ferro in tale ordine, in modo da accelerare tutte le vittorie che Rust ci regala. Il ferro ha al suo interno operazioni di blocco uniche.

Filosofia

Il ferro si basa sul principio di ampliare il più possibile la pavimentazione. Dobbiamo introdurre un concetto per espandere la funzionalità di alimentazione:

  • tipi "intermedi": vengono utilizzati per implementare funzionalità trasversali nell'elaborazione delle query;
  • I modificatori vengono utilizzati per modificare input e output nel modo più ergonomico.

Imparerai la parte base dei modificatori e dei tipi intermedi durante le statistiche.

Creazione del progetto

Per cominciare, creiamo il progetto con l'aiuto di Cargo, il team di vikory:

Il file compilato viene estratto:

1 2 3 $ rusticc ciao.rs $ du -h ciao 632K ciao

632 kilobyte per una semplice stampa? Rust è posizionato come un linguaggio di sistema che ha il potenziale per sostituire C/C++, non è vero? Perché non testare un programma simile sul tuo concorrente più vicino?

La nostra classe media ha un’idea generale secondo cui uno dei vantaggi della contabilità selettiva è la facilità di sviluppare strutture di dati altamente produttive e prive di vincoli. Gestire manualmente la memoria al loro interno non è facile e GC risolve facilmente questo problema.

Questo post mostrerà come, come wiki di Rust, puoi implementare un'API di gestione della memoria per strutture dati simultanee, come:

  • Incoraggiare l'implementazione di una struttura dati senza blocchi per abilitare GC;
  • Creare una protezione statica dagli schemi vikoristannya sbagliati della memoria keruvannya;
  • Le fatture GC verranno pareggiate (e ulteriormente trasferite).

Nei test, come mostrerò di seguito, Rust supera facilmente le implementazioni di Java senza blocchi e l'implementazione stessa è facile da scrivere in Rust.

Ho implementato uno schema di gestione della memoria basato sulle epoche (“epoch-based memory reclamation”) nella nuova libreria Crossbeam, che ora è pronta per utilizzare le tue strutture dati. In questo post imparerò a conoscere le strutture dati prive di blocchi, l'algoritmo era e l'API Rust interna.

I benefici per l'accesso alla memoria e il flusso di memoria hanno due categorie di benefici che attirano il massimo rispetto, quindi è molto difficile evitarli o volerne modificare la quantità. Sebbene i loro nomi trasmettano somiglianza, il fetore del mondo del canto è diametralmente prolungato e il primo dei problemi non ci salva dall'altro. L'ampia gamma di pietre conferma questa idea: interferiscono con l'accesso alla memoria, assumendosi il lavoro di questa vasta memoria.

Apparentemente più semplice: interruzione dell'accesso alla memoria – tutto questo è dovuto a dati errati e perdita di memoria – questo disponibilità cantare azioni con dati corretti. In forma tabellare:

Ho molti pensieri sulla nostra programmazione.

Prima di tutto, ci stiamo avvicinando a questo in modo sbagliato. Canto che anche tu hai provato le stesse cose. Stai cercando di imparare una nuova lingua e non capisci bene come tutto sia governato da essa. Perché viene utilizzata una sintassi in un posto e in un altro? Tutte queste cose combattono in modo diverso e di conseguenza ci rivolgiamo al solito linguaggio.

Rispetto il fatto che il nostro spirito ci stia facendo del male. Indovina l'ultima volta che hai parlato di una nuova lingua. Qualcuno ha indovinato questo, e qualcun altro è rimasto colpito dalla sua semplicità, sintassi o struttura web ovvia.

Questo è molto simile alla discussione sulle automobili. Chi chuli sulla nuova UAZ Ribak? Quanto è svedese? Posso portare la nuova barca sull'altra sponda del lago?

Se parliamo delle lingue in modo simile, rispettiamo il fatto che siano intercambiabili. Macchina Yak. Dato che so guidare Ladoya Saransk, posso guidare una UAZ Ribak senza problemi. La differenza sta solo nella liquidità e nella tastiera, non è vero?

Vediamo come appare un'auto PHP. E ora puoi vedere quanto sia dirompente l'auto Lisp. Passa dall'uno all'altro in modo molto più ampio, ma ricorda come brucia il pulsante.

Nota: questo articolo comunica che il lettore ha familiarità con Rust FFI (traduzione), endianness e ioctl.

Quando crei collegamenti prima del codice, creerai inevitabilmente una struttura per accogliere la tua unificazione. Rust pone l'accento sull'apprendimento quotidiano, quindi dobbiamo sviluppare una strategia per conto nostro. La convergenza è un tipo che memorizza diversi tipi di dati in un'area di memoria. Ci sono molte ragioni per cui questo vantaggio può essere concesso, come ad esempio: conversione tra espressioni binarie di numeri interi e numeri in virgola mobile, implementazione dello pseudo-polimorfismo e accesso diretto ai bit. Mi concentrerò sullo pseudo-polimorfismo.

Bene, vorremmo presentare i vostri rispetti al recente festeggiato (15 marzo 2016 al destino del fiume caduto) - Rust. Questa programmazione universale, sviluppata dall'azienda Mozilla, si basa su tre principi fondamentali: fluidità, sicurezza ed ergonomia. Gli stessi autori lo considerano immodestamente come uno dei maggiori declinatori del C/C++. Basato sul portale StackOverflow, Rust stesso è oggi il più amato dagli sviluppatori di linguaggi. Padre, diamo un'occhiata più da vicino a cosa è.

Ruggine per un principiante

Non voglio ingannare nessuno, quindi ecco una dichiarazione chiara: è facile iniziare con Rust. Innanzitutto si ispira alla giovinezza della lingua e, come eredità, a una piccola quantità di letteratura. D'altra parte, le persone lontane dalla programmazione potrebbero capirla in modo più semplice, avendo meno familiarità con altri linguaggi. Quindi, ad esempio, un contabile IT già pronto ha un forte bisogno di prescrivere le operazioni più piccole e l'assenza di un tale declino nel linguaggio viene semplicemente messa in un vicolo cieco.

Allo stesso tempo, Rust si sta sviluppando rapidamente (una nuova versione esce ogni 6 anni), la forza sta crescendo e trovare informazioni su Internet non è più difficile.

Yak vivichati

Puoi scoprire tutto ciò di cui hai bisogno sul sito ufficiale. Inoltre, la comunità dei follower di Rust è addirittura ampia e gentile, quindi presto potrai andare su IRC (la sezione russa) e sul forum ufficiale. Inoltre, hanno cominciato ad apparire libri e libri elettronici. Per ora è importante valutarne la luminosità, ma questo è un dato di fatto.

Per coloro che hanno superato la fase iniziale dell'apprendimento, su GiHub è possibile trovare molto materiale prezioso, inclusi RFC e commenti. Inoltre, potresti voler guardare in particolare il webcast di una delle conferenze di Rust previste per l'altra metà della giornata. Calendario dell'asse:

  • Conferenza RustConf del 9-10 primavera a Portland, USA;
  • 17a conferenza primaverile della solidarietà europea RustFest a Berlino, Germania;
  • 27a conferenza sulla ruggine della Rust Belt a Pittsburgh, USA;

Bene, per conoscere coloro che apprezzano Rust tra i loro follower e assorbire immediatamente tutta la loro saggezza da loro, puoi contattare gli organizzatori e i partecipanti allo spettacolo in lingua russa a Mosca.

Caratteristiche

Un piccolo duplicato di quanto detto prima, apparentemente i principali pro e contro del linguaggio Rust.

Professionisti:

  • Lavoro sicuro con la memoria;
  • Visoka shvidkodia;
  • Tipo di dati algebrici;
  • Trasferibilità della compilazione;

Svantaggi:

  • Canta la sovramundaneità del codice;
  • L'elevata intensità dello sviluppo della lingua, di conseguenza, è la disponibilità di preziosa letteratura rilevante per l'istruzione;
  • È necessario specificare in modo chiaro e inequivocabile i parametri per la compilazione.

Fino alle modifiche, sulla base della sostituzione dell'eredità con il valore, sentirai rapidamente. Mentre gli occhi di tutti cominciavano a suonare e le loro mani erano occupate, Rust si stava trasformando in un intero linguaggio di lavoro, più semplice e più funzionale del C++, ma compromettendo la “bellezza” di altri ricchi linguaggi di programmazione. In effetti, il principale vantaggio di Rust rispetto ai suoi concorrenti e predecessori è la sua flessibilità e sicurezza.

Richiesta

Oggi Rust è una scelta popolare tra gli sviluppatori di giochi, grafica e sistemi operativi. Tuttavia, per ragionevoli ragioni, nel mondo e ancor più in Russia, il numero di posti fissi che richiedono esperti Rust altamente specializzati è estremamente ridotto. Tim non è da meno, finché non ci sono cambiamenti visibili di opinione, tanto che la città è nell'oblio, più simile al previsto seppellimento del mondo. Inoltre, buone competenze in Rust ti aiuteranno a trovare un lavoro ben retribuito sia nel nostro paese che all'estero.

Più richiesta: professione “Statti”.

Rust si sta sviluppando costantemente, nuove funzionalità e correzioni vengono introdotte con un rilascio della skin ogni 6 giorni. I bug segnalati vengono corretti tempestivamente anche nelle versioni minori irregolari. Tuttavia, tali dinamiche di sviluppo potrebbero essere stravolte: molte librerie “live” richiederanno una nuova versione del compilatore, altrimenti ogni azienda lo aggiornerà presto sui propri progetti.

Sebbene l’infrastruttura intorno a Rust voglia svilupparsi, rimarrà comunque in rovina. Ci sono molte librerie che vogliono lavorare in modo coerente, ma in realtà richiederanno piccole modifiche. Se sei pronto per eseguire il fork di tali librerie su GitHub e modificarle facilmente in base alle tue esigenze, penso che non avrai problemi particolari con i wiki di Rust nei progetti di combattimento.

Per quanto ne so, non esiste ancora un'unica raccolta delle migliori pratiche dal sito web di Rust. Di racconti rossi ce ne sono moltissimi nella documentazione ufficiale (i cosiddetti Libri), e anche sparsi tra vari articoli correlati. Bene, ci sono elenchi di articoli interessanti che ti aiuteranno a trovarne la metà. Ad esempio, qi:
https://github.com/ctjhoa/rust-learning
https://github.com/brson/rust-anthology/blob/maste...

Nei nuovi progetti Rust è in fase di sviluppo e la tendenza è ancora in espansione. In questa pagina puoi vedere quali aziende stanno promuovendo Rust e perché: https://www.rust-lang.org/en-US/friends.html

Quindi, se hai intenzione di rilevare Rust dal venditore, preparati a questo:

  1. Porta l'alta soglia dell'ingresso alla lingua. Non c'è alcuna complessità particolare qui, ho solo bisogno di un po' di pratica e almeno un'ora per mettere a punto il compilatore per rimuovere le compilazioni di compilazione, che falliscono costantemente.
  2. Aggiungi parti dell'aggiornamento del compilatore per aggiungere nuove funzionalità al linguaggio. Ciò può portare al fatto che è necessaria la libreria con l'ultima versione del compilatore.
  3. Biblioteche orfane. Sicuramente dovrai esaminarne alcuni tu stesso.
  4. La ruggine è più facile da piegare, ma più facile da piegare. Per progetti molto semplici che non richiedono elevata produttività e lavoro serio, Rust potrebbe non essere la scelta migliore.
Cosa apprendi dalla wiki di Rust?
  1. Elevata produttività del programma, gestione automatica della memoria senza resettare la memoria.
  2. Elevata affidabilità e sicurezza dei programmi, eliminando un gran numero di potenziali problemi in fase di compilazione.
  3. Completa un processo semplice e senza problemi di refactoring e ulteriore modifica dei programmi per interrompere il sistema di tipi.
  4. Il sistema di depositi per il progetto è stato ampliato.
  5. Uno strumento universale davvero valido: Rust è adatto sia per la prototipazione che per lo sviluppo e per qualsiasi tipo di programma (utilità, programmi desktop, componenti aggiuntivi web, programmi mobili, sistemi, ecc.). Un buon ritocco non è ancora per tutti, ma in futuro sarà un grande vantaggio.

Nel 2013, Mozilla, insieme a Samsung, ha annunciato la creazione di un nuovo meccanismo di browser web, Servo. È stato creato appositamente per processori high-core di dispositivi mobili, progettato per suddividere le attività in thread paralleli e modificare l'orario di accesso alle pagine Web. Servo si basa sulla scrittura del mio programma Rust, come lo stesso Mozilla ha sviluppato per scrivere applicazioni mobili.

A proposito della lingua

Rust è un linguaggio di programmazione procedurale che incoraggia una varietà di stili di codifica. Lo sviluppatore Graydon Hoare ha iniziato a creare il linguaggio nel 2006 e tre anni prima che Mozilla si unisse al progetto. 2010 Rust è stato presentato alla conferenza Mozilla Summit. Per qualche ragione, lo sviluppo è stato trasferito al compilatore, scrivendo in Rust. Il compilatore ha utilizzato un sistema universale per analizzare e trasformare i programmi LLVM come database.

La prima versione stabile del film è stata rilasciata nel 2015. Dopo il rilascio della versione alpha di Rust, dopo aver riconosciuto le modifiche, la parte centrale del compilatore ha perso la capacità di non modificare. Rashta è stato trasferito nella sezione sperimentale.

Al centro del film, il Graydon Choir ha la seguente comprensione:

  • Sicurezza
  • Rust ha un costo basso per il programmatore coinvolto nel processo. Per abilitarli nei blocchi e nelle funzioni è necessaria l'etichetta unsafe.
  • Shvidkist. Mova può essere paragonato per la sua velocità ad altri programmi C++, il che offre numerosi vantaggi al programmatore.
  • Parallelismo.

Il sistema può annullare più calcoli contemporaneamente e allo stesso tempo possono interagire tra loro.

Brevità. Le prime parole chiave in Rust erano lunghe cinque caratteri. Già questo scambio si era realizzato.

  • Un esempio di uno dei primi codici Rust
  • Tuttavia, Rust non presenta vantaggi o svantaggi, ecco i punti salienti:
  • Sovramundaneità del codice.

Sostanza della letteratura e della lingua.

Chiarezza dei parametri di compilazione inseriti. Questo non è sempre un requisito per la verifica dei programmi, poiché in altre lingue non esistono regole del genere.

Inoltre, il linguaggio viene regolarmente modernizzato e aggiornato: viene aggiornato ogni 6 anni.

  • Aggiornamento di Rust da C++
  • I creatori di Rust lo rispettano come discendente del C++, che è un vino sulla pannocchia degli anni '80, se allo sviluppatore è venuta l'idea di migliorarlo nel linguaggio S. Pertanto, è possibile equalizzare la lingua giovane con un cambiamento nel tempo.
  • Ritorna alla memoria lontana. In C++, ci sono pochi problemi che possono sorgere attraverso queste modifiche. Questo tipo di complessità è impossibile in Rust, poiché non ci sono comandi di memoria remota. Il compilatore ti informerà rapidamente che il codice è stato corretto e il compilatore C++ visualizzerà il risultato senza rimuovere i valori e non ti informerà del problema.

Speck in coma. Aggiungendo un punto al codice, chiami un'interruzione in C++, proprio come in Rust il corpo del ciclo si trova vicino alla figura dell'arco.

Codice non sicuro. Rust ha un'etichetta non sicura, che isola il codice sottostante come non sicuro. In futuro, in meno di un'ora di revisione del codice, farà risuonare il suono dei conflitti.

Esistono reali implementazioni di Firefox in C++: questo linguaggio primitivo richiede attenzione ai dettagli. Altrimenti, le modifiche si sarebbero rivelate gravi conseguenze. Rust chiama per farla franca con questo problema.

Prospettive

Stack Overflow è un popolare sistema per fornire informazioni sulla programmazione, sviluppato nel 2008.

La popolarità di Rust è confermata dal numero di aziende che lo utilizzano nei loro sviluppi. Ci sono 105 organizzazioni in questo flusso.

© 2023 androidas.ru - Tutto su Android