O que é a linguagem de programação C?


 O que é a linguagem de programação C?

C é uma linguagem de programação compilada de propósito geral, estruturada, imperativa, procedural, padronizada pela Organização Internacional para Padronização (ISO), criada em 1972 por Dennis Ritchie na empresa AT&T Bell Labs para desenvolvimento do sistema operacional Unix (originalmente escrito em Assembly).


(C)

Paradigma programação estruturada

programação imperativa

programação procedural

Surgido em 1972 (47–48 anos)

Última versão C18 (junho de 2018; há 2 anos)

Criado por Dennis Ritchie

Estilo de tipagem: estática, fraca

Compiladores Borland C, Clang, GNU GCC, MSVC, Turbo C, Watcom C, Tiny C Compiler

Dialetos: ANSI C, C99, C11, ISO C, K&R C

Influenciada por ALGOL 68, Assembly, B, BCPL, CPL, Fortran, PL/I

Influenciou AWK, BitC, C++, C♯, C Shell, D, Euphoria, Go, Java, JavaScript, Limbo, Logic Basic, Objective-C, Perl, PHP, Python

Licença: dependente da implementação

Extensão do arquivo: .c, .h[1]

C[2] é uma linguagem de programação compilada de propósito geral, estruturada, imperativa, procedural, padronizada pela Organização Internacional para Padronização (ISO), criada em 1972 por Dennis Ritchie na empresa AT&T Bell Labs para desenvolvimento do sistema operacional Unix (originalmente escrito em Assembly).[3]


C é uma das linguagens de programação mais populares[4][5] e existem poucas arquiteturas para as quais não existem compiladores para C. C tem influenciado muitas outras linguagens de programação (por exemplo, a linguagem Java),[6] mais notavelmente C++, que originalmente começou como uma extensão para C.


A linguagem C encontra-se na versão/padrão internacional C18 standard revision (ou ISO/IEC 9899:2018) lançada em junho de 2018, substituindo a versão C11 (standard ISO/IEC 9899:2011),[7] disponível em ISO e IEC e com suporte para GCC8 e Clang LLVM6.[8]


A HISTÓRIA POR TRÁS DA PROGRAMAÇÃO



Ken Thompson e Dennis Ritchie (da esquerda para direita), os criadores das linguagens B e C, respectivamente

O desenvolvimento inicial de C ocorreu no AT&T Bell Labs entre 1969 e 1973.[9] de acordo com Ritchie, o período mais criativo ocorreu em 1972. A linguagem foi chamada "C", porque suas características foram obtidas a partir de uma linguagem anteriormente chamada de "B", que de acordo com Ken Thompson era a versão reduzida da linguagem de programação BCPL.[10]

A versão original PDP-11 do sistema Unix foi desenvolvido em assembly. Em 1973, com a adição dos tipos struct, a linguagem C tornou-se poderosa o suficiente para que a maior parte do kernel do Unix fosse reescrito em C. Este foi um dos primeiros núcleos de sistemas operacionais implementados numa linguagem diferente da linguagem Assembly. Em 1977, foram feitas novas mudanças por Ritchie e Stephen C. Johnson para facilitar a portabilidade do sistema operacional Unix. O Portable C Compiler de Johnson serviu de base para várias implementações de C em novas plataformas.[11]

C K&REditar

A linguagem C não teve um sucesso imediato após a sua criação e o seu uso ficou restrito a alguns laboratórios,[12] mas em 1978 Brian Kernighan e Dennis Ritchie lançam o livro The C Programming Language.[13] que serviu de tutorial e mudou a história da programação em C. De fato essa primeira versão da linguagem é conhecida como "C Kernigham e Ritchie" ou apenas "C K&R".[14]

