Um momento
Todos os artigos
C++ 14 min de leitura

O Que É a Linguagem de Programação C? Um Guia Simples da Linguagem Que Move o Mundo

Um guia simples e sem jargões sobre o C, a linguagem de programação de mais de 50 anos escondida no seu celular, no seu carro e na internet. Entenda o que é o C, por que ele é tão rápido, como lida com a memória e por que ainda importa.

nbkhope
Nesta página

Você provavelmente nunca viu uma linha de código em C. Mas, neste exato momento, o C quase certamente está trabalhando para você. Ele está no sistema operacional do seu celular e do seu computador, no seu roteador de Wi-Fi, no seu carro, no seu micro-ondas e nos servidores por trás de quase todo site que você visita.

O C é uma linguagem de programação criada em 1972, e mais de 50 anos depois ainda é uma das peças de tecnologia mais importantes do mundo. Este artigo explica, em linguagem simples, o que é o C, por que ele ficou tão influente, o que o deixa rápido e por que ele também pode ser um pouco perigoso.

Primeiro, o que é uma linguagem de programação?

Os computadores só entendem de verdade longas sequências de 0 e 1, chamadas código de máquina. Escrever um programa assim é lento e cheio de erros para as pessoas.

Uma linguagem de programação é um meio-termo: um jeito de escrever instruções num texto que as pessoas conseguem ler e que depois é traduzido para os 0 e 1 que o computador entende. Algumas linguagens são feitas para ser o mais amigáveis possível. Outras ficam perto de como a máquina funciona de verdade. O C fica bem no meio:

Onde o C fica: entre as pessoas e a máquina. A mesma tarefa, somar um preço e um imposto para chegar ao total, em quatro níveis. Python, amigável e longe do hardware: total = preco + imposto. C, legível mas perto do hardware: int total = preco + imposto;. Assembly, uma linha por instrução do processador: três linhas que movem e somam números no processador. Código de máquina, o que o processador lê de verdade: fileiras de 0 e 1. Uma seta vai de mais fácil para pessoas, no topo, até mais perto da máquina, embaixo

Essa posição no meio é o superpoder do C. Ele é legível o bastante para pessoas escreverem programas grandes, mas perto o bastante do hardware para esses programas rodarem rápido e controlarem a máquina com precisão. Por isso, às vezes chamam o C de "assembly portátil".

Como é o C

Este é o primeiro programa clássico em C. Tudo o que ele faz é escrever uma saudação na tela:

1#include <stdio.h>
2
3int main(void) {
4    printf("hello, world\n");
5    return 0;
6}

Pode parecer enigmático, mas cada linha tem uma tarefa simples:

O seu primeiro programa em C, linha por linha. Linha 1, #include stdio.h: pega a caixa de ferramentas padrão para escrever texto. int main(void) com uma chave de abertura: todo programa em C começa aqui, em main. printf hello, world: escreve as palavras, e barra invertida n quer dizer nova linha. return 0: avisa o computador que terminou, sem erros. A chave de fechamento encerra o main. Quando ele roda, aparece: hello, world

Esse pequeno programa "hello, world" ("olá, mundo") ficou famoso com o livro The C Programming Language, de 1978, escrito por Brian Kernighan e Dennis Ritchie. Desde então, "hello, world" virou o primeiro programa tradicional dos iniciantes em quase todas as linguagens.

Repare nas chaves { } e no ponto e vírgula ; no fim da linha. Se você já viu código em JavaScript, Java ou C#, eles vão parecer familiares. São as impressões digitais do C.

Do código a um programa rodando

O computador não consegue rodar esse texto diretamente. Primeiro, um programa chamado compilador traduz tudo para código de máquina, antes da hora:

Do código que você escreve a um programa que roda. ola.c, o texto que você escreve, entra num compilador, por exemplo GCC ou Clang, que produz um programa em código de máquina, pronto para usar, que roda direto no processador. O C é traduzido uma vez, antes, como traduzir um livro inteiro antes de alguém ler. O Python usa um interpretador que traduz enquanto o programa roda, como um intérprete ao vivo numa reunião

