11.02
2021
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.
Comentários
[…] passada falamos sobre a história e as versões da linguagem C, hoje vamos falar sobre C++. Assim como a linguagem C, muitos novatos acham que a linguagem C++ é […]