Rust (linguagem de programação)

Origem: Wikipédia, a enciclopédia livre.
Rust
Logo do Rust
Paradigma Multiparadigma:
Surgido em 2010 (11–12 anos)
Última versão 1.64.0 (22 de setembro de 2022; há 10 dias[1])
Versão em teste 1.65.0 (22 de setembro de 2022; há 10 dias)
Criado por Graydon Hoare
Estilo de tipagem
  • estática
  • forte
  • inferida
Principais implementações
Influenciada por
Influenciou
Plataforma
Prioridade 1
Prioridade 2
Sistema operacional
Prioridade 1
Prioridade 2
Licença: MIT ou Apache 2.0[8]
Extensão do arquivo:
  • .rs
  • .rlib
Página oficial www.rust-lang.org

Rust é uma linguagem de programação multiparadigma compilada desenvolvida pela Mozilla Research.[9] É projetada para ser "segura, concorrente e prática", mas diferente de outras linguagens seguras, Rust não usa coletor de lixo.[10][11] Possui suporte nativo ao WebAssembly.[12][13]

A linguagem apareceu como um projeto pessoal de Graydon Hoare, empregado da Mozilla. A organização começou a apoiar o projeto em 2009 e anunciou-o em 2010. No mesmo ano, os esforços mudaram do compilador original (escrito em OCaml) para um auto-hospedado feito em Rust. Conhecido por rustc, conseguiu compilar-se pela primeira vez em 2011 e utiliza o LLVM como back-end. Foi lançada pela primeira vez uma versão numerada pré-alfa em 2012. Rust 1.0, a primeira versão estável, foi lançada em 15 de maio de 2015.[14]

Foi considerada pelo público a linguagem "mais amada" por seis anos consecutivos, de acordo com pesquisas conduzidas pelo site Stack Overflow de 2016 a 2022,[15][16][17][18][19][20][21] e está entre as 25 linguagens mais populares, de acordo com pesquisas conduzidas pela RedMonk desde 2018.[22][23][24][25][26]

Design[editar | editar código-fonte]

Rust se baseia nos seguintes princípios: segurança sem coletor de lixo, concorrência sem disputa de dados e abstração sem overhead.[27] Estes princípios fazem com que Rust seja rápida para ser usada em aplicações de baixo nível como o motor de renderização Servo[28] e também prática para projetos de alto nível.

Em Rust não existem ponteiros nulos ou ponteiros soltos, impossibilitando falhas de segmentação. Rust gerencia memória e recursos automaticamente,[29] sem necessitar de um coletor de lixo. A linguagem impede condição de corridas entre threads pois não é possível que duas threads possam modificar um mesmo valor ao mesmo tempo. Para que uma referência possa ser compartilhada entre várias threads, ela deve ser somente leitura. Existem diversas técnicas seguras de comunicação entre threads.[30]

O princípio de abstração sem overhead vem do C++. Nas palavras de Bjarne Stroustrup: "Você não paga por aquilo que você não usa. E mais: aquilo que você usa, não conseguiria programar melhor à mão".[31] Rust permite um alto grau de abstração através do sistema de traits, que são interfaces que podem ser implementadas separadamente da declaração de um tipo.[32] Tipos genéricos são utilizados extensamente.

O projeto Rust usa o conceito de "canais de lançamento", semelhante ao Mozilla Firefox; são 3 canais: Nightly, Beta e Stable ("estável"). Diariamente é lançada uma nova versão Nightly, e a cada seis semanas a última versão desse canal é promovida para Beta, e só receberá atualizações para corrigir falhas sérias. Simultaneamente, a última versão Beta é promovida para Stable.[33][34][35]

Eventualmente a sintaxe da linguagem evolui, e novas palavras-chave podem ser adicionadas. Para evitar a quebra de compatibilidade com códigos antigos, novas edições são lançadas, que projetos antigos podem ativar opcionalmente;[36] a última edição foi a 2021.[37] Também é possível usar palavras-chave como identificadores, usando a seguinte sintaxe:[38]

// `match` é uma palavra-chave
fn r#match(needle: &str, haystack: &str) -> bool {
    haystack.contains(needle)
}

Enumerações e casamento de padrões[editar | editar código-fonte]

Rust possui enumerações de tipagem forte, e suas variantes podem carregar valores diversos. Casamento de padrões é muito importante em Rust, pois as enumerações são a base do tratamento de erros.[39] Exemplo de declaração de enumerações e o casamento de padrões:

enum Browser {
    Chrome,
    Firefox,
    Safari,
    Edge,
    Ie(u8),
}

let browser = Browser::Ie(11);
match browser {
    Browser::Chrome | Browser::Edge => println!("Chromium"),
    Browser::Ie(version) => println!("Internet Explorer {version}"),
    _ => println!("Outro navegador"),
}

O comando match pode retornar valores e também pode ser usado com outros tipos.[39] Exemplo:

let age = 27u8;
let category = match age {
    // `0..=4` é um padrão inclusivo (inclui 0, 1, 2, 3 e 4)
    0..=4 => "bebê",
    5..=13 => "criança",
    14..=17 => "adolescente",
    18.. => "adulto",
};
println!("Com {age} ano(s) você é considerado {category}.");

Inexistência de valor[editar | editar código-fonte]

Rust usa enumerações para representar a inexistência de um valor na forma de enum Option<T> { None, Some(T) }.[39] Exemplo:

let website = Some("https://www.wikipedia.org"); // `website: Option<&str>`
match website {
    None => println!("Website não especificado."),
    Some(addr) => println!("Website: {addr}"),
}

// Forma alternativa (ignora inexistência)
if let Some(addr) = website {
    println!("Website: {addr}");
}

Existem métodos na biblioteca padrão que simplificam esse tipo de tratamento. Alguns exemplos:[40]

let url1: Option<&str> = None;
let url2: Option<String> = None;

// Fornece um valor reserva
let website = url1.unwrap_or("http://www.example.com");

// Fornece o valor padrão do tipo (string vazia)
let website = url1.unwrap_or_default();

// Constrói um valor reserva através de uma clausura
let domain = "www.example.com";
let website = url2.unwrap_or_else(|| format!("http://{domain}"));

// Aborta (pânico)
let website = url1.unwrap();

// Aborta com uma explicação
let website = url1.expect("endereço inexistente");

Semelhante ao operador ?. em outras linguagens, também existem métodos que permitem trabalhar com o possível valor de forma segura. Alguns exemplos:[40]

let website: Option<&str> = Some("https://www.wikipedia.org");

// Transforma o valor, se houver algum
let len = website.map(|d| d.len()); // `len: Option<usize>`

// Trabalha com o valor, se houver algum. A clausura precisa retornar Option
let domain = website.and_then(|addr| addr.strip_prefix("https://")); // `domain: Option<&str>`

Tratamento de erros[editar | editar código-fonte]

Rust não possui exceções como em C++. Ao invés disso, possui duas representações de erros: recuperáveis e irrecuperáveis. Os erros recuperáveis são os esperados no fluxo normal de um programa, e são comunicados através do retorno de funções na forma de enum Result<T, E> { Ok(T), Err(E) }.[41] Exemplo de um erro personalizado:

use std::error::Error;
use std::fmt;

// Erros podem ser de qualquer tipo
#[derive(Debug)]
#[non_exhaustive]
enum ValueError {
    TooSmall,
    TooLarge,
}

// Descrição do erro
impl fmt::Display for ValueError {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        use ValueError::*;
        match self {
            TooSmall => "número muito pequeno",
            TooLarge => "número muito grande",
        }
        .fmt(f)
    }
}

// Métodos para extrair backtraces, entre outras coisas
impl Error for ValueError {}

// Função que pode falhar
fn verify(n: i64) -> Result<i64, ValueError> {
    if n < 4 {
        Err(ValueError::TooSmall)
    } else if n > 20 {
        Err(ValueError::TooLarge)
    } else {
        Ok(n)
    }
}

E o tratamento do erro:

fn main() {
    match verify(3) {
        Ok(n) => println!("Número: {n}"),
        Err(err) => eprintln!("Erro: {err}"),
    }

    match verify(4) {
        Ok(n) => println!("Número: {n}"),
        Err(err) => eprintln!("Erro: {err}"),
    }
}

É possível simplificar o código retornando prematuramente os erros com o operador ?:[41]

use std::error::Error;

// `Box<dyn Error>` representa qualquer tipo que implemente `Error`
type AnyError = Box<dyn Error>;

fn main() -> Result<(), AnyError> {
    println!("Número: {}", verify(3)?);
    println!("Número: {}", verify(4)?); // A segunda chamada só ocorrerá se a primeira não falhar
    Ok(()) // Retorna "sucesso"
}

Os erros irrecuperáveis são usados para sinalizar problemas na lógica de um programa, como divisões por zero, e causam o encerramento do programa.[41] Exemplo:

for i in -5..5 {
    println!("{}", 10 / i); // Pânico: divisão por zero
}

panic!("isto não deveria acontecer!"); // Alerta "pânico" manualmente

Em alguns casos óbvios de "pânico", como na divisão por zero, o compilador pode se recusar a compilar o código. Rust permite recuperar de alguns "pânicos" com a função especial std::panic::catch_unwind, que não deve ser usada para emular o tratamento de exceções de C++.[42]

Genéricos e ownership[editar | editar código-fonte]

Rust possui suporte a programação genérica[43] e o conceito de ownership[44] (posse). Valores podem ter apenas um dono; quando o dono sai de escopo, o valor é destruído. Valores podem ser emprestados (borrowing) ou movidos (move).[45] Em certas ocasiões, como em referências circulares, é necessário especificar o lifetime (tempo de vida) de uma referência.[46] Exemplo de uma árvore binária em Rust:

// `'a` é um lifetime, e `T` é um tipo genérico
#[derive(Debug)]
enum Tree<'a, T> {
    Empty,
    Node(T, &'a Tree<'a, T>, &'a Tree<'a, T>),
}

use Tree::{Empty, Node};

let tree = &Node(5.96, &Empty, &Node(1.0, &Empty, &Empty));

// O primeiro membro é movido; ignora demais membros
if let Node(value, ..) = tree {
    println!("{value:?}");
}

// Ignora o primeiro membro; o terceiro membro é emprestado
if let Node(_, left, ref right) = tree {
    println!("-> {left:?}");
    println!("-> {right:?}");
}

Rust é mais restrita que outras linguagens; um valor imutável pode ter várias referências, mas um valor mutável pode ter apenas uma. Para o segundo caso, é necessário usar uma das várias estruturas de referências como std::rc::Rc, std::rc::Weak, std::cell::RefCell (mutabilidade interna), entre outras.[47] Outra possibilidade é o uso de alocação de arena.[48]