Pense em traduzir um livro. O C traduz o livro inteiro antes de alguém ler, então a leitura depois é rápida. Linguagens como o Python usam um interpretador, que é mais como um intérprete ao vivo numa reunião, traduzindo enquanto a conversa acontece. Isso é mais flexível, mas mais lento.

Por que o C mudou tudo

O C foi criado por Dennis Ritchie no Bell Labs (o laboratório de pesquisa da companhia telefônica americana AT&T), e o nome é simplesmente a letra seguinte a uma linguagem anterior chamada B.

Ritchie e o colega Ken Thompson estavam construindo um sistema operacional chamado Unix. Naquela época, os sistemas operacionais costumavam ser escritos em linguagem assembly, que fica presa a um tipo específico de computador. Mudar para um computador novo significava reescrever quase tudo do zero.

Em 1973, eles fizeram algo ousado: reescreveram quase todo o Unix em C. De repente, levar o Unix para um computador novo significava, basicamente, escrever um compilador de C para ele e compilar de novo. Essa ideia, chamada portabilidade, foi revolucionária e ajudou tanto o Unix quanto o C a se espalharem pelo mundo.

Uma breve história do C, numa linha do tempo. 1969: Ken Thompson e Dennis Ritchie criam o Unix no Bell Labs. 1972: Dennis Ritchie cria o C. 1973: o Unix é reescrito em C. 1978: o livro The C Programming Language, com o hello, world. 1985: sai o C++, o "C com classes". 1989: primeiro padrão oficial, o ANSI C. 1991: nasce o Linux, escrito em C. 2024: sai o padrão mais recente, o C23

O Linux, o macOS, o iPhone, o Android e boa parte do Windows de hoje têm parte da sua árvore genealógica ligada a essas ideias, e o núcleo deles ainda é escrito em grande parte em C.

Por que o C é tão rápido

O C tem fama de ser rápido, e com razão. São três motivos principais:

  • Ele é traduzido antes para código de máquina, então não há trabalho de tradução enquanto o programa roda.
  • Ele quase não acrescenta nada. Não há nenhum ajudante escondido rodando por trás para arrumar a memória ou conferir o seu trabalho.
  • Quem programa está no controle. Você decide exatamente como os dados são organizados e quando a memória é usada e devolvida.

Para ver o que isso significa na prática, este é o mesmo programa simples, que conta todos os números primos abaixo de 2 milhões, escrito em três linguagens e cronometrado no mesmo notebook:

Teste de velocidade: o mesmo programa em três linguagens, contando os números primos abaixo de 2 milhões, medido para este artigo como a mediana de 5 execuções num notebook Windows. C: 0,33 segundo. JavaScript: 0,34 segundo. Python: 17,25 segundos. Versões: GCC 14 com otimizações, Node.js 26 e Python 3.11. Os motores modernos de JavaScript, escritos em C++, compilam o código mais usado na hora, e é assim que acompanham o C em testes simples como este

O C terminou em um terço de segundo. O Python, que é ótimo para muita coisa mas não foi feito para velocidade bruta, levou umas 50 vezes mais. O JavaScript acompanhou o C neste teste simples, porque os motores modernos de JavaScript (escritos em C++, um parente próximo do C) traduzem o código mais usado para código de máquina na hora. Em programas reais, maiores e mais bagunçados, o C costuma manter uma vantagem, principalmente em quão pouca memória ele precisa.

É por isso que o C é a escolha certa quando cada pedacinho de velocidade e de memória conta: sistemas operacionais, bancos de dados, motores de jogos e os pequenos computadores dentro de eletrodomésticos, carros e aparelhos médicos.

Mexendo direto na memória

Esta é a parte que deixa o C poderoso e traiçoeiro ao mesmo tempo. A memória de um computador é como uma fileira muito longa de caixas de correio numeradas. Cada caixa tem um endereço e pode guardar um valor. O C deixa você mexer nessas caixas diretamente:

