Linguagem C e Makefile

C é uma linguagem de programação compilada criada em 1972 no AT&T Bell Labs para desenvolver o sistema operacional Unix (que foi originalmente escrito em Assembly). Recebeu esse nome porque suas características foram obtidas a partir de uma linguagem anteriormente chamado de “B”, que por sua vez era versão reduzida da linguagem de programação BCPL (Basic Combined Programming Language).

Seu principal objetivo é facilitar a criação de programas extensos com menos erros, recorrendo ao paradigma da programação procedural, mas sobrecarregando menos o autor do compilador. Muito utilizada para desenvolver programas de computador e no ensino de ciência da computação. Seu código possui diferentes tipos de dados:

  • int / short int (tamanho de no mínimo 16 bits) / long int (mínimo de 32 bits) / long long int (mínimo de 64 bits) – armazenar valores numéricos inteiros
  • char (ocupa 1 byte) – armazenar caracteres ou inteiros
  • float – armazenar números de ponto flutuante
  • double – armazenar números de ponto flutuante de dupla precisão
  • struct – estruturas, grupos de variáveis organizadas arbitrariamente pelo programador

Exemplo de script

Convencionalmente, arquivos terminados com extensão .c são os códigos fonte escritos em C e arquivos com extensão .h são de cabeçalho (opcionais, geralmente contém declarações de funções e variáveis definidas em outros arquivos). Todos os arquivos devem ser guardados em uma só pasta do projeto.

As diretivas instruem o pré-processador (parte do compilador responsável pelo pré-processamento) a realizar determinadas tarefas. A primeira linha do programa é uma diretiva de pré-processamento #include, que faz com que o pré-processador substitua aquela linha pela totalidade do conteúdo do arquivo o qual a diretiva se refere. Geralmente, o primeiro arquivo que aparece é o padrão stdio.h, que contém protótipos de funções para trabalho com entrada e saída.

A linha seguinte não-vazia indica que uma função denominada main será definida – essa será a função inicialmente executada. O termo void indica que a função não aceita parâmetros, mas a função main normalmente aceita parâmetros passados pela linha de comando (linha com “scanf”). É uma boa prática a declaração de variáveis (tipo e valor inicial) ficar logo no início. O comando return retorna o valor 0 para o sistema caso tenha sido executado sem erros.

#include <stdio.h>

int main(){
	int n1=0, n2=1, result=0, c, n;
	printf("Um matematico italiano da idade media conseguiu modelar o ritmo de crescimento da populacao de coelhos (Na verdade ele estava estudando o numero de galhos em um certo nivel de uma arvore) atraves de uma sequencia de números naturais que passou a ser conhecida como sequencia de Fibonacci\n\n");
	printf("Sequencia de Fibonacci. Descubra o n-esimo termo digitando n: ");
	scanf("%d", &n);
	printf("Sequencia: 1 ");
	for(c=1; c<n; c++){
		result=n1+n2;
		n1=n2;
		n2=result;
		printf("%d \a", result);
	}
	printf(".\nseu n-esimo termo eh %d", result);
	return(0);
}

O script acima imprime duas linhas na tela (printf), lê um valor digitado pelo usuário, imprime outra linha na tela, calcula os valores da sequência de Fibonacci e imprime na tela cada um dos termos até o seu n-ésimo, onde n foi definido pelo usuário – no final, esse termo é impresso com destaque na tela. Veja mais alguns scripts interessantes em C clicando no link.

Compilar

Um compilador é um programa de computador que, a partir de um código fonte escrito em uma linguagem compilada (de alto nível), cria um programa semanticamente equivalente, porém escrito em outra linguagem (linguagem de máquina, por exemplo, que são os binários executáveis). O GNU Compiler Collection (GCC) é um conjunto de compiladores de linguagens de programação produzido pelo projeto GNU. Além do C, possui suporte para Fortran, Java e outras linguagens, assim como arquiteturas Amd/Amd64, ARM, x86/x86-64, etc.

Para criar o executável utilizando o gcc, deve-se executar os seguintes comandos:

$ gcc -c nome_do_fonte.c
$ gcc main.c nome_do_fonte.o -o nome_do_executavel

Para depurar o programa, ou seja, executar o programa passo-a-passo no depurador, inclua o parâmetro “-g” no comando da primeira linha.

Make/Makefile

Uma forma de compilar automaticamente é através do utilitário make. Através da leitura de instruções contidas em arquivos denominados Makefiles, é especificado como obter o programa de destino, ordenação topológica e resolução automatica das dependências do programa que se pretende compilar.

Um arquivo Makefile é dividido em seções, sendo a seção all (a primeira seção a ser executada) pré-definida conforme esquema (TAB é tabulação):

all:[dependência1] [dependência2] ... [dependênciaN]
[TAB][COMANDO1]
[TAB][COMANDO2]
...
[TAB][COMANDON] 
[dependência1]: [dependências de 1]
...
[dependência2]: [dependências de 2]
...

Veja um exemplo (arquivo makefile, por default o comando make busca esse nome):

all:NOME_DO_FONTE
	gcc main.c nome_do_fonte.o -o nome_do_executavel
NOME_DO_FONTE:
	gcc -c nome_do_fonte.c
# Limpando tudo o que foi gerado automaticamente pelo comando clean (opcional)
clean:
    /bin/rm -f nome_do_fonte nome_do_fonte.o

No terminal, dentro da pasta do projeto, execute o comando “make” para gerar o arquivo “nome_do_executavel”. Também podem ser incluídas definições de variáveis a serem utilizadas no arquivo makefile antes do “all”, sendo recuperadas da forma “$(nome_var)”.

Depois de criar o programa, para rodá-lo basta seu nome no prompt (caso o diretório corrente esteja na variável de ambiente PATH, que é onde o sistema operacional deve procurar por aplicações) ou “./nome_do_executavel” (o “ponto barra” indica explicitamente ao sistema para executar a aplicação de dentro do diretório atual). Caso necessário, dê permissões de execução para o arquivo com o comando “chmod +x nome_do_executavel”.

Compartilhe :)

2 comments

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.