Comparação e análise de Go e Rust

Rust e Go são duas linguagens modernas que ganharam enorme força nos últimos anos, cada uma com seus pontos fortes e vantagens únicas. Nesta postagem, vamos nos aprofundar nas diferenças entre Rust e Go, com foco no desempenho, recursos de linguagem e outros fatores-chave para ajudá-lo a tomar uma decisão informada para suas necessidades de desenvolvimento.

Em 2023, temos mil motivos para aprender Rust.

Em 7 de agosto, a Rust Foundation divulgou os resultados do 2022 Rust Survey Report. Os relatórios mostram que a adoção do Rust continua a aumentar. Mais de 90% dos entrevistados disseram que eram usuários do Rust; o Rust é usado para a maior parte do trabalho de codificação, um aumento massivo de 51,8% em relação ao ano anterior.

Não há dúvida de que Rust tem se tornado cada vez mais o foco da atenção dos desenvolvedores devido à sua excelente segurança de memória e desempenho de simultaneidade. No entanto, também é difícil ignorar Go, um jogador relativamente “veterano” que já foi escolhido como a linguagem de programação do ano.

Nascida em 2009, a linguagem Go recebeu grande atenção desde o início devido ao seu modelo de simultaneidade único e poderosas vantagens de desempenho. É importante notar que, assim como a linguagem Rust, os criadores da linguagem Go também “odiam” C++, e Go também é a linguagem dominante nativo da nuvem.

Na pesquisa de desenvolvedores Stack Overflow 2022, entre as 70.000 respostas à pergunta “Uma linguagem de programação que as pessoas adoram odiar”, os programadores claramente preferem Rust, dos quais 86% disseram que gostam de Rust, 64% das pessoas dizem que gostam de Go. Diante da popularidade do Rust, alguns desenvolvedores se perguntam: ainda vale a pena aprender Go em 2023?

Além disso, nos últimos dois dias, escolher Rust ou Go se tornou um tema quente no Hacker News:

Devo dizer que Go e Rust são definitivamente excelentes linguagens de programação. São modernos, potentes, versáteis e oferecem ótimo desempenho. Mas realmente não faz sentido comparar diretamente Go e Rust, o que é melhor, porque cada linguagem de programação representa uma série de profundas compensações por trás dela. Diferentes linguagens serão otimizadas para diferentes necessidades, portanto, quando escolhemos uma linguagem, devemos também considerar que tipo de problemas queremos resolver com ela. Portanto, começaremos a partir dos cenários aplicáveis ​​das linguagens Go e Rust e discutiremos o "caminho" de design do Go e Rust.

Embora Rust e Go sejam muito diferentes em sintaxe e estilo, ambos são ferramentas de primeira classe para construção de software. Vamos começar a análise específica abaixo.

Go vs. Rust: as semelhanças

Rust e Go têm muito em comum, e é por isso que as pessoas costumam comparar os dois. Que objetivos eles têm em comum?

Rust é uma linguagem de programação multiparadigma de tipagem estática de baixo nível com maior foco em segurança e desempenho.

e:

Go é uma linguagem de programação de código aberto que facilita a construção de software simples, confiável e eficiente.

segurança de memória

Tanto Go quanto Rust são linguagens de programação modernas que levam muito a sério a segurança da memória. Ao longo das décadas de linguagens antigas como C e C++, ficou claro para nós que uma das principais causas de bugs e bugs é o acesso inseguro/incorreto à memória.

Portanto, Rust e Go oferecem soluções diferentes, mas o objetivo de ambos é ser mais inteligente e seguro em termos de gerenciamento de memória e ajudar os desenvolvedores a escrever programas corretos com excelente desempenho.

Executável rápido e compacto

Ambas são linguagens compiladas, o que significa que os programas podem ser traduzidos diretamente em código de máquina executável, permitindo que os programas sejam implantados como um único arquivo binário. Ao contrário de linguagens interpretadas como Python e Ruby, não precisamos de um interpretador e de muitas bibliotecas/dependências para acompanhar nossos programas. Como um reflexo direto dessa força central, os programas Rust and Go tendem a ser executados mais rapidamente do que as linguagens interpretadas.

linguagem comum

