Capítulo 1 - O Programa em C
Neste capítulo veremos os elementos mais básicos de um programa
em C.
Começaremos pela estrutura básica de um programa em C
e examinaremos o processo de compilação e de execução
dos programas.
Tópicos
O programa em C mínimo
O mais curto programa em C que é possível escrever é
o seguinte:
main()
}
{
É equivalente ao seguinte programa em PASCAL:
Program Minimum;
begin
end.
Todo o programa em C deverá conter uma e só uma função
main().
As chavetas { e }
agrupam instruções, sendo equivalentes às palavras
chave begin e end
do PASCAL.
É possível colocar comentários em qualquer posição
de um programa em C. Um comentário é qualquer texto delimitado
pelos caracteres /* e */.
Por exemplo:
/* O meu primeiro programa em C */
main()
{
/* Outro comentário
*/
}
Os comentários não podem ser imbricados. Assim, o exemplo
seguinte:
/* O meu primeiro programa em C */
main()
{
/* Comentário
/* Mais um comentário */ */
/* Ilegal */
}
… é ilegal.
Um programa mínimo mais útil
O seguinte programa produz uma saída, escrevendo algum texto no
vídeo:
main()
{
printf("Hello world!\n");
exit(0);
}
printf e exit
são funções que existem na biblioteca standard da
linguagem C. Veremos o que fazem mais tarde.
Criação, compilação e execução
de um programa
Os estados de desenvolvimento de um programa em C são geralmente
os três que constam do título desta secção,
ou seja:
-
Criação do programa fonte (texto)
-
Compilação desse programa, para a sua tradução
para código executável
-
Execução do código produzido
No caso da detecção de qualquer erro em qualquer dos estados,
todos eles deverão ser repetidos desde o início.
Criação do programa
A criação dos programas fonte em linguagem C faz-se com o
auxílio de um editor de texto genérico, ou específico
de um ambiente de desenvolvimento. Em geral, os arquivos de texto produzidos
deverão ter a extensão .c,
para poderem ser reconhecidos automaticamente pelo compilador como sendo
arquivos contendo código fonte em C. Obviamente o conteúdo
dos arquivos deverá verificar rigorosamente a sintaxe da linguagem
C.
Quando usamos o compilador TurboC da Borland em ambiente PC, os programas fontes tem por default a terminação .CPP
Compilação
A compilação dos programas em C faz-se através da
invocação de um compilador (p. ex. no UNIX, o comando cc).
O comando de compilação deverá ser seguido pelo nome
do arquivo que contém o código fonte (geralmente com a extensão
.c). É também comum
colocar como parâmetros de chamada do compilador, várias opções
de compilação (p. ex. no UNIX, a indicação
do nome do arquivo executável com o resultado da compilação).
Assim uma compilação básica poderia ser executada
no UNIX através do comando:
cc program.c
onde program.c é o nome do
arquivo contendo o código fonte.
Se existirem erros de sintaxe no código fonte, o compilador detecta-los-á
e indicará a sua localização junto com uma breve descrição
do erro. Erros na lógica do programa apenas poderão ser detectados
durante a execução do mesmo. Se o programa não contiver
erros de sintaxe o compilador produzirá código executável.
Tratando-se de um programa completo o código executável é
colocado, por defeito, num arquivo chamado a.out
(isto no UNIX). Se se pretender colocar o resultado da compilação
noutro arquivo deverá utilizar-se a opção -o:
cc -o program program.c
Neste caso o código executável é colocado no arquivo
program que é já criado
com os necessários direitos de execução (no UNIX).
Execução do programa
Se a operação anterior tiver sucesso, a execução
do programa compilado produzido faz-se simplesmente invocando-o como se
fosse um comando do sistema operacional.
Durante a execução podem tornar-se evidentes mais alguns
erros: erros de execução (p. ex. divisão por zero),
ou erros que levem a que o programa não se comporte como esperado.
Neste caso é necessário voltar à edição
do programa fonte para corrigir a sua lógica, e depois efectuar
também uma nova compilação para produzir a nova versão
do código executável.
Ambiente Integrado de Desenvolvimento
Atualmente usamos um ambiente integrado para desenvolvimento, compilação e testes de programas. Assim tanto no ambiente PC com em Unix podemos usar ambiente integrado de Desenvolvimento inclusive com opção Debug.
No PC temos o Turbo C como um exemplo de ambiente integrado, além de outros como Borland C, C Builder, Visual C etc.
No UNIX, em Linux, temos o xwpe - XWindow Programming Environment para ambiente gráfico com Xwindows e o wpe para ambiente caracter, sendo ambos ambiente integrado com todas as facilidades necessárias para o desenvolvimento de pequenos programas ou grandes projetos.
O modelo de compilação da linguagem C
Salientaremos aqui apenas os pontos principais do modelo de compilação
da linguagem C.
Esse modelo pode ser ilustrado através da figura seguinte.
O pré-processador
O pré-processador será estudado em maior detalhe mais tarde.
Contudo iremos adiantar alguma informação mais básica
agora.
O pré-processador actua apenas ao nível do código
fonte, modificando-o. Trabalha apenas com texto. Algumas das suas funções
são:
-
remover os comentários de um programa;
-
interpretar directivas especiais a si dirigidas, que começam pelo
carácter #.
Por exemplo:
-
#include - insere o conteúdo
de um arquivo de texto no arquivo corrente. Esses arquivos são usualmente
designados por cabeçalhos (header files) e têm a extensão
.h:
-
#include <math.h> - Insere o conteúdo
do arquivo math.h com a declaração das funções
matemáticas da biblioteca standard.
-
#include <stdio.h> - Idem para
as funções standard de entrada/saída.
-
#define - define um nome simbólico
cujas ocorrências no arquivo serão substituídas por
outro nome ou constante:
-
#define MAX_ARRAY_SIZE 100 - substitui
todas as ocorrências de MAX_ARRAY_SIZE por 100.
O compilador
Alguns compiladores traduzem o código fonte (texto) recebido do
pré-processador para linguagem assembly (também texto). No
entanto são também vulgares os compiladores capazes de gerarem
directamente código objecto (instruções do processador
já em código binário).
O assembler
O assembler traduz código em linguagem assembly (texto) para código
objecto. Pode estar integrado no compilador. O código objecto é
geralmente armazenado em arquivos com a extensão .o (unix) ou .obj
(ms-dos).
O linker
Se o programa referencia funções da biblioteca standard ou
outras funções contidas em arquivos com código fonte
diferentes do principal (que contém a função main()
), o linker combina todos os objectos com o resultado compilado dessas
funções num único arquivo com código executável.
As referências a variáveis globais externas também
são resolvidas pelo linker. Mais pormenores mais tarde.
A utilização de bibliotecas
A linguagem C é muito compacta. Muitas das funções
que fazem parte de outras linguagens não estão directamente
incluídas na linguagem C. Temos como exemplo as operações
de entrada/saída, a manipulação de strings e certas
operações matemáticas.
A funcionalidade correspondente a estas e outras operações
não faz parte integrante da linguagem, mas está incluída
numa biblioteca externa, bastante rica e standard. Todas essas operações
são executadas por via da invocação de funções
externas definidas nessa biblioteca standard. Num dos últimos capítulos
serão fornecidos detalhes acerca de algumas das funções
da biblioteca standard do C.
Qualquer programador poderá desenvolver a sua própria
biblioteca de funções, podendo até substituir algumas
das funções standard, e também utilizar outras bibliotecas
comerciais já existentes (p. ex. NAG, PHIGS, etc).
Características da linguagem C
Algumas das características do C que levaram a que se tornasse uma
das mais populares linguagens de programação, são:
-
Pequeno tamanho da sua definição
-
Subdivisão do código e grande utilização de
funções
-
Alguma conversão automática entre tipos de dados (ao contrário
do Pascal)
-
Linguagem estruturada
-
Disponibilidade de operadores para programação de baixo nível
-
Utilização fácil e extensa de apontadores para aceder
memória, vectores, estruturas e funções
Algumas das razões que tornaram o C uma das linguagens predilectas
dos programadores profissionais são:
-
A possibilidade de usar construções de alto nível
-
A possibilidade de utilizar operadores de baixo nível
-
A produção de código executável eficiente
-
A disponibilidade de compiladores em praticamente todos os sistemas de
computação
Neste momento todos os compiladores seguem o standard internacional
conhecido por ANSI C (American National Standards Institute).
Marcos históricos
-
1969 - Desenvolvimento do UNIX (num PDP 7 em linguagem Assembly)
-
1969 - Desenvolvimento da linguagem BCPL, próxima do Assembly
-
1970 - Desenvolvimento da linguagem B, sucessora da anterior (o B é
a 1ª letra de BCPL)
-
1971 - Primeiro desenvolvimento da linguagem C, sucessora da anterior (o
C é a 2ª letra de BCPL)
-
1973 - O sistema operativo UNIX é reescrito em linguagem C
-
1978 - Primeira edição do livro The C Programming Language,
Kernighan & Ritchie
-
1983-1988 - Definição do ANSI C
Exercícios
1. Crie, compile e execute o seguinte programa em C:
void main(void)
{
int i;
printf("\t Número \t\t Quadrado\n");
for (i=0; i<=25; ++i)
printf("\t %d \t\t %d\n",
i, i*i);
}
2. Crie um programa em C que escreva no vídeo o seu nome e endereço.
REV 02/99