- Rust e Swift compartilham um sistema de tipos robusto e características de linguagens funcionais, e podem ser compiladas para código nativo e WASM por meio de compiladores baseados em LLVM
- Rust começou como uma linguagem de sistemas de baixo nível e passou a oferecer recursos de alto nível, enquanto Swift começou como uma linguagem de alto nível e permite acesso de baixo nível
- Swift usa tipos por valor e Copy-on-Write por padrão e implementa conceitos semelhantes ao modelo de ownership do Rust com uma sintaxe mais simples
- Em tipos opcionais, tratamento de erros e enums recursivos, Swift envolve conceitos do Rust em uma sintaxe familiar da família C, oferecendo mais conveniência aos desenvolvedores
- Swift está evoluindo como linguagem multiplataforma e pode ser usado também em Windows, Linux e ambientes embarcados, surgindo como alternativa ao Rust
Semelhanças e diferenças entre Rust e Swift
- As duas linguagens incluem características de linguagens funcionais (enum tagged, expressões match/switch, genéricos, funções de primeira classe)
- Rust oferece contagem de referências e controle de cópia por meio de
Rc, Arc e Cow
- Swift usa por padrão tipos por valor e Copy-on-Write e, quando necessário, oferece suporte a movimentação de ownership (move) e acesso a ponteiros unsafe
- As duas linguagens usam compiladores baseados em LLVM, podendo ser compiladas em código nativo e WASM
Modelo de memória: Rust de baixo para cima, Swift de cima para baixo
- Rust começou como uma linguagem de sistemas de baixo nível e passou a oferecer recursos de alto nível
- Swift começou como uma linguagem de alto nível e, quando necessário, permite acesso de baixo nível
- O modelo de memória padrão do Swift é de tipos por valor com Copy-on-Write, semelhante a
Cow<> do Rust
- Rust é rápido por padrão, mas exige lidar explicitamente com
Cow<> quando ele é usado
- Swift é simples por padrão e pode optar por movimentar em vez de copiar
Abordagem sintática do Swift: escondendo conceitos do Rust em estilo C
- A instrução
switch do Swift cumpre, na prática, a mesma função da expressão match do Rust
- Suporta pattern matching e não tem
fallthrough
- O
enum do Swift pode incluir métodos diretamente, permitindo um uso mais orientado a objetos do que no Rust
- O tipo opcional (
T?) é o mesmo conceito de Option<T> no Rust, e nil corresponde a None
- Em Swift, é possível fazer unwrapping com segurança usando a sintaxe
if let val
- O tratamento de erros é semelhante ao tipo
Result do Rust, e do-catch e try no Swift são a mesma estrutura envolta em uma sintaxe mais familiar
Diferenças no funcionamento do compilador
- O compilador do Rust prioriza detecção de problemas e avisos e, por exemplo, força o uso de
Box<> ao definir enums recursivos
- Swift lida com enums recursivos apenas com a palavra-chave
indirect, e o compilador automatiza o gerenciamento interno de ponteiros
- Swift faz mais tratamento automatizado do que Rust, então o desenvolvedor precisa lidar menos diretamente com a estrutura de memória
Praticidade do Swift e extensibilidade da linguagem
- Swift foi projetada para substituir o Objective-C, sendo uma linguagem maior e mais prática
- Já inclui vários recursos, como classes/herança, async-await, actors, propriedades lazy, property wrappers e Result Builders
- O design de “progressive disclosure” faz com que mais recursos apareçam à medida que o aprendizado avança
Equilíbrio entre conveniência e desempenho
- Swift é uma linguagem fácil de começar e produtiva, enquanto Rust é uma linguagem rápida por padrão
- Em Rust, “rápido é o padrão”; em Swift, “conveniência é o padrão”
- Rust é adequado para sistemas, embarcados, compiladores e motores de navegador
- Swift é adequado para UI, servidores e alguns componentes de sistemas operacionais, e as áreas de uso das duas linguagens estão se sobrepondo gradualmente
Expansão multiplataforma do Swift
- Swift já não é mais uma linguagem exclusiva da Apple
- Windows: a The Browser Company a usa para compartilhamento de código no navegador Arc
- Linux: a Apple oferece suporte a Swift on Server e patrocina conferências
- Embedded Swift: usado em pequenos dispositivos como o Panic Playdate
- O blog oficial do Swift apresenta projetos para Windows, Embedded, Linux (Gnome) e Playdate
- Swift também está melhorando a experiência de desenvolvimento fora do Xcode com extensão para VSCode, open source do LSP e mais
Limites do Swift e sua posição atual
- O tempo de compilação é lento, assim como no Rust
- A linguagem cresceu com o feature creep, e parte da sintaxe não é familiar
- O ecossistema de pacotes é menos maduro que o do Rust
- Ainda assim, Swift já é uma linguagem multiplataforma com estabilidade de ABI, Automatic Reference Counting (ARC), recursos para escolha de ownership e pacotes compatíveis com Linux
- Swift está se consolidando como uma alternativa mais conveniente ao Rust e existe como opção atual, não como um futuro distante
1 comentários
Comentários do Hacker News
Concordo em grande parte, mas é nos detalhes que aparece o cerne do problema
O Xcode é uma IDE tosca em projetos grandes, travando com frequência ao atualizar pacotes ou lidar com múltiplos targets. Mesmo tentando corrigir, não dá para aplicar patch em binário
O sistema de build é muito mais fácil de lidar no Cargo do que no SPM. O sistema de macros ainda depende de geração de código externa
Há linter e formatter, mas a qualidade é baixa. O Swift tem muitos penhascos de performance, e a inferência de tipos é bidirecional, ficando lenta em expressões complexas. Isso é especialmente problemático em casos de uso importantes como SwiftUI
Como os imports são agrupados no nível do módulo, mudar um único arquivo já exige recompilar o módulo inteiro. A distinção entre classes e structs também é estranha por causa da compatibilidade com ObjC
No fim, o Swift até pode ser uma linguagem mais fácil que Rust, mas por causa da imaturidade do ecossistema de ferramentas na prática não parece ser
O modelo de memória semiautomático do Swift parece muito mais difícil de lidar do que em Rust ou Go
swift, que já é boa o suficiente. Também funciona bem em Linux e WindowsDisseram que em Rust é preciso
Boxpara representar uma estrutura em árvore com enum, mas na prática isso é desnecessário porqueVecjá fornece referência para o heapEm Rust, enum, struct, union e até tipos primitivos podem ter métodos. Por exemplo, dá para fazer chamadas como
'F'.to_digit(16)Dá até para anexar métodos a raw pointers. Acho que isso mostra o design moderno do Rust
VeceBox.Vecé um handle de tamanho fixo em tempo de compilação, eBoxé necessário para lidar com tipos unsizedBoxVec<T>já é um handle de tamanho fixo que aponta para dados no heap, então não precisa deBoxSwift é uma linguagem legal, mas no lado do servidor ela convence pouco
O ecossistema é pequeno e, comparado a Go ou Rust, não oferece muito ganho. O suporte no VSCode também é fraco e eu não quero usar Xcode
O desenvolvimento de servidor já está ocupado por Python, TypeScript, Go e Rust. O ecossistema fechado da Apple também pesa
A qualidade da IDE é melhor do que em outras linguagens, e acho que Rust é mais adequado para programação de sistemas
Dizem que Swift agora é uma linguagem multiplataforma, mas no Linux ele ainda continua com um ecossistema centrado na Apple
Documentação, tutoriais e bibliotecas são todos escritos tendo macOS como base. Fico me perguntando se alguém realmente usa Swift sem dispositivo Apple
Organizei em um blog o processo que vivi ao criar um cliente WebSocket
Versão de 2023 / Versão de 2025
O suporte a Android também é interessante, mas sinto que Kotlin já basta
NSHashTablenão existe fora das plataformas ApplePessoalmente, mantenho bibliotecas com suporte até para Windows. Não é perfeito, mas está melhorando aos poucos
O
switchdo Swift é na prática uma expressão match. Só muda a sintaxe; ele faz pattern matchingswitche reduzir a confusão dos desenvolvedoresIntroduzir um novo significado com sintaxe familiar induz uma transição gradual
Essa abordagem leva a uma discussão interessante sobre até que ponto uma linguagem deve buscar um design opinativo
O núcleo do Rust é zero-cost abstraction. O Swift não segue esse princípio
Muitos recursos do Rust foram projetados para obedecer a essa regra, e o modelo de ownership é um exemplo representativo
Há uma curva de aprendizado, mas isso melhora a eficiência no desenvolvimento
Disseram que o navegador Arc usou Swift no Windows, mas depois da interrupção do desenvolvimento parece que esse trabalho relacionado também foi cancelado
O motivo de eu preferir Rust é que ele não tem dependência de big tech. Acho que a Apple pode abandonar o Swift
Isso também está indicado no artigo da Wikipédia
Aproveitando os recursos de reference counting do Rust, dá para obter praticidade sem migrar para Swift
Com
Rc, dá para ter referências compartilhadas imutáveis, e com interior mutability dá para implementar alterações baseadas em checagem em runtimeDocumentação de Rc, documentação de interior mutability
Já criei ferramentas de análise e compiladores para Linux em Swift e Rust
No Swift, o ARC facilita a gestão de memória; no Rust, é preciso pensar mais, mas a qualidade das ferramentas é muito melhor
O suporte de Clippy e LSP é excelente, e o Swift traz muitos recursos nativos
Ainda assim, como a comunidade Rust é maior, é mais fácil encontrar gente, e acho que Swift também tem potencial como linguagem substituta de C++