O C deixa você mexer direto na memória. A memória é como uma longa fileira de caixas de correio numeradas. O código int idade = 30, int nota = 95 e int ponteiro onde = endereço de idade guarda 30 na caixa 1001, chamada idade, 95 na caixa 1002, chamada nota, e 1001 na caixa 1004, chamada onde. Uma seta mostra que onde aponta de volta para idade. "onde" é um ponteiro: ele não guarda uma nota nem uma idade, guarda o endereço de uma caixa

A variável onde é um ponteiro. Ela não guarda um valor comum, como uma idade ou uma nota; ela guarda o endereço de outra caixa. É como anotar o endereço da casa de alguém num papelzinho, em vez de carregar a casa por aí.

Os ponteiros deixam os programas em C moverem dados de forma eficiente e conversarem direto com o hardware. Eles são um grande motivo para o C ser rápido e flexível, e também são a origem de muitos dos seus erros mais traiçoeiros.

O porém: o C não tem rede de proteção

A maioria das linguagens modernas confere o seu trabalho. Se você tentar colocar 4 coisas num espaço feito para 3, elas param você com um erro. O C confia totalmente em você e não confere:

O perigo: escrever além do fim. O programa reserva 3 caixas para notas e depois tenta guardar 4. Antes: as notas 80, 75 e 90 ficam nas caixas 2000 a 2002, e a caixa vizinha, 2003, e_admin, guarda 0. Depois: a 4ª nota, 88, cai na caixa 2003, então e_admin não é mais 0. Erros assim, chamados de estouro de buffer, são uma fonte clássica de falhas de segurança. A Microsoft e o Google relataram, cada um, que cerca de 70% das suas falhas de segurança graves são problemas de segurança de memória como este

Neste exemplo, a 4ª nota transborda para a caixa do vizinho, que por acaso guarda uma configuração chamada e_admin ("é administrador"). Agora o programa acha que o usuário é um administrador. Esse tipo de erro se chama estouro de buffer (buffer overflow), e atacantes o exploram há décadas.

Isso não é só teoria:

  • A Microsoft disse que cerca de 70% dos problemas de segurança que ela corrige todo ano são de segurança de memória, e a equipe do Google Chrome relatou um número parecido. Boa parte desse código é escrita em C e no seu parente C++.
  • O Heartbleed, uma falha famosa de 2014 que expôs dados privados de um número enorme de sites, foi um erro de memória no OpenSSL, uma biblioteca de segurança muito usada e escrita em C.
  • Em 2024, o Escritório do Diretor Nacional de Cibersegurança da Casa Branca publicou um relatório pedindo que a indústria de software adote linguagens com segurança de memória sempre que possível.

O C também pede que você cuide da memória à mão: você pede caixas quando precisa e tem que devolvê-las quando termina. Esqueça de devolver, e o programa vai comendo memória aos poucos (um vazamento de memória). Devolva cedo demais e continue usando, e aparecem erros estranhos e difíceis de achar.

A grande família do C

Mesmo que o C sumisse amanhã, a influência dele continuaria em todo lugar:

A grande família do C. Linguagens que copiaram o seu jeito: Objective-C (1984), C++ (1985), Java (1995), JavaScript (1995), C# (2000) e Go (2009). Softwares famosos escritos principalmente em C: o Linux, que roda na maioria dos servidores e no Android; partes centrais do Windows e do macOS; o interpretador principal do Python; o SQLite, banco de dados em todo celular; o Git, que controla mudanças no código; e o curl, que transfere dados na internet. As chaves e os pontos e vírgulas de tantas linguagens são as impressões digitais do C
  • Linguagens que ele inspirou: C++, Objective-C, Java, JavaScript, C# e Go copiaram o jeito do C e muitas das suas ideias. Se você aprender C, muitas outras linguagens vão parecer familiares.
  • Softwares feitos com ele: o núcleo do Linux (que roda na maioria dos servidores e supercomputadores do mundo e em todo celular Android), o núcleo do Windows e do macOS, o banco de dados SQLite (presente em praticamente todo celular e navegador), o Git (que programadores usam para controlar o seu código) e muitos outros.
  • Aparelhos minúsculos: micro-ondas, máquinas de lavar, termostatos, centrais eletrônicas de carros, marca-passos. Os pequenos chips dentro desses aparelhos muitas vezes são programados em C, porque ele roda bem com pouquíssima memória.

