quarta-feira, 2 de setembro de 2009

Curso de C - Aula 1: O primeiro passo

Introdução:
Começando uma seção de programação do nosso site e daqui para frente semanalmente vou colocar as aulas de C que estou convertendo para o formato ONLINE.

Com o intuito de uma introdução teórica, utilizaremos a linguagem C, a linguagem de programação mais utilizada no mundo. Vários dos meus artigos tem base em outros artigos/sites (a maioria do exterior, senão todos) como fonte de pesquisa. Procure por estes na área de links, sempre estarão disponíveis e serão muito úteis para consultas futuras e aprofundamento no assunto.

Não espante-se com alguns termos e vários conceitos novos, o ato de programar é mais fácil do que parece, não se assuste, com um pouco de leitura e tempo para praticar você pode tornar-se um bom programador C.

"Programar é o ato de pensar utilizando-se algumas padronizações (pré-definições). Aqui vou tentar direcionar como você deve canalizar seus pensamentos para resolver os problemas propostos e te colocar a frente das padronizações da linguagem C".

Programar é só isso, resolver problemas da vida real de forma "entendível" ao computador. Mostrar-lhe como você fez em uma linguagem que ele entenda.

Um bom programador C, o que você tende a ser tornar, é algo que está em falta no mercado. Se tem a idéia que o mercado de programação está saturado e tem programadores saindo pelas janelas. Não é verdade. O que não falta por aí na verdade são programadores de "linguagens" visuais e programas populares de propósito superficial e de rápida implementação que não servem para o "trabalho pesado", está área sim, está saturada. Fora que se você for administrar um ambiente UNIX, C será um diferencial no seu dia-a-dia. Pode apostar.

Irremediavelmente, quando uma empresa precisa fazer um programa "pesado" (algo robusto e flexível ao mesmo tempo, bem modelado e que utilize toda potencialidade possível de sua máquina) ela tem que utilizar o C, e a falta programadores desta área é notória. É uma mão de obra muito escassa e que cada vez mais ganha destaque e valor no mercado.

Como nem todos tem a sua disposição um servidor com UNIX ou não tem Linux eu vou usar recursos visuais, front-end gráfico que faz o programa parecer mais amigável, mas isso é casca, perfumaria ... na verdade não importa muito. O importante realmente são os conceitos, é o que está acontecendo por trás, como as coisas funcionam e justamente isso que será nosso enfoque.


Senta que lá vem História:
Em 1973, Dennis Ritchie, pesquisador da Bell Labs rescreveu todo sistema UNIX para uma linguagem de alto nível (na época considerada) chamada C (desenvolvida por ele), para um PDP-11 (o microcomputador mais popular na época). Tal situação de se ter um sistema escrito em linguagem de alto nível foi ímpar e pode ter sido um dos motivos da aceitação do sistema por parte dos usuários externos a Bell e sua popularização tem relação direta com o exponencial uso do C.

Por vários anos o padrão utilizado para o C foi o que era fornecido com o UNIX versão 5 (descrito em The C programming Language, de Brian Kernighan e Dennis Ritchie - 1978. Se você está interessado em saber mais, vá para a introdução).

Começaram a surgir diversos diversas implementações da tal linguagem e os códigos gerados por tais implementações era altamente incompatíveis. Não existia nada que formalizasse essas compatibilizações e com o aumento do uso das diversas "vertentes" da linguagem surgiu a necessidade de uma padronização, algo que todos devessem seguir para poderem rodar seus programas em todos os lugares que quisessem.

O ANSI (American National Standards Intitute, Instituto Americano que até hoje dita diversos padrões) estabeleceu em 1983 um comitê responsável pela padronização da linguagem. Atualmente, a grande maioria dos compiladores já suportam essa padronização.

Trocando em miúdos, o C pode ser escrito em qualquer máquina que se utilize de tal padrão e rodar em qualquer outra que também o faça. Parece inútil? Não, na verdade isso é a semente de grande parte dos avanços tecnológicos que toda programação nos tem proporcionado no mundo de hoje. Com o tempo isso ficará mais claro.

