Swift é um Rust mais conveniente
(blog.namangoel.com)Rust
- Rust é uma linguagem muito querida, rápida e com uma comunidade excelente
- Rust resolve problemas de gerenciamento de memória ao introduzir o conceito de ownership
- Fornece utilitários como
Rc,ArceCowpara suportar contagem de referências e "clone-on-write" - Quando é necessário trabalhar em um nível mais baixo, é possível usar o sistema
unsafepara acessar ponteiros raw de C - Rust tem várias características de linguagens funcionais, como enumerações marcadas, expressões de match, funções de primeira classe e um sistema de tipos poderoso
- Usa um compilador baseado em LLVM e pode compilar para código nativo e WASM
Swift
- Também venho usando Swift há alguns anos e, ao aprender Rust, percebi semelhanças com Swift
- Swift também tem características de linguagens funcionais, como enumerações marcadas, expressões de match e funções de primeira classe
- Swift usa tipos por valor por padrão e tem semântica de "copy-on-write"
- Quando é necessário mais desempenho, é possível optar pelo sistema de ownership para "mover" valores
- Quando é necessário trabalhar em um nível mais baixo, também é possível usar o sistema
unsafepara acessar ponteiros raw de C - Swift também usa um compilador baseado em LLVM e pode compilar para código nativo e WASM
Déjà vu?
- Swift e Rust têm conjuntos de funcionalidades muito parecidos
- A grande diferença está na perspectiva
- A diferença fica clara ao considerar o modelo de memória padrão
Rust é top-down, Swift é bottom-up
- Rust começa como uma linguagem de sistemas de baixo nível e fornece ferramentas para subir ao alto nível
- Swift começa como uma linguagem de alto nível e fornece ferramentas para descer ao baixo nível
- O modelo de gerenciamento de memória é o exemplo mais claro disso
- Swift usa tipos por valor por padrão e tem semântica de "copy-on-write"
- Rust facilita o uso de valores "moved" e "borrowed", mas usar valores
Cowexige trabalho adicional - Swift facilita o uso de valores com "copy-on-write", mas em troca exige trabalho extra ao usar borrowing e move
- Rust é mais rápido por padrão, enquanto Swift é mais simples e fácil por padrão
Swift esconde as ideias de Rust em uma sintaxe parecida com C
- A sintaxe de Swift esconde conceitos de linguagens funcionais em uma sintaxe parecida com C, o que facilita a adoção pelos desenvolvedores
- Comparação entre a instrução
matchde Rust e a instruçãoswitchde Swift - A instrução
switchde Swift é, na prática, igual a uma expressãomatch, mas com outro nome e outra sintaxe - Swift permite adicionar métodos diretamente a
enum
Tipos opcionais
- Rust não tem
null, mas temNone - Swift tem
nil, mas na prática é o mesmo queNone - Swift usa
T?em vez deOption, e o compilador obriga a verificar se não énil - Em Swift, é fácil trabalhar com tipos opcionais
Tratamento de erros
- Rust não tem
try-catch, mas usa o tipoResult - Swift usa
do-catchem vez detry-catch, e é preciso usartryantes de chamar a função - O tratamento de erros de Swift é parecido com o de Rust, mas fica escondido por trás de uma sintaxe mais familiar
O compilador de Rust detecta problemas, e o compilador de Swift resolve alguns deles
- O compilador de Rust detecta muitos problemas comuns em tempo de compilação e sugere soluções
- Exemplo de enumeração autorreferente
- Swift usa a palavra-chave
indirectpara marcar tipos recursivos, e o compilador cuida do resto
Swift é menos "puro"
- Swift foi projetado para substituir Objective-C e precisava ser capaz de interagir com código existente
- Swift fez muitas escolhas práticas e é uma linguagem maior que Rust
- Swift foi projetado com "divulgação progressiva" em mente, de modo que quanto mais se aprende a linguagem, mais funcionalidades aparecem
- Alguns recursos da linguagem Swift:
- classes / herança
- async-await
- async-sequences
- actors
- getters e setters
- lazy properties
- property wrappers
- Result Builders (ex.: HTML / SwiftUI)
O preço da conveniência
- Swift é uma linguagem mais fácil para começar e ganhar produtividade
- A sintaxe é mais familiar e muitas tarefas são tratadas automaticamente
- Swift é uma linguagem de nível mais alto e, com isso, traz os mesmos trade-offs
- Por padrão, programas em Rust são muito mais rápidos do que programas em Swift
- Rust é rápido por padrão e permite ficar lento; Swift é fácil por padrão e permite ficar rápido
- As duas linguagens têm seus próprios usos
- Rust é mais adequado para programação de sistemas e embarcados
- Swift é mais adequado para escrever UI e servidores
- Com o tempo, espera-se que a sobreposição entre as duas linguagens aumente ainda mais
Resumo do GN⁺
- Este texto compara e explica as semelhanças e diferenças entre Swift e Rust
- Swift toma emprestadas muitas ideias de Rust e as oferece em uma sintaxe mais familiar
- As duas linguagens têm seus próprios pontos fortes e usos, e espera-se que com o tempo surjam ainda mais áreas de sobreposição
- Ajuda a entender diferenças em vários aspectos, como modelo de gerenciamento de memória, tratamento de erros e tipos opcionais em Swift e Rust
- Linguagens com recursos parecidos incluem Kotlin e TypeScript
1 comentários
Comentários no Hacker News
As pessoas que gostam de Rust logo de cara geralmente gostam porque foi a primeira vez que tiveram contato com linguagens da família ML
Rust foi a primeira linguagem a levar gerenciamento automático de memória sem GC ao mainstream
A era de Smalltalk acabou; agora é a era de ML
Ao trabalhar na integração de Rust em apps iOS feitos em Swift, bateu vontade de usar mais Swift
Rust introduziu o conceito de ownership para resolver problemas de gerenciamento de memória, mas não foi quem inventou isso
Rust e Swift têm pontos fortes diferentes
As ferramentas de Swift são mais incômodas que as de Rust
Tentei aprender Rust, mas tive dificuldade porque os exemplos eram complexos demais
Em Swift, dá para adicionar métodos diretamente a enums
Swift usa tipos por valor por padrão e semântica de copy-on-write
Sempre que leio textos elogiando Swift, fico curioso sobre a experiência de desenvolvedores que não usam o ecossistema Apple/macOS
Será que sou o único que não gosta da sintaxe com ponto em Zig e Swift?
.variantvsType::Variant