Esse livro, conhecido pelos programadores de C como "K&R", serviu durante muitos anos como uma especificação informal da linguagem. A versão da linguagem C que ele descreve é usualmente referida como "K&R C". A segunda edição do livro cobriu o padrão posterior, o ANSI C. K&R C introduziu as seguintes características na linguagem:

  • Biblioteca padrão de E/S
  • Tipo de dados struct
  • Tipo de dados long int
  • Tipo de dados unsigned int
  • O operador =+ foi alterado para +=, e =- para -= (o analisador léxico do compilador fazia confusão entre i =+ 10 e i = +10. O mesmo acontecia com =-)

K&R C é frequentemente considerado a parte mais básica da linguagem, cujo suporte deve ser assegurado por um compilador de C. Durante muitos anos, mesmo após a introdução do padrão ANSI C, K&R C foi considerado o "menor denominador comum", em que programadores de C se apoiavam quando uma portabilidade máxima era desejada, já que nem todos os compiladores eram actualizados o suficiente para suportar o padrão ANSI C.

Nos anos que se seguiram à publicação do K&R C, algumas características "não oficiais" foram adicionadas à linguagem, suportadas por compiladores da AT&T e de outros vendedores. Estas incluíam:

  • Funções void e tipos de dados void *
  • Funções que retornam tipos struct ou union
  • Campos de nome struct num espaço de nome separado para cada tipo struct
  • Atribuição a tipos de dados struct
  • Qualificadores const para criar um objecto só de leitura
  • Biblioteca padrão, que incorpora grande parte da funcionalidade implementada por vários vendedores
  • Enumerações
  • Cálculos de ponto-flutuante em precisão simples (no K&R C, os cálculos intermediários eram feitos sempre em double, porque era mais eficiente na máquina onde a primeira implementação do C foi feita)

ANSI C e ISO CEditar

Durante os finais da década de 1970, a linguagem C começou a substituir a linguagem BASIC como a linguagem de programação de microcomputadores mais usada. Durante a década de 1980, foi adaptada para uso no PC IBM, e a sua popularidade começou a aumentar significativamente. Ao mesmo tempo, Bjarne Stroustrup, juntamente com outros nos laboratórios Bell, começou a trabalhar num projecto onde se adicionavam extras para programação orientada por objectos à linguagem C. A linguagem que eles produziram, chamada C++, é nos dias de hoje a linguagem de programação de aplicações mais comum no sistema operativo Windows da companhia Microsoft. A linguagem C permanece a mais popular no mundo Unix.

Em 1983, o instituto norte-americano de padrões (ANSI) formou um comité, X3J11, para estabelecer uma especificação do padrão da linguagem C. Após um processo longo e árduo, o padrão foi completo em 1989 e ratificado como ANSI X3.159-1989 "Programming Language C". Esta versão da linguagem é frequentemente referida como ANSI C. Em 1990, o padrão ANSI C, após sofrer umas modificações menores, foi adotado pela Organização Internacional para Padronização (ISO) que cria o grupo de trabalho para cuidar da especificação da linguagem, denominado WG14, assim foi renomeada para ISO/IEC 9899:1990, também conhecido como C89 e C90.[15] Um dos objetivos do processo de padronização ANSI C foi o de produzir um sobreconjunto do K&R C, incorporando muitas das características não oficiais subsequentemente introduzidas. Entretanto, muitos programas tinham sido escritos e que não compilavam em certas plataformas, ou com um certo compilador, devido ao uso de bibliotecas de funções não padrão e ao fato de alguns compiladores não aderirem ao ANSI C.

C99Editar

Após o processo da padronização ANSI, as especificações da linguagem C permaneceram relativamente estáticas por algum tempo, enquanto a linguagem C++ continuou a evoluir. (em 1995, a Normative Amendment 1 criou uma versão nova da linguagem C mas esta versão raramente é tida em conta.) Contudo, o padrão foi submetido a uma revisão nos finais da década de 1990, levando à publicação da norma ISO 9899:1999 em 1999. Este padrão é geralmente referido como "C99" e foi adoptado como um padrão ANSI em março de 2000. As novas características do C99 incluem:

  • Funções em linha
  • Remoção de restrições sobre a localização da declaração de variáveis (como em C++)
  • Adição de vários tipos de dados novos, incluindo o long long int (para minimizar problemas na transição de 32-bits para 64-bits), um tipo de dados boolean explicito (chamado _Bool) e um tipo complex que representa números complexos
  • Vetores de dados de comprimento variável (o vetor pode ter um tamanho diferente a cada execução de uma função, mas não cresce depois de criado)
  • Suporte oficial para comentários de uma linha iniciados por //, emprestados da linguagem C++
  • Várias funções de biblioteca novas, tais como snprintf()
  • Vários ficheiros-cabeçalho novos, tais como stdint.h