Características da Linguagem C:
C é uma linguagem que alia características de linguagens de alto nível (como pascal, basic) e outras de baixo nível como assembly. O que isso quer dizer? Que C junta flexibilidade, praticidade e poder de manipulação da máquina diretamente e, por isso, não traz as limitações dessas linguagens, como dificuldade de uso, limitações na operação, etc. C permite liberdade total ao programador e este é responsável por tudo que acontece, nada é imposto ou acontece simplesmente ao acaso, tudo é pensado pelo programador e isso significa um bom controle e objetividade em suas tarefas, o que não é conseguido em outras linguagens que pecam em alguma coisa.

C é uma linguagem que podemos chamar de estruturada. Não queremos nos ater muito a nomenclaturas, mas ling. estruturadas são linguagens que estruturam o programa em blocos para resolver os problemas. A filosofia básica de uma linguagem estruturada é dividir para trabalhar, você divide um problema em pequenas partes que sejam possíveis de serem feitas. Por exemplo, temos um problema grande que é impossível de se resolver sozinho, dividimos este problema em pequenas partes simples que se integrando os pedacinhos acabam resolvendo o problema maior complexo.

Outra coisa atrelada a essa idéia básica de dividir para trabalhar é que as divisões sejam feitas de modo que os módulos sejam independentes ao máximo do contexto onde se está inserido.

O que isso quer dizer? Que os módulos tem que ter um caráter geral, independente, para que futuramente possa ser encaixado em outro problema que possa necessitar da tarefa que esse módulo realiza. Você precisa apenas saber o que a rotina faz e não como ela faz, isso pode ser útil para compartilhar código. Imagine que daqui a 1 ano, você tenha diversas funções desenvolvidas e deseje criar um programa com algumas similaridades do que você já criou. Simples, basta pegar as funções que você nem lembra mais como funcionam mas sabe o que elas fazem e encaixar no lugar certo do seu novo programa, economizará muito código e tempo.


Vamos a um exemplo, tem-se um problema de matemática de arranjo ou combinação (probabilidade? matemática combinatória?) Também não sou muito bom nisso:) e precisa-se calcular a fatorial de determinado número. Uma vez feita a função de fatorial, não importa como ela trabalha. O que me interessa é só passar como para metro para esta função o número que eu quero ter o seu fatorial calculado e receber o resultado pronto. Você só se preocupou uma vez em saber como funciona tal função para criá-la.

Outra situação, imagine você trabalhando em um grande projeto e seu trabalho ser parte de um problema maior. Você sabe o que tem, o que é recebido pelo seu módulo, o que ele deve trabalhar e qual saída deve gerar. Só com essas informações deve-se fazer o trabalho e futuramente entregar a alguém que não sabe como ele funciona e sim apenas as especificações pedidas. Ele simplesmente fará a inserção no contexto do programa. Note, nem você sabe o que o programa todo faz ou como funciona. Nem o responsável por juntar sabe como o seu programa funciona por dentro e sim apenas o que ele faz e onde deve ser inserido. Isso é bastante comum para quem trabalha com programação.

Compilada ou Interpretada:
C é uma linguagem compilada, utiliza de um compilador C para ser executado. Ao contrário de outras linguagens que utilizam de um interpretador para tal. Na concepção da linguagem é que se decide se ela vai ser compilada ou interpretada,
pois é um detalhe de implementação (que não deixa de ser importante). A priori qualquer uma poderia ser interpretada ou compilada.

Na verdade, quem faz um programa ser executado é também um programa, só que um programa avançado que lê todo código fonte (o que foi escrito pelo programador) e o traduz de alguma forma para ser executado, isso acontece em todas linguagens.

A diferença básica é que um interpretador lê linha a linha do fonte, o examina sintaticamente e o executa. Cada vez que o programa for executado esse processo tem de ser repetido e o interpretador é chamado. Já um compilador, lê todo programa e o converte para código-objeto (código de máquina, binário, 0's e 1's) e pronto. Sempre quando tiver que ser executado é só chamá-lo, todas instruções já estão prontas para tal, não tem mais vínculo com seu código-fonte.

Bem pessoal, muitos conceitos novos já foram dados por hoje. Aproveite essa semana para tentar instalar LINUX na sua máquina ou um compilador gcc para poder fazer os exercícios.

Uma boa semana e até a próxima !

Nenhum comentário:

Postar um comentário