Se houver ambiguidade na invocação de um método genérico, o tipo pode ser explicitado com o símbolo turbofish (::<>).[49] Exemplo:

let dollar = "5.96".parse::<f64>().unwrap();
println!("US$ 1.00 = R$ {dollar}");

Também é possível passar valores constantes como parâmetros genéricos. Exemplo:[50]

struct Array<T, const N: usize> {
    data: [T; N],
}

let arr = Array { data: [0u64; 5] }; // `arr: Array<u64, 5>`

Strings[editar | editar código-fonte]

Rust possui dois tipos principais de strings: &str e String. Ambos são sempre UTF-8 válido.[51] Existe um tempo de vida especial chamado 'static, que indica que a referência é válida até o fim da execução do programa. Todas os literais de strings possuem ele implicitamente:[46]

let hello: &str = "Olá, Mundo!"; // Implicitamente estática
let hello: &'static str = "Olá, Mundo!"; // O mesmo que acima

Enquanto &str é estático e imutável, String é alocado dinamicamente.[52] Exemplo:

use std::io;

let mut nums = vec![];
let mut buf = String::new(); // Novo buffer

// Usa o buffer para ler a entrada padrão.
// `Ok(n)` é a quantidade de bytes lida, onde 0 equivale a EOF.
while let Ok(1..) = io::stdin().read_line(&mut buf) {
    let input = buf.trim(); // Retorna `&str` sem os espaços em branco
    if input.is_empty() {
        break;
    }
    nums.push(input.parse::<f64>().unwrap());
    buf.clear(); // Limpa o buffer para reutilizar
}
println!("Entrada: {nums:?}");

Uma função pode usar std::borrow::Cow para retornar &str ou String conforme a necessidade de mutação/ownership.[53]

Traços e orientação a objetos[editar | editar código-fonte]

Rust possui suporte a traços (traits) que podem ser implementados por estruturas, enumerações, uniões e tipos básicos.[54][55] Traços podem ser deriváveis, como o Debug, onde é gerado um código padrão para implementar o traço em um objeto marcado com o atributo #[derive(…)].[56] A implementação padrão é definida através de macros procedurais.[57] Exemplo de traços:

trait Animal {
    // Método estático que retorna uma string estática
    fn type_name() -> &'static str;

    // `&self` é uma referência a instância
    fn flee(&self); // O mesmo que `fn flee(&self) -> ();`
}

trait Feline: Animal {
    // Traços podem fornecer definições padrões para métodos
    fn meow(&self) {
        println!("Miau!");
    }
}
struct Cat<'a> {
    name: &'a str,
}

impl Animal for Cat<'_> {
    fn type_name() -> &'static str {
        "Cat"
    }

    fn flee(&self) {
        println!("{} fugiu.", self.name);
    }
}

impl Feline for Cat<'_> {}

// E o mesmo para `Dog`…
let type_name = Cat::type_name(); // Método estático
let cat = Cat { name: "Charlotte" }; // Nova instância
cat.flee(); // O mesmo que `Animal::flee(&cat);`
cat.meow(); // O mesmo que `Cat::meow(&cat);`

Estruturas, enumerações, uniões e funções podem especificar os traços dos membros/parâmetros de forma estática (genérica):[54]

fn do_flee<T>(animal: &T)
where
    T: Animal,
{
    animal.flee();
}
// Ou o equivalente:
fn do_walk<T: Animal>(animal: &T) {
    animal.flee();
}
// Ou de forma mais compacta (incompatível com o turbofish):
fn do_walk(animal: &impl Animal) {
    animal.flee();
}

Ou de forma dinâmica (trait objects):[55]

fn do_walk(animal: &dyn Animal) {
    animal.flee();
}

Em ambos os casos a instância é passada da mesma maneira:[54][55]

let cat = Cat { name: "Charlotte" };
let dog = Dog { name: "Duke" };

do_walk(&cat);
do_walk(&dog);

Por fim, traços podem ter "tipos associados" que devem ser especificados ao implementar.[58] Exemplo:

trait Iterator {
    type Item;
    /* ... */
}

impl Iterator for Counter {
    type Item = u32;
    /* ... */
}

fn count(iter: &mut impl Iterator<Item = u32>) {
    /* ... */
}

Iteradores e clausuras[editar | editar código-fonte]

Em Rust, todos os iteradores implementam trait Iterator { type Item; /* ... */ }, que fornece métodos adaptadores para consumir ou criar novos iteradores. Também possui um literal para representar intervalos (um tipo de iterador).[59] No exemplo a seguir o programa lista os números primos entre 4 e 20:

let mut numbers = vec![];
// `4..=20` é um iterador inclusivo (inclui 20)
for i in 4..=20 {
    // `2..i` é um iterador exclusivo, ex.: `2..5` inclui 2, 3 e 4.
    // `|x| i % x != 0` é uma clausura que recebe `x` e retorna booliano.
    if (2..i).all(|x| i % x != 0) {
        numbers.push(i);
    }
}
println!("Os números primos entre 4 e 20 são: {numbers:?}");

Clausuras podem capturar valores do ambiente de três maneiras: emprestando imutavelmente, mutavelmente ou movendo. A última é realizada com a palavra-chave move.[60] Exemplo:

use std::thread;

let msg = "Olá, Mundo!".to_owned();

thread::spawn(move || {
    println!("{msg}"); // `msg` movido aqui
});