O interesse em suportar as características novas de C99 parece depender muito das entidades. Apesar do GCC e vários outros compiladores suportarem grande parte das novas características do C99, os compiladores mantidos pela Microsoft e pela Borland suportam pouquíssimos recursos do C99, e estas duas companhias não parecem estar muito interessadas em adicionar tais funcionalidades, ignorando por completo as normas internacionais. A Microsoft parece preferir dar mais ênfase ao C++.[16]

C11Editar

Em 2007, se iniciou o trabalho em antecipação de outra revisão do padrão de C, informalmente chamada de C11 ou C1X. O comité dos padrões de C adotou regras para limitar a inserção de novos recursos que não tenham ainda sido testados por implementações existentes.[17]

Em dezembro de 2011 foi publicada a versão estável da especificação, como ISO/IEC 9899:2011.


Ferramentas de programaçãoEditar



Relações com C++Editar

A linguagem de programação C++ foi originalmente derivada do C para suportar programação orientada a objetos. À medida que as linguagens C e C++ foram evoluindo independentemente, a divisão entre as duas veio a aumentar. O padrão C99 criou um número de características que entram em conflito. Hoje, as principais diferenças entre as duas linguagens são:

  • inline - em C++, funções em linha encontram-se no espaço global enquanto que em C encontram-se no espaço local. Por outras palavras, isso significa que, em C++, qualquer definição de qualquer função em linha (sem ser a respeito da sobrecarga de funções de C++) tem de estar em conformidade com a "regra de uma definição" da linguagem C++. Mas em C, a mesma função em linha pode ser definida de maneira diferente em diferentes arquivos (ou ficheiros)
  • A palavra-chave bool, igual à usada em C++, em C99 necessita que se inclua o ficheiro-cabeçalho <stdbool.h> (_Bool está sempre disponível). Padrões anteriores de C não definiam um tipo booleano e vários (e incompatíveis) métodos foram usados para simular um tipo booleano

Algumas características originalmente desenvolvidas em C++ também apareceram em C. Entre elas encontram-se:

  • protótipos de função (com declaração de tipos de parâmetros) e remoção do "int" implícito
  • comentários de linha, indicados por //; comentários de linha terminam com um carácter de nova-linha
  • a palavra-chave inline
  • tipagem mais forte


ExemplosEditar

Programa Olá MundoEditar

Ver artigo principal: Programa Olá Mundo

A seguinte aplicação foi publicada na primeira edição de C de K&R, e tornou-se no programa de introdução padrão da maior parte dos livros sobre C. O programa envia o texto "Olá, Mundo!" para a saída padrão, que é normalmente o console, mas que também pode ser um ficheiro (ou arquivo), um outro dispositivo qualquer, ou até mesmo um bit bucket, dependendo de como a saída-padrão é mapeada na altura em que o programa é executado.

int main(void)
{
    puts("Olá, Mundo!");
}

Apesar do programa acima correr corretamente, atualmente origina algumas mensagens de aviso quando compilado como C ANSI. Essas mensagens podem ser eliminadas efectuando umas pequenas alterações no programa original:

#include <stdio.h> /* Pacotes com funções de entrada e saída */

int main(void)
{
    puts("Olá, Mundo!");
    return 0; /* Retorna 0, pois `main` retorna um `int` */
}
/* Nova linha após fechar a chave principal */

