Rust é a melhor linguagem para aprender programação (talvez)
Meu primeiro contato com programação foi aprendendo Python, seguido de JavaScript e PHP com o Curso em Vídeo. Também utilizei Java durante o ensino médio técnico.
Em todas essas ocasiões, nunca fui muito além do básico:
- Estruturas de condição e repetição
- Funções e recursão
- Um pouco de arrays
Independentemente das possíveis consequências de ficar "pulando de galho em galho" (eu tinha só 14 anos, dá pra perdoar), um efeito positivo foi que isso me fez não me apegar a sintaxes. Saí dessa fase com o pensamento:
Bom, se eu precisar de uma tecnologia, é só aprender.
Meu primeiro impulso ao começar um novo projeto passou a ser o de querer usar uma stack totalmente nova. Já me dei mal com isso algumas vezes...
Agora, na faculdade, estou aprendendo C, com seus ponteiros e tudo a que tem direito, além de POO com Java. De novo, quase nenhuma novidade conceitual (tirando alocação dinâmica). A curva de aprendizado existe, obviamente, mas o esforço se resume a:
Como eu escrevo tal coisa nesta linguagem?
A experiência com Rust
Aprender Rust tem sido uma experiência diferente e revigorante, cheia de oportunidades para explorar conceitos que eu ainda não dominava.
Muitas vezes, na programação do dia a dia, você pode simplesmente ignorar um problema de eficiência, usar um .clone() e seguir em frente. Provavelmente é isso que tenho feito durante toda a minha vida sem perceber. Graças ao compilador do Rust, descobri que venho implementando soluções subótimas em quase todos os meus códigos.
É a isso que me refiro quando digo "oportunidades para aprender".
Não tenho dúvidas de que sou um iniciante, mas também não duvido da minha capacidade de aprender Rust. E imagino que, no final, terei aprendido muito mais do que apenas uma nova linguagem.
Recentemente, estava resolvendo um problema fácil no LeetCode que envolvia um vetor de strings. Fui pesquisar as funções padrão do tipo String e notei que algumas pediam uma referência (&str), enquanto outras exigiam a posse da própria String. Lá fui eu pesquisar a diferença.
Em outro desafio, precisei iterar sobre os caracteres de uma string e, ao mesmo tempo, espiar o próximo caractere. Para isso, usei o método .chars() para criar o iterador e o .peekable() para me permitir ver o próximo elemento. Para acessar o valor "espiado", precisei desreferenciar a variável com o operador *.
Descobri esse operador consultando uma IA e não descansei até entender o que ele fazia. Fui mais fundo e aprendi a diferença entre desreferenciar com * e usar .clone(). A resposta estava no fato de que certos tipos, como String, não implementam a trait Copy.
Pesquisando mais, descobri que a trait Copy permite uma cópia "byte a byte" de um dado, enquanto Clone executa um procedimento específico para criar uma duplicata em outro lugar da memória.
Isso me levou a um conceito fundamental: a diferença entre a Stack e o Heap.
Uma String em Rust é, essencialmente, um conjunto de metadados na Stack (ponteiro, tamanho e capacidade) que aponta para o texto real, alocado no Heap. Se você copiasse uma String byte a byte, acabaria com duas variáveis na Stack apontando para o mesmo endereço no Heap.
Isso destruiria a garantia de segurança de memória do Rust, pois permitiria que duas variáveis tivessem posse (ownership) sobre o mesmo dado, levando a problemas como o double free.
Para evitar isso, tipos como String implementam sua própria lógica de clonagem, que envolve alocar um novo espaço no Heap, copiar o texto para lá e, só então, criar uma nova String na Stack que aponta para este novo endereço.
Por todos os motivos que falei agora, diria que Rust é uma das melhores linguagens para aprender a programar. Ou pelo menos a melhor em te mostrar o que você ainda não sabe.
Diria que POO não é muito a minha praia, e traits estão me ajudando a entender pelo menos um pouco de sobrescrever(se não me engano) funções e é o que vou estudar mais a fundo em seguida.
Vendem Rust como zero-cost abstraction e como solução para todos os problemas. Não sei o suficiente para bater o martelo, mas me parece bem útil. O que você acha? Quero continuar falando sobre Rust e sobre o processo de aprendizado na área. Por favor compartilhe o que você sabe ou sugestões nos comentários!