As clausuras são representadas por três traços:[60]

  • trait Fn<Args> { type Output; /* ... */ } – empresta valores do ambiente imutavelmente
  • trait FnMut<Args>: Fn<Args> { /* ... */ } – empresta valores do ambiente mutavelmente
  • trait FnOnce<Args>: FnMut<Args> { /* ... */ } – move os valores do ambiente e pode ser chamada apenas uma vez

Exemplo:

fn convert<F>(num: f64, handler: F) -> f64
where
    F: FnOnce(f64) -> f64, // Assinatura da clausura
{
    handler(num)
}

fn main() {
    let y = convert(499.0, |num| num * 5.96);
    println!("{y}");
}

Clausuras possuem um tipo único, mesmo que com a mesma assinatura; por esse motivo, para retornar uma clausura de uma função, é necessário usar uma sintaxe especial:[54]

fn convert() -> impl FnOnce(f64) -> f64 {
    move |num| num * 5.96
}

fn main() {
    let f = convert();
    println!("{y}", y = f(499.99));
}

Por fim, é possível passar estruturas tuplas ou variantes de enumerações onde se espera clausuras. Exemplo:

let seq: Box<_> = (1..=5).map(Some).collect();
println!("{seq:?}"); // [Some(1), Some(2), Some(3), Some(4), Some(5)]

Unsafe[editar | editar código-fonte]

Certas atividades consideradas inseguras, como deferência de ponteiros e uso de funções unsafe, precisam estar dentro de blocos unsafe.[61] Dentro desses blocos é responsabilidade do programador evitar comportamento indefinido.[62] Exemplo do uso de Assembly inline:[63]

use std::arch::asm;

// Multiplica `x` por 6 usando `shifts` e `adds`
let mut x: u64 = 4;
unsafe {
    asm!(
        "mov {tmp}, {x}",
        "shl {tmp}, 1",
        "shl {x}, 2",
        "add {x}, {tmp}",
        x = inout(reg) x,
        tmp = out(reg) _,
    );
}
assert_eq!(x, 4 * 6);

Ponteiros[editar | editar código-fonte]

A criação de ponteiros não é uma atividade insegura, mas a deferência é. Exemplo retirado da documentação oficial:[61]

let mut num = 5;

let r1 = &num as *const i32; // Ponteiro constante para `num`
let r2 = &mut num as *mut i32; // Ponteiro mutável para `num`

unsafe {
    println!("r1 is: {}", *r1); // Deferência
    println!("r2 is: {}", *r2); // Deferência
}

Unions[editar | editar código-fonte]

Rust suporta unions para compatibilidade com a linguagem C, e são inerentemente inseguros,[61] podendo resultar em comportamento indefinido se usados incorretamente.[64] Exemplo retirado da documentação oficial:[64]

#[repr(C)]
union MyUnion {
    f1: u32,
    f2: f32,
}

let u = MyUnion { f1: 1 };
let f = unsafe { u.f1 }; // Leitura de campo

Exemplos[editar | editar código-fonte]

Programa Olá Mundo[editar | editar código-fonte]

Ver artigo principal: Programa Olá Mundo
fn main() {
    println!("Olá, Mundo!");
}

Pode ser compilado e executado com o seguinte comando:[65]

$ cargo run

Algoritmo de Trabb Pardo-Knuth[editar | editar código-fonte]

Ver artigo principal: Algoritmo de Trabb Pardo-Knuth
use std::{io, iter::zip};

fn f(t: f64) -> f64 {
    t.abs().sqrt() + 5.0 * t.powi(3)
}

fn main() {
    let mut a = [0f64; 11];
    for (t, input) in zip(&mut a, io::stdin().lines()) {
        *t = input.unwrap().parse().unwrap();
    }

    a.iter().enumerate().rev().for_each(|(i, &t)| match f(t) {
        y if y > 400.0 => println!("{i} TOO LARGE"),
        y => println!("{i} {y}"),
    });
}

Rust lida com transbordamento numérico retornando f64::NAN.

Analisador sintático[editar | editar código-fonte]

Exemplo de um analisador sintático usando um parser combinator:

use nom::bytes::complete::{tag, take_while_m_n};
use nom::{combinator::map_res, sequence::tuple, IResult};
use std::num::ParseIntError;

#[derive(Debug)]
pub struct Color {
    pub red: u8,
    pub green: u8,
    pub blue: u8,
}

fn from_hex(input: &str) -> Result<u8, ParseIntError> {
    u8::from_str_radix(input, 16)
}

fn is_hex_digit(c: char) -> bool {
    c.is_ascii_hexdigit()
}

fn hex_primary(input: &str) -> IResult<&str, u8> {
    map_res(take_while_m_n(2, 2, is_hex_digit), from_hex)(input)
}

fn hex_color(input: &str) -> IResult<&str, Color> {
    let (input, _) = tag("#")(input)?;
    let (input, (red, green, blue)) = tuple((hex_primary, hex_primary, hex_primary))(input)?;

    Ok((input, Color { red, green, blue }))
}

fn main() {
    let (_, color) = hex_color("#2F14DF").unwrap();
    println!("#2F14DF = {color:?}");
}

E as dependências no arquivo Cargo.toml:

[dependencies]
nom = "7.1"

Servidor HTTP[editar | editar código-fonte]

Ver artigos principais: Hypertext Transfer Protocol e REST

Exemplo de um web service RESTful (HTTP) usando funções assíncronas e serialização; responde com um JSON ao acessar http://localhost:8080/hello/Mundo:

use actix_web::{get, web, App, HttpServer, Responder};
use serde::Serialize;
use time::{serde::rfc3339, OffsetDateTime};

#[derive(Serialize)]
struct Hello {
    message: String,
    #[serde(with = "rfc3339")]
    timestamp: OffsetDateTime,
}

#[get("/hello/{name}")]
async fn hello(name: web::Path<String>) -> impl Responder {
    web::Json(Hello {
        message: format!("Olá, {name}!"),
        timestamp: OffsetDateTime::now_utc(),
    })
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| App::new().service(hello))
        .bind(("127.0.0.1", 8080))?
        .run()
        .await
}

E as dependências no arquivo Cargo.toml:

[dependencies]
actix-web = "4"

[dependencies.serde]
version = "1.0"
features = ["derive"]

[dependencies.time]
version = "0.3.7"
features = ["serde-well-known"]

Interface de linha de comandos[editar | editar código-fonte]

Ver artigo principal: Interface de linha de comandos

Exemplo de uma implementação do echo do Unix:

use clap::Parser;

/// Ecoa o(s) TEXTO(s) para a saída padrão.
#[derive(Parser, Debug)]
#[command(author, version)]
struct Args {
    /// Não emitir o caractere de nova linha do final.
    #[arg(short = 'n')]
    strip_trailing_newline: bool,
    #[arg(value_name = "TEXTO")]
    strings: Vec<String>,
}

fn main() {
    let args = Args::parse();
    let output = args.strings.join(" ");

    print!("{output}");
    if !args.strip_trailing_newline {
        println!();
    }
}

E as dependências no arquivo Cargo.toml:

[dependencies.clap]
version = "4.0"
features = ["derive"]

Interface gráfica[editar | editar código-fonte]

Ver artigos principais: Interface gráfica do utilizador e GTK

Exemplo de uma interface gráfica usando GTK 4:

use gtk::glib::{self, clone};
use gtk::{prelude::*, Application, ApplicationWindow, Button};
use std::process;

fn main() {
    // Cria um novo aplicativo
    let app = Application::builder()
        .application_id("com.example.Hello")
        .build();

    // Quando o aplicativo for ativado
    app.connect_activate(|app| {
        // Cria uma nova janela
        let window = ApplicationWindow::new(app);

        // Cria um novo botão
        let button = Button::with_label("Olá, Mundo!");

        // Quando o botão for clicado, fecha a janela
        button.connect_clicked(clone! { @weak window => move |_| window.close() });
        window.set_child(Some(&button));
        window.present();
    });

    process::exit(app.run());
}

E as dependências no arquivo Cargo.toml:

[dependencies.gtk]
version = "0.4"
package = "gtk4"

Ferramentas[editar | editar código-fonte]

Cargo é a ferramenta de produtividade oficial, e usa arquivos TOML para listar dependências e configurações de um projeto. Um projeto pode ser testado usando o comando $ cargo test[66][67] e formatado com $ cargo fmt.[68] A documentação de um projeto pode ser gerada a partir de comentários especiais em Markdown, usando o comando $ cargo doc.[67][69] Um conjunto de lints opcionais estão disponíveis, e o código pode ser checado usando o comando $ cargo clippy.[68]

Rust possui uma implementação do Language Server Protocol, o rust-analyzer, que fornece autocompletar, formatação e refatoração independente do editor de texto ou ambiente de desenvolvimento integrado. Os seguintes editores dão suporte ao rust-analyzer de forma nativa ou através de extensões/plugins:[68]

Outras ferramentas dão suporte a Rust através de implementações próprias sem o uso do rust-analyzer:

Software desenvolvido em Rust[editar | editar código-fonte]

Renderização
Rede
Blockchain
Sistemas operacionais e componentes
Outros

Ver também[editar | editar código-fonte]