Tanto Rust quanto Go são linguagens de programação de uso geral poderosas e extensíveis que podem ser usadas para desenvolver todos os tipos de software moderno – de aplicativos da web a microsserviços distribuídos, microcontroladores incorporados e aplicativos móveis e muito mais.

Ambos possuem bibliotecas padrão excelentes e ecossistemas de terceiros prósperos, aliados a um forte suporte comercial e grandes bases de usuários. Ambos existem há anos e continuarão a prosperar nos próximos anos. Aprender Go ou Rust seria um investimento bastante razoável de tempo e esforço atualmente.

estilo de programação pragmático

Eles não são excessivamente funcionais (como Scala ou Elixir) nem totalmente orientados a objetos (como Java e C#). Pelo contrário, embora Go e Rust tenham funções de programação funcional e orientada a objetos, eles sempre enfatizam uma orientação pragmática - ou seja, resolver problemas da maneira mais adequada, em vez de forçar todos a seguirem um caminho específico através da "ideologia" ... trabalho. ".

Mas se você realmente gosta do estilo de programação funcional, existem opções de ferramentas mais relevantes no lado do Rust, o que é uma das vantagens do Rust sobre o Go.

Certamente podemos discutir sobre o que constitui uma verdadeira linguagem “orientada a objetos”. Mas, para ser justo, o estilo de programação orientado a objetos que os usuários de C++, Java ou C# esperam não existe realmente em Go ou Rust.

desenvolvimento em grande escala

Tanto Rust quanto Go fornecem muitos recursos úteis para programação em larga escala, para que ambos possam se adaptar às necessidades práticas de grandes equipes de desenvolvimento e grandes bases de código.

Por exemplo, os programadores C têm debatido durante anos sobre como colocar parênteses e se o código deve ser recuado com tabulações ou espaços; mas Rust e Go resolveram completamente isso usando ferramentas de formatação padrão (Go tem gofmt, Rust tem ferrugemfmt). Eles reescrevem automaticamente seu código com um estilo consistente.

Não que este formato específico seja sutil, mas os programadores Rust and Go são mais pragmáticos e preferem um padrão de implementação uniforme.

Ninguém gosta do estilo do gofmt, mas o gofmt é o favorito de todos.

Outra grande vantagem das duas linguagens está na construção de pipelines. Ambos possuem ferramentas de gerenciamento de dependência e construção padrão excelentes, integradas e de alto desempenho. Isso significa que os programadores não precisam enfrentar sistemas complexos de construção de terceiros ou aprender um novo a cada poucos anos.

Ferrugem ou vai?

Ditas todas estas questões, e ambas as linguagens tão bem desenhadas e funcionais, qual é o resultado desta competição? Ou, já que ambas são ótimas opções, por que as pessoas ainda ficam indignadas nas redes sociais, escrevendo longas postagens de resenhas em blogs dizendo coisas duras como “Rust é um idiota” ou “Go não é uma linguagem de programação”?

É claro que algumas pessoas querem apenas desabafar suas emoções, mas isso obviamente não ajuda a resolver o problema real. Pelo menos quando se trata de qual linguagem usar em um projeto, ou qual linguagem entrar no mundo da programação, vozes altas claramente não ajudam a fazer a escolha certa.

Voltemos à discussão dos adultos e vejamos quais são as vantagens e desvantagens do Rust and Go sob uma análise racional.

Go vs. Rust: Desempenho

Conforme mencionado anteriormente, tanto Go quanto Rust geram programas que são rápidos porque compilam em código de máquina nativo sem passar por um interpretador ou máquina virtual.

Mas o desempenho do Rust ainda é melhor, até mesmo comparável ao C e C++, que são aclamados como benchmarks de desempenho do setor. E, ao contrário dessas linguagens mais antigas, Rust também oferece segurança de memória e simultaneidade com pouco ou nenhum impacto na velocidade de execução. Rust também permite que os desenvolvedores criem abstrações complexas sem prejudicar o desempenho em tempo de execução.

Por outro lado, embora os programas Go tenham um bom desempenho, eles são projetados com foco na velocidade de desenvolvimento (incluindo compilação) e não na execução. Os programadores Go preferem código limpo e legível, por isso ele será executado mais lentamente.

O compilador Go também não gasta muito tempo gerando o código de máquina mais eficiente, está mais preocupado em compilar grandes quantidades de código rapidamente. Como resultado, os programas Rust geralmente superam os programas Go em benchmarks de tempo de execução.

O desempenho do tempo de execução do Rust também é muito consistente e previsível porque não usa coleta de lixo. O coletor de lixo do Go é muito eficiente e otimizado para manter os tempos de pausa os mais curtos possíveis (os tempos de pausa ficam mais curtos a cada nova versão do Go). Mas de qualquer forma, a coleta de lixo sempre introduzirá alguma imprevisibilidade na forma como o programa se comporta, o que pode ser sério ou até mesmo completamente inaceitável para algumas aplicações (por exemplo, sistemas embarcados).

Simples

Não importa quão poderosa seja uma linguagem de programação se ela for muito difícil de aprender e desanimar a maioria das pessoas. Go parece ter sido projetado deliberadamente para diferenciá-lo de linguagens cada vez mais complexas como C++: ele tem muito pouca sintaxe, poucas palavras-chave e até poucas funções.

Isso significa que a linguagem Go é fácil de aprender e você pode usá-la para escrever todos os tipos de programas com um pouco de compreensão.

A chave aqui é a palavra “simples”. É claro que simples não significa fácil. Mas linguagens pequenas e simples são definitivamente mais fáceis de aprender do que linguagens grandes e complexas. Não há muitas maneiras de obter um efeito, então o código Go de alta qualidade quase sempre parece o mesmo. Isto tem outro benefício: podemos ver rapidamente quais serviços com os quais não estamos familiarizados estão sendo executados.

A ontologia central do Go é pequena, mas a biblioteca padrão é muito poderosa. Dito isto, nossa curva de aprendizado teve que levar em conta esta parte da biblioteca padrão, além da sintaxe Go.

Por outro lado, mover a funcionalidade da linguagem para a biblioteca padrão significa que você só precisa se concentrar em aprender as bibliotecas relevantes para suas necessidades atuais de desenvolvimento.

Go também foi projetado para considerar totalmente as necessidades de desenvolvimento de software em larga escala e pode oferecer suporte forte a grandes bases de código e equipes de desenvolvimento. Nesse cenário, os novos desenvolvedores devem ser capazes de aprender rapidamente. Para tanto, a comunidade Go sempre priorizou a simplicidade, clareza, versatilidade e franqueza dos programas.

Go é uma das linguagens mais produtivas que já usei. O mantra é: Resolva problemas reais hoje.

Função

Rust suporta mais complexidade do que várias outras linguagens de programação e, portanto, uma gama correspondentemente maior de implementações.

Rust foi projetado especificamente para incluir uma variedade de recursos poderosos e úteis que ajudam os programadores a fazer mais com menos código. Por exemplo, a função match do Rust torna possível escrever rapidamente uma lógica flexível e expressiva:

Mas também porque o Rust tem mais considerações de design, é mais difícil de aprender, especialmente no estágio inicial. Mas tudo bem, afinal, C ++ ou Java é muito para aprender e nem oferece os recursos avançados do Rust, como segurança de memória.

Portanto, realmente não faz sentido criticar o som excessivamente complexo do Rust: ele foi projetado para enfatizar a expressividade e a rica funcionalidade, e não podemos esperar que seja tão simples e puro enquanto aproveitamos os benefícios.

Então Rust, é claro, tem sua própria curva de aprendizado. Mas enquanto esta dificuldade for superada, o caminho a seguir será tranquilo.

Rust compete com C++ e D pela participação de programadores que estão prontos para aceitar sintaxe e semântica mais complexas (e possivelmente um custo de legibilidade mais alto) em troca do melhor desempenho possível.

Embora Rust e Go peguem emprestado alguns recursos um do outro (como genéricos), é justo dizer que os recursos do Rust são melhores que os do Go.

simultaneidade

A maioria das linguagens fornece algum tipo de suporte de programação simultânea (ou seja, execução de várias operações ao mesmo tempo), mas Go foi projetado para isso. Em vez de usar threads de sistema operacional, Go oferece uma alternativa leve: goroutines.

Cada goroutine é uma função Go de execução independente que o agendador Go mapeia para um dos threads do sistema operacional sob controle. Ou seja, o escalonador pode gerenciar um grande número de goroutines simultâneas com muita eficiência, usando apenas um número limitado de threads do sistema operacional.

Assim, podemos executar milhões de goroutines simultâneas em um único programa sem nos preocupar com sérios problemas de desempenho. Por causa disso, Go é uma solução completa para cenários de aplicativos simultâneos em larga escala, como servidores web e microsserviços.

Go também fornece canais para goroutines, uma maneira rápida, segura e eficiente de comunicar e compartilhar dados. O nível de design de simultaneidade do Go é realmente muito alto e a experiência de uso é bastante descontraída e agradável.

Em geral, o projeto de programas simultâneos é muito difícil, e construir programas simultâneos confiáveis ​​e corretos em qualquer linguagem não é nada fácil. No entanto, como este requisito foi considerado no início do projeto, o mecanismo de programação simultânea em Go foi tornado o mais simples possível e bem integrado.

Go facilita muito a construção de um aplicativo cuidadosamente decomposto que aproveita ao máximo a simultaneidade quando implantado como um conjunto de microsserviços.

A ferrugem também pode fazer essas coisas, mas é sem dúvida mais difícil. De certa forma, a obsessão de Rust em prevenir falhas de segurança relacionadas à memória significa que os programadores devem fazer um grande esforço para executar tarefas que são mais fáceis em outras linguagens (incluindo Go).

Em contraste, o mecanismo de simultaneidade em Rust acaba de chegar e ainda não se estabilizou, então todos são bem-vindos para continuar a prestar atenção a esta direção de desenvolvimento ativo. Isso também é benéfico. Por exemplo, a biblioteca rayon do Rust oferece uma maneira muito elegante e leve de converter cálculos sequenciais em paralelos.

Embora possa não ser fácil implementar programas simultâneos no Rust, ainda é perfeitamente viável, e esses programas também se beneficiam das garantias de segurança de memória bem projetadas do Rust.

Veja a classe Mutex da biblioteca padrão, por exemplo: em Go, podemos esquecer de adquirir um mutex antes de acessar algo; mas em Rust, não precisamos nos preocupar com isso.

Go tem simultaneidade como seu primeiro conceito. Isso não quer dizer que você não possa encontrar aspectos da simultaneidade orientada a atores do Go no Rust, mas deixe isso como um exercício para o programador.

Segurança

Conforme mencionado anteriormente, tanto Go quanto Rust têm suas próprias maneiras de evitar vários erros comuns de programação, especialmente aqueles relacionados ao gerenciamento de memória. Mas Rust vai um passo além e pode-se dizer que não mede esforços para garantir que ninguém cometa erros inesperados de segurança.

Dito isto, a experiência de programação em Rust é diferente de quase qualquer outra linguagem e pode ser bastante desafiadora quando introduzida pela primeira vez. Mas aos olhos de muitos desenvolvedores, o esforço vale claramente a pena.

Muitas linguagens, incluindo Go, também fornecem ferramentas para ajudar os programadores a evitar erros, mas Rust leva esse efeito a um novo nível. Muitos programas incorretos nem sequer compilam.

Ferrugem vs. Go: diferenças

Embora Rust e Go sejam linguagens modernas populares e amplamente utilizadas, elas não são realmente concorrentes, pois abordam casos de uso muito diferentes.

Toda a abordagem de programação em Go é bem diferente do Rust, recursos que são particularmente atraentes para alguns, mas podem irritar completamente outros. Isso faz sentido, porque se Rust e Go resolvem essencialmente os mesmos problemas de maneiras essencialmente semelhantes, por que precisamos de duas linguagens diferentes?

Então, podemos começar pelas práticas de Rust and Go e interpretar suas respectivas essências? Vamos tentar juntos.

coleta de lixo

“Coletar ou não coletar lixo” é sempre uma pergunta que não tem resposta certa. Coletivamente, a coleta de lixo e o gerenciamento automático de memória podem nos ajudar a desenvolver programas confiáveis ​​e eficientes de maneira rápida e fácil. Portanto, para alguns desenvolvedores, esses são recursos essenciais.

Outros argumentam que a coleta de lixo com sua sobrecarga de desempenho e pausas globais pode levar a um comportamento de tempo de execução imprevisível e introduzir latência inaceitável. Claro, há alguma verdade nesta afirmação.

perto do hardware

A história da programação de computadores pode ser descrita como um desenvolvimento de abstrações cada vez mais complexas. Ele permite que os programadores resolvam problemas sem prestar muita atenção em como o hardware subjacente realmente funciona.

Esse design torna os programas mais fáceis de escrever e mais portáveis. Mas para outros programas, o acesso ao hardware e o controle preciso sobre como o programa é executado são mais importantes.

O objetivo do Rust é aproximar os programadores do hardware e recuperar mais controle; enquanto o Go abstrai detalhes arquitetônicos e permite que os programadores estejam mais próximos dos problemas.

Golang é bom em escrever microsserviços e tarefas típicas de “DevOps”, mas não é uma linguagem de programação de sistemas. Rust é mais poderoso para tarefas onde simultaneidade, segurança e/ou desempenho são importantes; mas tem uma curva de aprendizado mais acentuada que Go.

desempenho primeiro

Na verdade, para a maioria dos programas, o desempenho não é tão importante quanto a legibilidade do código. No entanto, se alguns projetos colocam o desempenho em primeiro lugar, há muitas compensações de design no Rust que o ajudarão a levar seu código até o limite.

Por outro lado, Go se preocupa mais com a simplicidade do código e está até disposto a sacrificar parte do desempenho do tempo de execução por isso. Mas a velocidade de construção do Go é incomparável, o que muitas vezes é ainda mais importante para grandes projetos de código.

Rust tem desempenho mais rápido que Go. Nos benchmarks, o Rust é realmente mais rápido, em alguns casos por uma ordem de grandeza. Mas antes de escolher Rust, vamos ser claros: Go não fica muito atrás na maioria dos benchmarks e ainda mantém uma vantagem de desempenho sobre linguagens como Java, C#, JavaScript e Python.

Escolha qualquer um desses dois idiomas se precisar de desempenho de alto nível, o desempenho de velocidade nunca irá decepcionar. Além disso, se você estiver construindo um serviço da web que lida com cargas pesadas e precisa de escala vertical/horizontal flexível, ambas as linguagens resolverão o problema.

correção

Por outro lado, se você não forçar o programa a nunca falhar, as compensações serão diferentes. A maior parte do código não foi projetada para uso a longo prazo, mas alguns programas são executados em produção durante anos.

Diante dessas realidades, pode valer a pena investir um pouco mais de tempo no desenvolvimento e garantir que o programa funcione de maneira correta e confiável, sem criar uma pesada carga de manutenção no futuro.

Tanto Go quanto Rust ajudam você a escrever programas corretos, mas de maneiras diferentes: Go fornece uma excelente estrutura de teste integrada, enquanto Rust se concentra em eliminar erros de tempo de execução por meio de verificadores de empréstimo.

Para o código ser lançado amanhã, use Go; se for um código que deve permanecer estável pelos próximos cinco anos, escolha Rust.

Embora Go e Rust sejam bons o suficiente para projetos de desenvolvimento sérios, é melhor compreender completamente seus vários recursos e vantagens.

Resumindo, não importa o que as outras pessoas pensam: só você pode decidir qual linguagem de programação é melhor para as necessidades da sua equipe e do seu projeto.

Resumir

Espero que este artigo tenha ajudado você a entender os destaques do Rust e do Go, respectivamente. Se possível, é melhor experimentar um pouco as duas linguagens, pois elas são muito úteis em qualquer caminho técnico, mesmo para entusiastas de programação amadores.

Mas se você só tiver tempo para aprender um idioma seriamente, certifique-se de descobrir os respectivos pontos fortes e tendências do Go e Rust antes de fazer uma escolha.

É claro que o conhecimento da linguagem de programação é apenas uma pequena parte de ser um engenheiro de software de sucesso. Além da programação, os engenheiros devem ser proficientes em design, engenharia, arquitetura, comunicação e colaboração. Contanto que todos possam fazer bem as seguintes coisas, não importa qual linguagem de programação você escolher, você se tornará um bom mestre em engenharia de software.

Acho que você gosta

Origin blog.csdn.net/qq_41929396/article/details/132424005
Recomendado
Clasificación