Aula 1 – Uma visão geral de C

Olá, hoje iremos ver o conteúdo do primeiro capítulo, uma introdução ao “mundo C”.

As origens de C

C foi inventada e implementada por Dennis M Ritchie. É uma evolução da linguagem BCPL (Basic Combined Programming Language), desenvolvida por Martin Richards, que hoje ainda é utilizada.

Com a populariadade dos microcomputadores, muitas implementações de C foram criadas, e como não havia nenhum padrão, havia muita discrepância entre elas. Foi então em 1983, que o  ANSI (American National Standards Institute) estabeleceu um padrão para resolver esse problema.

C é uma linguagem de médio nível

Ser uma linguagem de “médio nível” não significa que é menos poderosa, difícil de usar ou menos desenvolvida que uma linguagem de alto nível. C combina elementos de linguagens de alto nível com funcionalidade de assembly. Permite por exemplo, manipularmos bits, bytes e endereços de memória. Um código escrito em C é muito portável, ou seja, é possível adaptar um software escrito para um Apple MacIntosh, para um IBM PC.
C não efetua nenhuma verificação de limite das matrizes, deixando isso como responsabilidade do programador.

Um aspecto interessante é que ele tem apenas 32 palavras-chaves. Se compararmos ao BASIC para PC, tem 159 palavras-chave.

C é uma linguagem Estruturada

Ser estruturada em blocos, significa que com tal linguagem podemos ter procedimentos ou funções dentro de outros procedimentos ou funções. Entram aqui então conceitos de regra de escopo (onde uma variável é válida). C não permite que funções sejam criadas dentro de funções, então formalmente ela não pode ser chamada de “linguagem estruturada em blocos”, e sim apenas “linguagem estruturada”.
A característica de uma linguagem estruturada é separar o código em sessões (funções), que conterão variáveis temporárias. Essas sessões escondem do resto do programa como fazem o que fazem, e isso permite isolar o código e garanir que ele não altere o resto do programa. Um código com muitas variáveis globais pode dificultar a manutenção e gerar comportamentos inesperados, dada a dificuldade de gerenciar todas as variáveis.
Além das funções, podemos estruturar o código em blocos de código, que são um grupo de comandos de programa conectado logicamente que é tratado como uma unidade, por exemplo:

if ( x < 10 ) {
     printf("muito pouco, tente novamente\n");
     scanf("%d", &x);
}

os dois comandos serão executados apenas se x for menor que 10. Então estes comandos, juntos com as chaves representam um bloco de código.

C é uma linguagem para programadores

Segundo o livro, COBOL e BASIC não são linguagens para programadores, pois elas não facilitam a vida do programador, ou aumentam a segurança do código. C foi criada e testada por programadores profissionais, e permite: poucas restrições, poucas reclamações, estruturas de bloco, funções isoladas e um conjunto compacto de palavras-chave.

Sua popularidade se deu principalmente ao fato de ser usada no lugar de assembly, que é muito difícil de trabalhar, embora muito flexível. Assembly não é estruturada, então no final, o código fonte do programa vira um “espaguete”, difícil de ler e dar manutenção. E o maior problema de assembly é o fato de suas rotinas não serem portáveis para CPUs diferentes.

Compiladores versus Interpretadores

Teoricamente qualquer linguagem de programação pode ser compilada ou interpretada, afinal a maneira pela qual um programa é executado não é definida pela linguagem em que ele é escrito.

Um interpretador lê o código fonte do programa linha a linha, e executa a instrução específica de cada linha. Já um compilador lê o programa inteiro e gera um código-objeto, ou seja um código de máquina, que é a tradução do código fonte do programa para uma forma que o computador possa executar diretamente. Logo, o tempo de compilação é gasto apenas uma vez, diferentemente da interpretação do programa que é feita toda vez em que ele é executado.

A forma de um programa em C

Toda as palavras-chave em C são minúsculas, abaixo as 32 palavras-chaves:

