Artigo sobre Desenvolvimento de Sistemas. 3a. Parte

C e a mãe de todas as principais linguagens da atualidade, dela vieram o C++, C#, Objective-C, PHP, Java, etc. É uma linguagem muito simples, mas poderosa, com um conjunto de comandos de auto nível  com capacidade de atuar bem no fundo da estrutura da máquina. 

Ela foi dotada do poder de manipulação direta da memória e dos registros do processador, podendo extrair o máximo de todos os recursos que a maquina possui. Claro, não podia ser diferente, já que foi projetada inicialmente para a construção de sistemas operacionais, que são, por definição, a alma do computador.

Mesmo com todo esse poder e liberdade que ela proporciona ela é uma linguagem perigosa, um simples erro em um único bit manipulado pode acarretar uma catástrofe sistêmica no computador. Há ferramentas que tentam identificar esses possíveis tipos de erros, mas mesmo com eles o problema não fica completamente resolvido.

Vamos iniciar nossos estudos com ela a mãe de todos os sistemas. Para iniciarmos nossos trabalhos devemos nos organizar primeiro. Alocando os recursos e ferramentas necessárias para desenvolvimento.

Podemos programar em C para todas as plataformas, então a primeira coisa a se decidido é: Qual plataforma usar?

Neste trabalho vou usar uma máquina com arquitetura 64bits formado por um processador i3 da Intel com 16 Gb de memória e 2 Tb de armazenamento em disco.

Vou trabalhar com a plataforma Linux. A escolha não foi ar britaria. Atualmente Linux é o sistema que trabalho e, por conseqüência, tenho muita familiaridade.

Escolhi o Linux da distribuição Ubuntu versão 10.4 The Lucid Lynx LTS (Longo Tempo de Suporte) de 64 bits. Ele é de longe a distribuição mais fácil de instalar e usar.

Agora falta escolher as ferramentas. Para programar em C basicamente precisamos de um compilador, um linkeditor, um editor de texto, um construtor de projetos e programas para depuração, isto é, ferramentas que nos ajudam a achar e detectar erros.

Podemos usar sistemas de desenvolvimento que integram todas estas funcionalidades, mais aqui vou trabalhar de modo o mais simples possível.

O compilador que vamos usar é o gcc, este compilador e opensorce e é um dos mais avançados existentes [P1] .

O editor será o gvim. Ele é uma versão gráfica do famoso vi, bem é famoso para usuários Unix, você pode e deve usar o editor de texto que tenha maior familiaridade. O importe é usar um editor de texto que gere arquivos com caracteres ASCI puro. Editores de texto tipo Word não servem, pois eles incluem no próprio arquivo as informações de formatação de texto. Estas informações de formatação de texto seriam interpretadas como erros pelo compilador.

O construtor de projetos e os sistemas de depuração (Ferramentas para encontrar erros no programa) serão discutidos em artigos futuros.

A unidade básica e funcional do C á a função. Toda a estrutura de um programa é organizada em chamadas de funções. Que podem estar num único arquivo ou em arquivos separados e estes podem ser organizados em bibliotecas. As bibliotecas juntam um conjunto de funções com um mesmo grau de coesão, isto é, funções que atendam um tipo específico de tarefa. Por exemplo: uma biblioteca gráfica como OpenGl possui funções para  desenho 2D e 3D.

Num programa C existe uma função que é chamada na execução de um programa. Ela se chamada main. Esta função e obrigatória em C e tem o seguinte formato:

int main(int argc, char * argv[ ], char  * envp[ ])
{
               return 0;
}

Esta função retorna para o sistema um valor do tipo int, esta informação é fornecida antes do nome da função. Argc, argv e envp são dados que são passados para função que poderá operá-los. A palavra char seguido de * e a palavra int especifica o tipo de dado que foi passado para o programa. Estes dados são guardados em memória e sua definição indica ao compilador quanto de memória cada dado ocupa e sua localização, Estas informações são essenciais para a manipulação dos dados.

Vamos compilar um programa bem simples. Crie um arquivo texto chamado oPrimeiro.c e digite o seguinte:

int main(int argc, char * argv[ ], char  * envp[ ])
{
               return 0;
}

Salve este arquivo e onde você salvou digite a linha a baixo na shell de comando.

gcc -c oPrimeiro.c

