Ativa desde os anos 1970, linguagem ainda persiste e poucas conseguem superar seu desempenho. Mas como ela se compara diante à concorrência?
Serdar Yegulalp, Infoworld (EUA)
15:10 pm - 22 de outubro de 2019
Nenhuma tecnologia se mantém viva por 50 anos, a não ser que ela faça o seu trabalho muito bem. A linguagem de programação C está na ativa desde 1972, e ainda reina como um dos elementos fundamentais do mundo do software. Em alguns casos, determinada tecnologia sobrevive porque as pessoas simplesmente não conseguem substituí-la. Nas últimas décadas, dezenas de outras linguagens surgiram – algumas projetadas explicitamente para desafiar o C, outras se destacando como um subproduto de sua popularidade.
Não é difícil dizer que o C precisa ser substituído. As práticas de pesquisa de linguagem de programação e desenvolvimento de software sugerem que existem maneiras muito melhores de trabalhar. No entanto, o C persiste da mesma forma, com décadas de pesquisa e desenvolvimento por trás disso. No final das contas, poucas linguagens conseguem superar o seu desempenho. Ainda assim, vale a pena ver como o C se compara à concorrência.
C vs. C++
Naturalmente, o C é comparado com o C++, a linguagem que – como o próprio nome indica – foi criada como uma extensão do C. As diferenças entre C++ e C podem ser caracterizadas como extensas ou excessivas, dependendo de quem for falar sobre o assunto.
Embora ainda seja semelhante ao C em sua sintaxe e abordagem, o C++ fornece muitos recursos genuinamente úteis que não estão disponíveis nativamente no C: espaços para nome, modelos, exceções, gerenciamento automático de memória e assim por diante. Projetos que exigem desempenho de alto nível – bancos de dados, sistemas de aprendizado de máquina – são frequentemente escritos em C++ usando esses recursos para extrair ao máximo o desempenho do sistema.
Além disso, o C++ continua a se expandir muito mais intensamente que o C. O próximo C++ 20 traz ainda mais recursos, incluindo módulos, biblioteca de sincronização e conceitos que facilitam o seu uso. A revisão mais recente do padrão C adicionou poucas novidades e se concentrou apenas em manter a compatibilidade com versões anteriores.
O problema é que todas as vantagens do C++ também podem funcionar como desvantagens. Quanto mais recursos C++ você usa, mais complexidade você apresenta e mais difícil fica domar os resultados. Os desenvolvedores que se limitam a um subconjunto de C++ podem evitar muitas de suas piores armadilhas e excessos. A equipe de desenvolvimento do kernel Linux, por exemplo, evita o C++.
Escolher C em vez de C++ é uma maneira de você evitar ter que lidar com excessos do C++, adotando um minimalismo imposto. Obviamente, o C++ possui um rico conjunto de recursos de alto nível por um bom motivo. Mas se o minimalismo é mais adequado para projetos atuais e futuros, então o C faz mais sentido.
C vs. Java
Após décadas, o Java continua a ser um dos destaques no desenvolvimento de software corporativo. Muitos dos projetos mais importantes foram escritos em Java – incluindo a grande maioria dos projetos da Apache Software Foundation.
A sintaxe Java empresta muito do C e C++. Ao contrário do C, porém, o Java não compila por padrão o código nativo. Em vez disso, o Java Runtime Environment, o JVM, JIT (just-in-time) compila o código Java para execução no ambiente de destino. Sob as circunstâncias certas, o código Java JITted pode se aproximar ou até exceder o desempenho de C.
A filosofia “escreva uma vez, execute em qualquer lugar” por trás do Java também permite que os programas trabalhem com pouco ajustes. Por outro lado, embora o C tenha sido desenvolvido para muitas arquiteturas, qualquer programa em C ainda pode precisar de personalização para ser executado corretamente.
Essa combinação de portabilidade e forte desempenho, juntamente com um enorme ecossistema de bibliotecas e estruturas de software, tornam o Java uma linguagem ideal para a criação de aplicativos corporativos.
Entretanto, o Java fica aquém do C em uma área em que nunca teve a intenção de competir: trabalhando diretamente com hardware. O Java é compilado no bytecode, que é um código intermediário que o interpretador da JVM converte em código. Além disso, embora o gerenciamento automático de memória do Java seja uma bênção na maioria das circunstâncias, o C é mais adequado para programas que devem fazer o uso ideal de recursos limitados de memória.
Há também algumas áreas em que o Java pode se aproximar do C em termos de velocidade. O mecanismo JIT da JVM otimiza o tempo de execução com base no comportamento do programa, permitindo muitas classes de melhorias que não são possíveis com o C.
C vs. Python
Hoje em dia, sempre que a conversa é sobre desenvolvimento de software, o Python sempre parece entrar na conversa. Afinal, o Python é “a segunda melhor linguagem para tudo” e, inquestionavelmente, uma das mais versáteis, com milhares de bibliotecas de terceiros disponíveis.
O que o Python enfatiza, e onde mais difere do C, é no favorecimento da velocidade de desenvolvimento em detrimento da velocidade de execução. Um programa que pode levar uma hora para ser montado em outra linguagem – como C – pode ser criado em Python em minutos. Por outro lado, esse programa pode levar alguns segundos para ser executado em C, mas um minuto para ser executado em Python. Mas, para muitos trabalhos em hardware moderno, o Python é rápido o suficiente, e isso foi fundamental para sua aceitação.
Outra grande diferença é o gerenciamento de memória. Os programas Python são totalmente gerenciados no tempo de execução para que os desenvolvedores não precisem se preocupar com os detalhes da alocação e liberação de memória. Mas aqui novamente, a facilidade do desenvolvedor custa o desempenho do tempo de execução. Escrever programas em C requer atenção ao gerenciamento de memória, mas os programas resultantes costumam ser o padrão ouro para a velocidade da máquina.
Por trás das aparências, porém, Python e C compartilham uma conexão profunda: o tempo de execução do Python de referência é escrito em C. Isso permite que os programas Python agrupem bibliotecas escritas em C e C++. Pedaços significativos do ecossistema Python de bibliotecas de terceiros, como para aprendizado de máquina, têm o código C em seu núcleo.
Se a velocidade do desenvolvimento importa mais do que a velocidade da execução, e se a maioria das partes com desempenho do programa pode ser isolada em componentes independentes, o Python puro ou uma mistura de bibliotecas Python e C podem ser uma escolha melhor do que usar o C sozinho. Caso contrário, o C ainda prevalece.
Leave a comment