auto break case char const continue default
do double else enum extern float for
goto if int long register return short
signed sizeof static struct switch typedef union
unsigned void volatile while
27 delas eram da versão original, e estas 5 foram adicionadas pelo comitê ANSI: enum, const, signed, void e volatile.
Uma palavra-chave não pode ser usado para nenhum outro propósito em um programa em C, ou seja não podemos usá-las para definir nomes de variáveis ou funções.

Todo programa em C possui uma ou mais funções. A única função obrigatória é denominada main(), que é a primeira função a ser executada no programa. Em um programa bem escrito, ela contém apenas chamadas a outras funções.

A biblioteca e a linkedição

A maioria dos programas inclui chamadas a funções contidas na biblioteca C padrão. Todo compilador tem uma biblioteca padrão. O padrão ANSI C especifica um conjunto mínimo de funções que estarão contidas na biblioteca, porém nosso compilador provavelmente trará outras funções. Um exemplo disso é que o ANSI C não define nenhuma função gráfica, apesar da maioria dos compiladores terem as suas.
Quando nosso programa chama uma função que não faz parte dele, o compilador “memoriza” o nome desta, e mais tarde o linkeditor (linker) combina o código que nós escrevemos com o código-objeto já encontrado na biblioteca padrão. Todo esse processo é chamado de linkedição.

Compilando um programa em C

Para compilar um programa em C, seguimos os seguintes passos:

  1. Criar o programa
  2. Compilar o programa
  3. Linkeditar o programa com as funções necessárias da biblioteca

Alguns compiladores fornecem ambientes de programação integrados que incluem um editor. Usaremos a princípio uma IDE (Integrated Development Environment) para criar o programa, compilar, e fazer a linkedição. A princípio usarei o Netbeans, disponível para download aqui.

O mapa de memória de C

Um programa C compilado cria e usa quatro regiões, logicamente distintas na memória, que possuem funções específicas.
A primeira região é a memória que contém o código do programa. A segunda, contém variáveis globais. A pilha tem diversos usos, como possuir o endereço de retorno das chamadas de função, argumentos para funções e variáveis locais. O heap é uma região de memória livre, que o programa pode usar, via funções de alocação dinâmica de memória como listas encadeadas. Abaixo o mapa conceitual de memória de um programa em C:

Revisão de termos

Código-Fonte: Texto de um programa que um usuário pode ler. Normalmente interpretado como o programa, o código-fonte é a entrada para compilador C.

Código-Objeto: Tradução do código-fonte de um programa em código de máquina que o computador pode ler e executar diretamente. O código-objeto é a entrada para o linkeditor.

Linkeditor: Um programa que une funções compiladas separadamente em um programa. Ele combina funções da biblioteca C padrão com o código de nosso programa. A saída do linkeditor é o programa executável.

Biblioteca: Arquivo que contém funções padrão que nosso programa pode usar. Exemplos destas funções são E/S (Entradas e Saídas) e algumas outras rotinas úteis.

Tempo de compilação: Os eventos que ocorrem enquanto o nosso programa está sendo compilado. Uma ocorrência comum neste tempo é o erro de sintaxe.

Tempo de execução: Os eventos que ocorrem enquanto nosso programa é executado.

Conteúdo para a próxima aula

Semana que vem iremos ver muito mais conteúdos, entre eles:
  • Os cinco tipos básicos de dados
  • Modificando os tipos básicos
  • Nomes de identificadores
  • Variáveis
  • Modificadores de tipo de acesso
  • Especificadores de tipo de classe de armazenamento
  • Inicialização de variáveis
  • Constantes
  • Operadores
  • Expressões

Minha Reflexão

Resolvi criar uma sessão após cada post para registrar o que estou achando do curso. Hoje a aula foi bastante teórica, porém importante. Os conceitos vistos são fundamentais para podermos continuar o curso sem ter dúvidas simples, como a diferença entre compilar e interpretar um código.
No meio da semana publicarei um post ensinando a iniciar nosso ambiente de desenvolvimento. Sei que é algo simples, porém para iniciantes pode ser uma “mão na roda”.

2 Comments

Leave a Reply

%d