4 pontos por GN⁺ 2024-09-07 | 1 comentários | Compartilhar no WhatsApp

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, Arc e Cow para suportar contagem de referências e "clone-on-write"
  • Quando é necessário trabalhar em um nível mais baixo, é possível usar o sistema unsafe para 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 unsafe para 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 Cow exige 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 match de Rust e a instrução switch de Swift
  • A instrução switch de Swift é, na prática, igual a uma expressão match, mas com outro nome e outra sintaxe
  • Swift permite adicionar métodos diretamente a enum

Tipos opcionais

  • Rust não tem null, mas tem None
  • Swift tem nil, mas na prática é o mesmo que None
  • Swift usa T? em vez de Option, 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 tipo Result
  • Swift usa do-catch em vez de try-catch, e é preciso usar try antes 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 indirect para 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

 
GN⁺ 2024-09-07
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 oferece uma comunidade familiar para hackers Unix
  • Rust foi a primeira linguagem a levar gerenciamento automático de memória sem GC ao mainstream

    • Também existem alternativas como Swift, OCaml e Scala
  • A era de Smalltalk acabou; agora é a era de ML

    • As linguagens dos anos 2000 derivam de Smalltalk
    • As linguagens novas são da família ML
    • Se você aprender Scala, também conseguirá aprender Rust ou Swift com facilidade
  • Ao trabalhar na integração de Rust em apps iOS feitos em Swift, bateu vontade de usar mais Swift

    • Swift pode ser usado de forma multiplataforma, mas mira principalmente as plataformas da Apple
    • Rust tem vários sistemas de pacotes
    • Pacotes Swift muitas vezes dependem de APIs do sistema operacional, então não funcionam em Linux ou WASM
    • Houve o caso de a IBM abandonar Swift no servidor
  • Rust introduziu o conceito de ownership para resolver problemas de gerenciamento de memória, mas não foi quem inventou isso

    • Linguagens como Cyclone influenciaram isso
  • Rust e Swift têm pontos fortes diferentes

    • Swift tem uma sintaxe mais concisa, mas algumas áreas são reservadas ao compilador
    • Fora do ecossistema Apple, Swift costuma ser a segunda ou terceira linguagem mais importante
    • Se isso não for resolvido, Swift provavelmente continuará sendo principalmente uma linguagem da Apple
  • As ferramentas de Swift são mais incômodas que as de Rust

    • Xcode não é suportado em um MacBook Air de 2018 rodando macOS 12
    • O SourceKit-LSP é tratado como uma ferramenta de segunda importância
    • Rust 1.81 e rust-analyzer funcionam bem
  • Tentei aprender Rust, mas tive dificuldade porque os exemplos eram complexos demais

    • O código de exemplo no site de Rust é complexo
  • Em Swift, dá para adicionar métodos diretamente a enums

    • Em Rust, também dá para fazer a mesma coisa
  • Swift usa tipos por valor por padrão e semântica de copy-on-write

    • Isso só se aplica a arrays, dicionários e strings
    • Tipos por valor em Swift são copiados imediatamente
  • Sempre que leio textos elogiando Swift, fico curioso sobre a experiência de desenvolvedores que não usam o ecossistema Apple/macOS

    • Nunca conheci um desenvolvedor Swift que não usasse macOS
    • Não importa só a biblioteca padrão, mas também ferramentas, LSP, bibliotecas, tutoriais etc.
    • Acredito que Swift seja uma boa linguagem, mas parece ser boa só no macOS
  • Será que sou o único que não gosta da sintaxe com ponto em Zig e Swift?

    • .variant vs Type::Variant
    • Em código longo ou complexo o bastante, é desconfortável quando o nome do tipo não está por perto
    • Isso é ainda mais verdadeiro em editores sem recursos parecidos com IDE