C: História e Versões

por Fabio A. Mazzarino

A linguagem C é uma das mais antigas e populares na história da computação. Muitos iniciantes desvalorizam a linguagem por ela ser antiga, ou datada, mas ela vem evoluindo há quase 50 anos, mantendo-se sempre relevante. Lembro, inclusive, no final dos anos 90, a então relevante Info Exame, ditando o fim das linguagens C e C++, ledo engano.

História

Chovendo no molhado: a linguagem C foi criada pela Bell Labs, uma gigante das telecomunicações norte-americana em 1972. Sabendo disso é fácil entender que a linguagem C é sucessora da linguagem B (de Bell). O intuito inicial era ser utilizada para desenvolver programas para o Unix, desenvolvido pela AT&T, outra gigante das telecomunicações.

A linguagem foi tão bem aceita que ainda em 1972 passou a fazer parte da 2a Versão do Unix. Em 1973, na 4a Versão do Unix, o kernel foi totalmente reescrito em linguagem C, tornando-se o primeiro sistema operacional que não foi implementado em assembly, um grande passo para portá-lo para outras plataformas.

Notem que a história do Unix e da linguagem C estão intimamente ligadas.

K&R C

Muitas vezes referenciada por C78, lançada em 1978. Na verdade é um famoso livro: The C Programming Language, que por muito tempo foi considerado a especificação da linguagem para implementação de novos compiladores.

Nesta versão foram incluidas funcionalidades importantes para a linguagem como:

  • stdio (biblioteca Standard I/O);
  • long int;
  • unsigned int;
  • operadores compostos (+=, -=, *=, etc), mas com uma sintaxe um pouico diferente.

Este livro é tão influente que ainda pode ser encontrado na Amazon, na sua primeira versão, de 1978, ou na segunda versão, de 1988. Note que em Fev/2021, o preço da segunda versão, nova, capa dura, é R$2.795,91!

C ANSI, C ISO, C89 e C90

Com os padrões sendo ditados por um livro, alguns não concordavam e acabavam por implementar funcionalidades exclusivas, causando um pouco de confusão. Por conta disso foi criada a American National Standards Institute (ANSI) decidiu padronizar a linguagem.

Um comitê formado em 1983 discutiu a padronização até 1989, quando foi publicado o padrão ANSI X3.159-1989 “Programming Language C”, popularmente conhecido por C ANSI, ou C89. Esta versão é basicamente uma extensão da C78, incorporando suas especificações na íntegra.

Algumas das funcionalidades adicionas:

  • protótipos de funções, por consequência as forward declarations;
  • ponteiros void;
  • suporte a internacionalização de charsets e locale;
  • melhorias no sistema de pré-processamento.

Posteriormente, em 1990, a International Organization for Standardization (ISO) publicou a ISO/IEC 9899:1990, baseada na C89, que ficou popularmente conhecida por C90. Portanto são sinônimos: C ANSI, C89, C ISO e C90, referindo-se todos às mesmas especificações.

Em muitos lugares C ANSI virou sinônimo de C puro, apesar de existirem versões mais modernas em uso. Esta é a versão mais utilizada e aceita por todos os compiladores C.

C95

Depois de publicado o C90 a ANSI não mais se ocupou em padronizar mais a linguagem, deixando a responsabilidade para a ISO.

Em 1995 surgiu uma complementação para especificação ISO existente: ISO/IEC 9899/AMD1:1995, popularmente conhecida por C95. Apenas continha algumas atualizações de internacionalização de caracteres e locales.

C99

Uma década após a oficialização do C ANSI foi publicada a ISO/IEC 9899:1999, popularmente conhecida por C99. Trazendo algumas novidades, dentre várias outras:

  • funções inline;
  • declarações intermeadas ao código;
  • stdbool e o tipo _Bool;
  • novos tipos e modificadores de tipos, como long long int;
  • array com declaração de tamanho em tempo de execução (apesar de ter sido descartada no C11);
  • membro array flexível, negócio bacana que podemos abordar no futuro;
  • comentários no estilo C++;
  • macros com parâmetros variados;
  • matemática independente de tipo;
  • inicialização de structs;

Em sua maior parte C99 é compatível com C89.

C11

Mais uma vez, depois de cerca de uma década, uma nova versão foi publicada. Formalmente conhecida por ISO/IEC 9899:2011, ganhou o poupular apelido de C11. Trouxe mais algumas novidades:

  • especificações de alinhamento através da biblioteca stdalign;
  • expressões de tipo genérico, outro assunto bacana pro futuro;
  • suporte a multithread através da biblioteca threads e stdatomic;
  • structs e unions anônimas;
  • modo de abertura de arquivo create-open-lock pro fopen, muito utilizado para arquivos de lock;
  • novas macros para criação de números complexos;
  • checagem de limites de capacidade numérica e de buffer.

Essa última funcionalidade apesar de ser definida como opcional foi muito criticada e não é implementada em vários compiladores. Houve, inclusive, diversas solicitações que fosse removida da próxima especificação.

C17

Em 2017 a ISO/IEC 9899:2018, ou C17, veio pra corrigir alguns problemas de especificação da C11, é apenas uma versão mais bem explicada.

C2x

C2x é o apelido para a próxima especificação que está atualmente em desenvolvimento. Nenhuma publicação oficial é esperada até o final de 2021, provavelmente vamos ver algum tipo de resultado somente em 2022.

Qual Versão Utilizar?

Atualmente a C11 e C17 são muito populares, a maioria dos compiladores atuais a aceita sem problemas. Definir a utilização de versões anteriores normalmente somente quando utilizando um compilador antigo, ou em um sistema legado, nesses casos utiliza-se a C99. Dificilmente será encontrado um time que ainda utiliza C89, mas isso pode acontecer, talvez por questões de compatibilidade com plataformas mais antigas, ou sistemas legados.