Há décadas, o C aparece de forma constante entre as linguagens de programação mais populares nos rankings da indústria, uma trajetória impressionante para uma linguagem nascida no começo dos anos 1970.

C vs. C++ (e outros nomes confusos)

Os nomes podem confundir, então aqui vai um guia rápido:

  • O C++ começou no início dos anos 1980 como "C com classes", acrescentando novas formas de organizar programas grandes. Ele é, em grande parte, uma extensão do C: muito código em C também funciona em C++. É muito usado em videogames, navegadores e outros softwares grandes que exigem desempenho.
  • O C# (pronuncia-se "C sharp") é outra linguagem, da Microsoft, lançada em 2000. Ele copia a aparência do C, mas funciona de um jeito bem diferente, inclusive com gerenciamento automático de memória.
  • O Objective-C acrescentou novos recursos ao C e foi a principal linguagem da Apple por muitos anos, antes da chegada do Swift.

Vale a pena aprender C?

Depende do que você quer fazer:

  • Bons motivos para aprender C: você vai entender como os computadores funcionam por dentro (memória, processador, como os programas rodam) e vai estar pronto para trabalhar com sistemas operacionais, aparelhos, robôs, jogos ou qualquer coisa em que a velocidade importa.
  • Motivos para começar por outra: o C faz você cuidar de muitos detalhes, e os erros dele podem confundir iniciantes. Muita gente começa por uma linguagem mais amigável, como Python ou JavaScript, e aprende C depois.

De qualquer jeito, o C nunca é perda de tempo. Muitos programadores dizem que aprender C foi o momento em que os computadores finalmente "fizeram sentido".

Um pequeno glossário

  • C: uma linguagem de programação criada em 1972 no Bell Labs, conhecida pela velocidade e pelo controle.
  • Linguagem de programação: um jeito de escrever instruções para o computador num texto que as pessoas conseguem ler.
  • Código de máquina: os 0 e 1 que o processador entende de verdade.
  • Linguagem assembly: uma versão legível do código de máquina, uma linha por instrução do processador.
  • Compilador: um programa que traduz código para código de máquina antes da hora.
  • Interpretador: um programa que traduz e roda o código enquanto avança.
  • Portabilidade: a capacidade de levar um programa para outro tipo de computador com poucas mudanças.
  • Endereço de memória: o número de uma "caixa de correio" na memória do computador.
  • Ponteiro: um valor que guarda um endereço de memória, como um papelzinho com o endereço de uma casa.
  • Estouro de buffer: escrever além do fim de um espaço reservado na memória, por cima dos dados de outra coisa.
  • Vazamento de memória: memória que um programa esquece de devolver, usando cada vez mais aos poucos.
  • Linguagem com segurança de memória: uma linguagem que evita automaticamente a maioria dos erros de memória, como Python, Java, Go ou Rust.
  • Unix: um sistema operacional muito influente, reescrito em C em 1973, ancestral do macOS e inspiração para o Linux.

Concluindo

O C é uma linguagem de programação de 1972 que fica entre as pessoas e a máquina: legível o bastante para escrever programas grandes, perto o bastante do hardware para rodá-los rápido. A capacidade dele de passar de um computador para outro ajudou o Unix, e depois o Linux, a se espalharem pelo mundo, e o jeito dele continua vivo em muitas das linguagens mais populares de hoje.

Essa proximidade com a máquina tem um preço: o C dá aos programadores controle total sobre a memória e, com ele, a chance de cometer erros caros. Ainda assim, mais de 50 anos depois, uma parte enorme da tecnologia que você usa todo dia, do sistema operacional do seu celular ao chip minúsculo do seu micro-ondas, roda silenciosamente em C.

Obrigado pela leitura!

Conhece alguém que vai gostar? Mande para essa pessoa.

Mais artigos

Read next

Comentários

Be kind and specific. Comments with links from new accounts appear after a moderator reviews them.