A primeira linha do programa é uma diretiva de pré-processamento #include, que causa com que o pré-processador substitua aquela linha pela totalidade do conteúdo do arquivo qual diretiva se refere. Neste caso o arquivo padrão stdio.h (que contém protótipos de funções para trabalho com entrada e saída) irá substituir a linha. Os caracteres < e > indicam que o arquivo stdio.h encontra-se no local em que, quando da configuração do compilador, se definiu como padrão para localização dos ficheiros de inclusão (header files, geralmente com a extensão .h).

A linha (não vazia) seguinte indica que uma função denominada main será definida. A função main tem um significado especial nos programas em C, pois é a função que é inicialmente executada (em inglês, entry point). Os caracteres { e } delimitam a extensão da função. O termo int define a função main como sendo uma função que retorna um número inteiro. O termo void indica que a função não aceita parâmetros. A função main, normalmente aceita parâmetros, que são passado pela linha de comando. Os compiladores e sistemas operacionais atuais reconhecem as seguintes declarações de main:

int main();
int main(void);
int main(int argc, char *argv[]);
int main(int argc, char **argv);

A linha seguinte "chama", ou executa uma função chamada puts; o arquivo incluído, stdio.h, contém a informação que descreve a forma como a função puts deve ser chamada. Nesta chamada, é passado à função puts um único argumento, a linha de texto constante "Olá, Mundo!". A função puts retorna um valor, um int, mas como não é usado, é descartado pelo compilador. O comando return retorna o valor 0 para o sistema, que é interpretado pelo mesmo como que a função main() foi executada e encerrada com sucesso (sem erros). Por fim, o caracter } indica o fim da função main. Note-se que texto rodeado por /* e */ (comentários de texto) é ignorado pelo compilador. Os compiladores que obedecem à norma C99 também aceitam como comentários as linhas de texto que são precedidos por //.

MatemáticaEditar

O seguinte código realiza seis operações matemáticasadiçãosubtraçãomultiplicaçãodivisãoexponenciação e radiciação, e em seguida envia os seus respectivos resultados para a saída padrão (normalmente o console).

#include <math.h>  // necessária para pow() e sqrt()
#include <stdio.h> // necessária para printf()

int main(void)
{
    int a = 2, b = 3;

    printf("%d + %d = %d\n", a, b, a + b);
    printf("%d - %d = %d\n", a, b, a - b);
    printf("%d x %d = %d\n", a, b, a * b);
    printf("%d / %d = %0.1f\n", a, b, (float) a / b); // resultado fracionário
    printf("%d elevado a %d = %0.1f\n", a, b, pow(a, b)); // pow(base, expoente)
    printf("raiz quadrada de %d = %0.1f\n", a, sqrt(a));
}

Estruturas de dadosEditar

No exemplo seguinte, é criada uma estrutura composta por 3 membros de tipos diferentes. Após ser declarada uma variável "x" do tipo struct "y", onde "y" é o nome da estrutura, para se acessar os membros usa-se a seguinte sintaxe: x.membro.

#include <inttypes.h>
#include <stdio.h>

struct Pessoa
{
    char    nome[32];
    char    rg[14]; // 13 caracteres + '\0'
    uint8_t idade;
};

int main(void)
{
    struct Pessoa p1 = {
        .nome  = "Fulano",
        .rg    = "00.000.000-00",
        .idade = 27,
    };

    printf(" Nome: %s\n", p1.nome);
    printf("   RG: %s\n", p1.rg);
    printf("Idade: %u\n", p1.idade);
}

Ou, equivalente:

#include <inttypes.h>
#include <stdio.h>

typedef struct Pessoa
{
    char    nome[32];
    char    rg[14]; // 13 caracteres + '\0'
    uint8_t idade;
} Pessoa;

int main(void)
{
    Pessoa p1 = {
        .nome  = "Fulano",
        .rg    = "00.000.000-00",
        .idade = 27,
    };

    printf(" Nome: %s\n", p1.nome);
    printf("   RG: %s\n", p1.rg);
    printf("Idade: %u\n", p1.idade);
}


Comentários

Postagens mais visitadas deste blog

As 15 principais linguagens de programação do mundo!