Referências

  1. «Announcing Rust 1.64.0». blog.rust-lang.org (em inglês). 22 de setembro de 2022. Consultado em 22 de setembro de 2022 
  2. «What is rustc?». doc.rust-lang.org (em inglês). Consultado em 16 de outubro de 2021 
  3. «WIP libgccjit codegen backend for rust». github.com (em inglês). Consultado em 16 de outubro de 2021 
  4. «GCC Front-End For Rust». rust-gcc.github.io (em inglês). Consultado em 16 de outubro de 2021 
  5. «Appendix: Influences - The Rust Reference» (em inglês). The Rust Project Developers. Consultado em 29 de novembro de 2020 
  6. Tovilo, Ilija (22 de maio de 2020). «PHP RFC: Match expression v2». wiki.php.net. Consultado em 29 de novembro de 2020 
  7. a b c d «Rust Platform Support». doc.rust-lang.org (em inglês). Consultado em 26 de setembro de 2022 
  8. «rust/COPYRIGHT at master · rust-lang/rust». github.com. Consultado em 21 de julho de 2018 
  9. «The Rust Language». Lambda the Ultimate. 8 de julho de 2010. Consultado em 30 de outubro de 2010 
  10. «The Rust Programming Language». Consultado em 21 de outubro de 2012 
  11. «Doc language FAQ». Consultado em 21 de outubro de 2012 
  12. Rediger, Jan-Erik (26 de novembro de 2017). «wasm32-unknown-unknown landed & enabled». www.hellorust.com. Consultado em 11 de dezembro de 2017 
  13. Gattozzi, Michael (5 de dezembro de 2017). «Rust and the case for WebAssembly in 2018». mgattozzi.com. Consultado em 11 de dezembro de 2017 
  14. «Announcing Rust 1.0 - The Rust Programming Language Blog». blog.rust-lang.org. Consultado em 12 de outubro de 2015 
  15. «Stack Overflow Developer Survey 2016 Results». Stack Overflow. 14 de junho de 2016. Consultado em 11 de dezembro de 2017 
  16. «Stack Overflow Developer Survey 2017». Stack Overflow. 7 de junho de 2017. Consultado em 11 de dezembro de 2017 
  17. «Stack Overflow Developer Survey 2018». Stack Overflow. 15 de maio de 2018. Consultado em 16 de abril de 2018 
  18. «Stack Overflow Developer Survey 2019». Stack Overflow. 18 de abril de 2019. Consultado em 9 de julho de 2019 
  19. «Stack Overflow Developer Survey 2020». Stack Overflow. 22 de junho de 2020. Consultado em 21 de julho de 2020 
  20. «Stack Overflow Developer Survey 2021». Stack Overflow. 2 de agosto de 2021. Consultado em 22 de agosto de 2021 
  21. «Stack Overflow Developer Survey 2022». Stack Overflow. 22 de junho de 2022. Consultado em 27 de junho de 2022 
  22. O'Grady, Stephen (7 de março de 2018). «The RedMonk Programming Language Rankings: January 2018» (em inglês). RedMonk. Consultado em 13 de março de 2018 
  23. O'Grady, Stephen (20 de março de 2019). «The RedMonk Programming Language Rankings: January 2019» (em inglês). RedMonk. Consultado em 9 de julho de 2019 
  24. O'Grady, Stephen (28 de fevereiro de 2020). «The RedMonk Programming Language Rankings: January 2020» (em inglês). RedMonk. Consultado em 21 de julho de 2020 
  25. O'Grady, Stephen (1 de março de 2021). «The RedMonk Programming Language Rankings: January 2021» (em inglês). RedMonk. Consultado em 7 de março de 2021 
  26. O'Grady, Stephen (28 de março de 2022). «The RedMonk Programming Language Rankings: January 2022» (em inglês). RedMonk. Consultado em 27 de junho de 2022 
  27. «Rust in 2016 - The Rust Programming Language Blog». blog.rust-lang.org. Consultado em 12 de outubro de 2015 
  28. «servo/servo». GitHub. Consultado em 12 de outubro de 2015 
  29. «Rust Means Never Having to Close a Socket». Inside Skylight. Consultado em 12 de outubro de 2015 
  30. «Fearless Concurrency with Rust - The Rust Programming Language Blog». blog.rust-lang.org. Consultado em 12 de outubro de 2015 
  31. http://www.stroustrup.com/ETAPS-corrected-draft.pdf
  32. «Abstraction without overhead: traits in Rust - The Rust Programming Language Blog». blog.rust-lang.org. Consultado em 12 de outubro de 2015 
  33. Aaron Turon (12 de dezembro de 2014). «Rust 1.0: Scheduling the trains» (em inglês). The Rust Project Developers. Consultado em 6 de setembro de 2017 
  34. «Release Channels - The Rust Programming Language» (em inglês). The Rust Project Developers. Consultado em 6 de setembro de 2017 
  35. «Releases · rust-lang/rust». github.com. Consultado em 15 de fevereiro de 2018 
  36. «Appendix E: Editions - The Rust Programming Language» (em inglês). Consultado em 19 de outubro de 2020 
  37. «Rust 2021 - The Edition Guide» (em inglês). Consultado em 21 de outubro de 2021 
  38. «Appendix A: Keywords - The Rust Programming Language» (em inglês). Consultado em 19 de outubro de 2020 
  39. a b c «Enums and Pattern Matching - The Rust Programming Language, Second Edition» (em inglês). The Rust Project Developers. Consultado em 2 de dezembro de 2017 
  40. a b «std::option::Option - Rust». doc.rust-lang.org (em inglês). Consultado em 7 de abril de 2021 
  41. a b c «Error Handling - The Rust Programming Language, Second Edition» (em inglês). The Rust Project Developers. Consultado em 2 de dezembro de 2017 
  42. «Function std::panic::catch_unwind» (em inglês). The Rust Project Developers. Consultado em 15 de fevereiro de 2018 
  43. «Generic Types, Traits, and Lifetimes - The Rust Programming Language, Second Edition» (em inglês). The Rust Project Developers. Consultado em 28 de julho de 2020 
  44. «What is Ownership? - The Rust Programming Language, Second Edition» (em inglês). The Rust Project Developers. Consultado em 28 de julho de 2020 
  45. «References and Borrowing - The Rust Programming Language, Second Edition» (em inglês). The Rust Project Developers. Consultado em 30 de agosto de 2020 
  46. a b «Validating References with Lifetimes - The Rust Programming Language, Second Edition» (em inglês). The Rust Project Developers. Consultado em 23 de janeiro de 2021 
  47. «RefCell<T> and the Interior Mutability Pattern - The Rust Programming Language, Second Edition» (em inglês). The Rust Project Developers. Consultado em 30 de agosto de 2020 
  48. «Graphs and arena allocation | Rust for C++ Programmers» (em inglês). Consultado em 30 de agosto de 2020 
  49. «Appendix B: Operators and Symbols - The Rust Programming Language, Second Edition» (em inglês). The Rust Project Developers. Consultado em 31 de dezembro de 2020 
  50. «Const generics MVP hits beta!». blog.rust-lang.org (em inglês). 26 de fevereiro de 2021. Consultado em 26 de março de 2021 
  51. «str - Rust». doc.rust-lang.org (em inglês). Consultado em 18 de março de 2022 
  52. «std::string::String - Rust». doc.rust-lang.org (em inglês). Consultado em 18 de março de 2022 
  53. «std::borrow::Cow - Rust». doc.rust-lang.org (em inglês). Consultado em 19 de março de 2022 
  54. a b c d «Traits: Defining Shared Behavior - The Rust Programming Language, Second Edition» (em inglês). The Rust Project Developers. Consultado em 30 de dezembro de 2020 
  55. a b c «Using Trait Objects That Allow for Values of Different Types - The Rust Programming Language, Second Edition» (em inglês). The Rust Project Developers. Consultado em 30 de dezembro de 2020 
  56. «Appendix C: Derivable Traits - The Rust Programming Language, Second Edition» (em inglês). The Rust Project Developers. Consultado em 23 de janeiro de 2021 
  57. «Appendix D: Macros - The Rust Programming Language, Second Edition» (em inglês). The Rust Project Developers. Consultado em 23 de janeiro de 2021 
  58. «Advanced Traits - The Rust Programming Language, Second Edition» (em inglês). The Rust Project Developers. Consultado em 27 de maio de 2022 
  59. «Iterators - The Rust Programming Language, Second Edition» (em inglês). The Rust Project Developers. Consultado em 5 de dezembro de 2017 
  60. a b «Closures - The Rust Programming Language, Second Edition» (em inglês). The Rust Project Developers. Consultado em 5 de dezembro de 2017 
  61. a b c «Unsafe Rust - The Rust Programming Language» (em inglês). The Rust Project Developers. Consultado em 24 de fevereiro de 2022 
  62. «Behavior considered undefined - The Rust Reference» (em inglês). The Rust Project Developers. Consultado em 2 de junho de 2022 
  63. «Announcing Rust 1.59.0 § Inline assembly». blog.rust-lang.org (em inglês). 24 de fevereiro de 2022. Consultado em 24 de fevereiro de 2022 
  64. a b «Unions - The Rust Reference» (em inglês). The Rust Project Developers. Consultado em 18 de março de 2022 
  65. «Hello, World! - The Rust Programming Language, Second Edition» (em inglês). The Rust Project Developers. Consultado em 6 de setembro de 2017 
  66. «Cargo Guide» (em inglês). Consultado em 26 de setembro de 2017 
  67. a b «The Manifest Format» (em inglês). Consultado em 26 de setembro de 2017 
  68. a b c «Tools - Rust Programming Language». www.rust-lang.org (em inglês). Consultado em 2 de junho de 2022 
  69. «Documentation - The Rust Programming Language» (em inglês). 1 de outubro de 2016. Consultado em 26 de setembro de 2017 
  70. Herman, Dave (12 de julho de 2016). «Shipping Rust in Firefox» (em inglês). Mozilla. Consultado em 9 de agosto de 2020 
  71. Mena Quintero, Federico (3 de janeiro de 2017). «Librsvg 2.41.0 is released». mail.gnome.org (em inglês). Consultado em 9 de agosto de 2020 
  72. Mena Quintero, Federico (9 de agosto de 2017). «Replacing C library code with Rust: What I learned with librsvg» (PDF). people.gnome.org (em inglês). Consultado em 9 de agosto de 2020 
  73. «Image administration - MediaWiki». www.mediawiki.org (em inglês). Consultado em 9 de agosto de 2020 
  74. McArthur, Sean (28 de junho de 2021). «How using hyper in curl can help make the internet safer» (em inglês). Amazon Web Services. Consultado em 18 de março de 2022 
  75. Howarth, Jesse (4 de fevereiro de 2020). «Why Discord is switching from Go to Rust» (em inglês). Discord. Consultado em 9 de agosto de 2020 
  76. «GNOME Fractal - GitLab». gitlab.gnome.org (em inglês). Consultado em 27 de março de 2021 
  77. «The Wilmington Watch: A Tor Network Team Hackfest» (em inglês). blog.torproject.org. 5 de julho de 2017. Consultado em 9 de agosto de 2020 
  78. «Arti 0.1.0 is released: Your somewhat-stable API is here!» (em inglês). blog.torproject.org. 1 de março de 2022. Consultado em 18 de março de 2022 
  79. Balbaert, Ivo (27 de maio de 2015). Rust Essentials (em inglês). [S.l.]: Packt Publishing. p. 6. 184 páginas. ISBN 978-1-7852-8576-9. Consultado em 9 de agosto de 2020 
  80. Frank, Denis (5 de dezembro de 2013). «Using HyperLogLog to Detect Malware Faster Than Ever». OpenDNS Security Labs. Consultado em 9 de agosto de 2020 
  81. Denis, Frank (4 de outubro de 2013). «ZeroMQ: Helping us Block Malicious Domains in Real Time». OpenDNS Security Labs. Consultado em 9 de agosto de 2020 
  82. Wu, Yuchen; Hauck, Andrew (14 de setembro de 2022). «How we built Pingora, the proxy that connects Cloudflare to the Internet» (em inglês). Cloudflare. Consultado em 22 de setembro de 2022 
  83. Pack, Steven (16 de outubro de 2018). «Serverless Rust with Cloudflare Workers» (em inglês). Cloudflare. Consultado em 9 de agosto de 2020 
  84. Nichols, Shaun (27 de junho de 2018). «Serverless Rust with Cloudflare Workers» (em inglês). The Register. Consultado em 27 de março de 2021 
  85. «Community makes Rust an easy choice for npm» (PDF) (em inglês). The Rust Project Developers. 25 de fevereiro de 2019. Consultado em 9 de agosto de 2020 
  86. Gupta, Akhil (14 de março 2016). «Scaling to exabytes and beyond» (em inglês). Dropbox. Consultado em 9 de agosto de 2020 
  87. Metz, Cade (14 de março 2016). «The Epic Story of Dropbox's Exodus From the Amazon Cloud Empire» (em inglês). Wired. Consultado em 9 de agosto de 2020 
  88. Wilm, Joe (21 de março 2016). «OneSignal now sends iOS push notifications 100x faster». onesignal.com (em inglês). Consultado em 28 de maio de 2022 
  89. Wilm, Joe (4 de janeiro 2017). «Rust at OneSignal». onesignal.com (em inglês). Consultado em 28 de maio de 2022 
  90. Wallace, Evan (2 de maio 2018). «Rust in Production at Figma». How Mozilla’s Rust dramatically improved our server-side performance (em inglês). Figma. Consultado em 19 de maio de 2022 
  91. «Diem association» (em inglês). www.diem.com. Consultado em 20 de dezembro de 2020 
  92. «GitHub - diem/diem: Diem's mission is to enable a simple global payment system and financial infrastructure that empowers billions of people.». github.com (em inglês). Consultado em 20 de dezembro de 2020 
  93. «Polkadot Implementations». wiki.polkadot.network (em inglês). Consultado em 19 de maio de 2022 
  94. «OpenEthereum». openethereum.github.io (em inglês). Consultado em 27 de março de 2021 
  95. Vander Stoep, Jeff; Hines, Stephen (6 de abril de 2021). «Rust in the Android platform» (em inglês). Google. Consultado em 22 de abril de 2021 
  96. Almeida Filho, Wedson (14 de abril de 2021). «Rust in the Linux kernel» (em inglês). Google. Consultado em 22 de abril de 2021 
  97. Ojeda, Miguel (14 de abril de 2021). «[PATCH 00/13] [RFC] Rust support» (em inglês). LKML. Consultado em 22 de abril de 2021 
  98. Vaughan-Nichols, Steven (19 de setembro de 2022). «Linus Torvalds: Rust will go into Linux 6.1» (em inglês). ZDNet. Consultado em 22 de setembro de 2022 
  99. «Language usage in Fuchsia». fuchsia.dev (em inglês). Consultado em 27 de março de 2021 
  100. «Using Rust in Windows - Microsoft Security Response Center» (em inglês). Microsoft. 7 de novembro 2019. Consultado em 9 de agosto de 2020 
  101. Yegulalp, Serdar (21 de março de 2016). «Rust's Redox OS could show Linux a few new tricks» (em inglês). InfoWorld. Consultado em 9 de agosto de 2020 
  102. Mena Quintero, Federico (21 de novembro 2019). «Remove libcroco». gitlab.gnome.org (em inglês). Consultado em 27 de março de 2021 
  103. «gst-plugins-rs - Various GStreamer plugins written in Rust». gitlab.freedesktop.org (em inglês). Consultado em 27 de março de 2021 
  104. «Writing GStreamer plugins and elements in Rust». coaxion.net (em inglês). 17 de maio de 2016. Consultado em 27 de março de 2021 
  105. «Fedora 29 new features: Startis now officially in Fedora». www.marksei.com (em inglês). 10 de outubro de 2018. Consultado em 9 de agosto de 2020 
  106. Brown, Sarah (4 de dezembro de 2019). «1Password X 1.17: New brain, new menu, and even more accessible». blog.1password.com (em inglês). Consultado em 29 de setembro de 2021 
  107. Dreimanis, Gints (20 de janeiro de 2021). «Rust in Production: 1Password». serokell.io (em inglês). Consultado em 29 de setembro de 2021 
  108. «Visual Studio Code March 2017 (version 1.11) - Text search improvements». code.visualstudio.com (em inglês). Março de 2017. Consultado em 9 de agosto de 2020 
  109. Dahl, Ryan; Belder, Bert; Iwańczuk, Bartek (12 de maio de 2020). «Deno 1.0» (em inglês). Consultado em 9 de agosto de 2020 
  110. Levien, Raph (23 de janeiro de 2018). «Xi: an editor for the next 20 years» (em inglês). Consultado em 9 de agosto de 2020 
  111. «A modern editor with a backend written in Rust» (em inglês). Google. Consultado em 9 de agosto de 2020 

Bibliografia[editar | editar código-fonte]

  • Klabnik, Steve; Nichols, Carol (6 agosto de 2019) [julho de 2018]. The Rust Programming Language. Covers Rust 2018 (em inglês) 2 ed. [S.l.]: No Starch Press. 526 páginas. ISBN 978-1-7185-0044-0 
  • Balbaert, Ivo (7 de novembro de 2017) [27 de maio de 2015]. Rust Essentials. A Quick Guide to Writing Fast, Safe, and Concurrent Systems and Applications (em inglês) 2 ed. [S.l.]: Packt Publishing. 264 páginas. ISBN 978-1-7883-9913-5 

Ligações externas[editar | editar código-fonte]