Se você não digitou nada de erro no arquivo no diretório aparecerá o seguinte arquivo:
oPrimeiro.o

Este é o arquivo compilado para sua plataforma, em  em código de maquina do processador da máquina.

Agora precisamos linkar o arquivo. O linkeditor, conforme a seguinte definição da wikipedia:
"Ligador (Vinculador no Brasil) ou Linker ou Linkeditor, em informática, é um programa que liga objectos gerados por um compilador ou montador, formando assim o ficheiro executável final. O trabalho de um Ligador é bastante simples: Estabelece a amarração ou vinculação entre referências mais abstratas para referências mais concretas.[1] Por exemplo, pega uma referência escrita por um programador como obtenhaImposto e estabelece a vinculação para a "localização de 726 bytes após o início do módulo executável no módulo iosys".
Permite preparar o arquivo objeto para se tornar um arquivo binário executável.
Para linkar o programa digite:

gcc -o oPrimeiro oPrimeiro.o

O link criará um arquivo chamado oPrimeiro com permissão de execução.

Este programa não faz nada. Vamos dar alguma funcionalidade ao programa. Vamos escrever na shell a seguinte frase: Ola mundo!!!

A linguagem C não dá suporte à saída de dados. Para isso foi criado bibliotecas com funções que permitem que C tenha capacidades que sua linguagem não suporta. O padrão ANSI criou uma definição de uma biblioteca padrão onde desenvolvedores podem codificar estas funções para varias plataformas. Normalmente cada compilador ao ser instalado vem com esta biblioteca. Para usarmos esta biblioteca em nosso programa teremos que incluir mais informação no arquivo oPrimeiro.c.

#include <stdio.h>

int main(int argc, char * argv[ ], char  * envp[ ])
{
               printf(“Alo Mundo!!!\n”);
               return 0;
}

Use os mesmos comando de compilação e linkedição.

Ao executar o seu programa agora a seguinte mensagem aparecer na Shell:
Alo Mundo!!!

O comando #include coloca um arquivo texto externo dentro do seu arquivo antes de o arquivo ser submetido ao trabalho de compilação.

O arquivo stdio.h possui as informações que permitem ao compilador e o linkeditor criar o arquivo objeto e o arquivo executável. Ele se encontra normalmente no diretório /usr/include. A função printf permite enviar um conjunto de dados ao dispositivo padrão de saída.

Alo mundo esta envolto em aspas duplas, isto informa ao compilador que se trata de uma seqüência de caracteres e o \n representa um caracter especial que indica mudança de linha no dispositivo de saída.

O comando return para a execução da função, e neste caso por ser a função principal encerra o programa e devolve um valor para o sistema. No Linux este valor vai para uma variável de ambiente chamada: “?”(interrogação).
Para ver o valor dessa variável de ambiente digite:

echo $?
0

Mude o valor do return e você vera este valor na variável ?. E graças a este artifício           que podemos verificar se o programa executou sem erros, claro esta informação e dada pelo programa e é o desenvolvedor o responsável pela sua codificação. Por padrão em Unix um retorno 0 representa uma execução sem erros diferente de zero o programa encontro erros na execução, estes erros não são erros de compilação ou de codificação errada, normalmente são erros inerentes ao processamento da informação como dados passados errados para o programa ou algum erro inesperado no hardware.

Nos próximos artigos vamos desenvolver uma maneira de entrada de dados e vamos ver como representar dados no programa.

________________________________________

[P1]Há algumas técnicas de programação que tem o objeto otimizar o programa, isto é, organizar o código para o programa rodar mais rápido. Normalmente tais técnicas deixam o código mais curto, porem mais complexo e difícil de ser entendido. Tais técnicas não são mais necessárias.  Os novos compiladores analisam e geram o código objeto(Código em linguagem de maquina) otimizado, logo dispensa o uso de tais técnicas. Isto permitiu que os desenvolvedores parassem de se preocupar com a otimização do código e concentrassem em fazer um código limpo e de fácil entendimento, preocupação muito relevante para futuras manutenções. Isto mesmo manutenção, se o seu sistema for útil e acrescentar valor a atividade do usuário, este com certeza vai querer evoluí-lo e expandi-lo para se adaptar as suas necessidades e possíveis mudanças.

Comentários