segunda-feira, 19 de outubro de 2009

Compilação (mais um pouco de teoria rsrs)

Antes de irmos à prática (que é a forma mais eficiente de se aprender),vamos a mais um pouquinho de teoria rsrs!!!

Vamos programar?
Programar é a arte de fazer programas (pode copiar a frase que eu deixo ;).
Um programa é um conjunto de instruções na linguagem que o computador entende, chamada de linguagem de máquina. Aquela que descobrimos nos posts anteriores.
Voltando a este assunto, também falamos que a linguagem C não é essa linguagem, e sim um meio termo entre a linguagem humana e a linguagem do computador, e precisa ser traduzida para que o computador a entenda.
A tradução da linguagem C para a linguagem de máquina é feita por um programa (isso mesmo!) chamado COMPILADOR. Além disso, tem um outro programa chamado LINKER, que faz o 'arremate' (alguém pode me sugerir uma palavra melhor, por favor) dessa 'tradução', juntando (montagem) algumas funções essenciais para o seu funcionamento.
Como isso é feito? De forma resumida é basicamente assim:

1. Usando o C criamos um 'script'/'roteiro' (CÓDIGO FONTE) que 'diz' tudo o que queremos que o computador faça.

2. Esse CÓDIGO FONTE passa por um pré-processador, que realiza alguns ajustes nele (veremos que ajustes são esses quando começarmos com a prática).

3. O CÓDIGO FONTE processado passa pelo COMPILADOR (e o ASSEMBLER, que não veremos em detalhes aqui), que gera um arquivo 'traduzido' chamado de CÓDIGO OBJETO, que apesar de já estar em linguagem de máquina, não pode ser executado pelo computador.

4. Este CÓDIGO OBJETO passa então pelo LINKER, que faz o 'arremate' do programa, gerando um o CÓDIGO EXECUTÁVEL.

5. Para que esse CÓDIGO EXECUTÁVEL funcione ele tem que ser 'carregado' para a MEMÓRIA, mas isto já é com o sistema operacional.





Dito isto, agora sabemos o que é necessário para criar um programa em si, que seria exatamente:

-Um programa para criar o CÓDIGO FONTE,

-Um COMPILADOR,

-E um LINKER.

O CÓDIGO FONTE pode ser criado com qualquer editor de texto não-formatado (word não serve!), como, por exemplo, o Bloco de Notas do Windows.

Já o COMPILADOR e o LINKER, precisam ser adquiridos (não necessáriamente comprados). Existem vários, inclusive gratuitos, disponíveis na Web.

Todos estes componentes necessários podem ser adquiridos de forma integrada, naquilo que se chama de IDE (integrated development environment, traduzindo: ambiente de desenvolvimento integrado).

Em nossos estudos, usaremos a IDE gratuita (e muito boa!) Dev C++ da Bloodshed que você pode baixar aqui e aqui.

No próximo post veremos a instalação, algumas configurações, e alguns exemplos desta IDE.

domingo, 18 de outubro de 2009

A linguagem C. Tipos básicos.

Depois da nossa (necessária) introdução sobre o funcionamento do computador, vamos ao que realmente interessa.

A linguagem C.
Não vou falar aqui sobre a história da linguagem C, que você pode ver aqui; vamos direto ao lado prático da 'coisa'.

Nos posts anteriores falamos bastante sobre PROCESSADOR e MEMÓRIA. Talvez você tenha achado isto muito chato (eu também achava ;), mas garanto que depois de ler este post, isso vai mudar um pouco.

Um programa de computador é uma série de instruções que diz ao PROCESSADOR o que ele deve fazer (cálculos, pesquisas, etc.). Para fazer o que é ordenado ele usa a MEMÓRIA durante todo o tempo. É lá que ficam os dados que ele tem que processar e as instruções que ele tem que executar.
Até aqui nos referimos à MEMÓRIA como um 'quadro'. Isto é útil para entender o conceito de dados 'rápidos'. Entretanto, precisamos ampliar este conceito para algo mais próximo do mundo real.
Falamos que poderíamos escrever em qualquer lugar do 'quadro', mas não deixamos claro como o PROCESSADOR encontra a posição onde escrever.
Para explicar como, vou usar a analogia de uma folha de papel quadriculado. Seria como se existissem várias linhas verticais e horizontais paralelas, dividindo o nosso quadro em vários 'quadrinhos' (como uma planilha do Excel). Esses 'quadrinhos' são então endereçados (recebem uma identificação); se pensarmos em termos de planilha, cada um desses 'quadrinhos' está em uma linha e coluna específica; o que torna cada um deles único e inconfundível.
Qual o tamanho de cada 'quadrinho' destes? Isto depende do que vai ser escrito nele.
Lembra do conceito de byte? Pois bem, cada 'quadrinho' tem exatamente um byte, o que torna possível armazenar cada símbolo num único 'quadrinho'.
Pensando assim, a palavra CASA ocupará 4 'quadrinhos' (na verdade 5, mas isto será visto mais tarde), e o número 1000 ocupará também 4 'quadrinhos'. (Uma palavra é representada pelos seus símbolos na tabela ASCII e um número é representado pelo seu equivalente binário)


Hoje com MEMÓRIAS com a capacidade superiores a 1.000.000.000 bytes custando poucos R$, não haveria problema nenhum com esta lógica. Só que quando os computadores foram criados, as MEMÓRIAS eram bem menores e muito mais caras, e usar 4 'quadrinhos' para armazenar o número 1000 era desperdício. Por quê?

Lembra que dissemos que qualquer número poderia ser representado de forma binária? Pois bem, o número decimal 1000, corresponde ao número binário 1111101000, que tem 10 bits, 2 a mais que os 8 bits de 1 byte. Sendo assim se usarmos 2 'quadrinhos' podemos armazenar o número 1000 em formato binário, o que significa uma economia de 2 'quadrinhos'; no caso, 2 bytes.


E como o PROCESSADOR saberá quantos 'quadrinhos' usar para fazer o que é ordenado?
Como sabemos o COMPUTADOR/PROCESSADOR só faz o que lhe é ordenado e da forma que lhe é ordenado. Então só precisamos 'dizer' a ele quantos 'quadrinhos' queremos que ele use.
É aí que entra um conceito fundamental da linguagem C: os TIPOS.

A linguagem C define 4 tipos básicos: char, int, float e void.

O char ocupa exatamente 1 byte, e é usado para representar símbolos (letras, acentos, caracteres de pontuação), ou qualquer outra coisa que possa ser representada usando 1 byte; pequenos números, por exemplo (até 255 'cabe' em 1 byte).

O int é usado para armazenar números inteiros, normalmente usa 2 bytes (alguns computadores podem usar 4 bytes).

O float é usado para armazenar números com casas decimais, e para isto usa, na maioria dos computadores, pelo menos 4 bytes.

O tipo void é um tipo especial, e representa NADA. Você não leu errado. Representa NADA; na verdade, um nada que pode se transformar em qualquer coisa (meus colegas de faculdade: notaram alguma semelhança com o conjunto vazio das aulas de matemática discreta rsrsrs).

Até aqui tranquilo, certo?
Então me diga: Quantos bytes são necessários para representar o número 99999?
Depois de fazer algumas contas (eu não, a calculadora do windows ;), convertendo o número decimal 99999 para o seu equivalente binário, temos 11000011010011111, que tem 17 bits, 2 bytes mais 1 bit. Se o computador em que estamos trabalhando usar 2 bytes para armazenar o tipo int, o número 99999 decimal não vai 'caber'. E agora?
Para isto o C (vou chamar a linguagem C assim, já que agora estamos ficando íntimos ;) utiliza um recurso chamado de modificadores de tipo.

Os modificadores de tipo usados em C são 4 (de novo!): long, short, signed e unsigned.

O modificador long dobra a quantidade de bytes usados para armazenar o tipo int, se forem 2 bytes passam a ser 4 bytes, ou seja, 32 bits (será que agora 'cabe'? ;).

Por hora,vamos falar somente do long. Os outros serão vistos ao longo da nossa caminhada.


Uma última coisa para encerrar este post (se é última coisa, claro que é pra encerrar rsrs!).
Lembra que falamos que se houver alguma coisa 'escrita' num dos nossos 'quadrinhos' ela seria perdida pra dar lugar a nova? Podemos dizer então, que o conteúdo deste 'quadrinho' pode mudar, ou melhor dizendo, variar. Por causa disto, quadrinho recebe o nome de 'VARIÁVEL'.
Se quisermos que o conteúdo do nosso 'quadrinho' não mude nunca, mandamos que o PROCESSADOR não deixe que ele seja alterado; ou seja, que trate este quadrinho como 'CONSTANTE'.

Até agora vimos o que 'dizer', mas ainda não vimos como 'dizer'.
Mas isto, só no próximo post.

sábado, 17 de outubro de 2009

O início do começo... Parte III (Final)

Continuando o que começamos aqui e aqui, vamos finalmente descobrir qual é a linguagem do computador.

Já sabemos o que é um computador e como ele funciona (sabemos?), mas para saber o que ele 'fala' precisamos saber 'do que ele é feito'.

O PROCESSADOR é formado de milhões de transistores, que por sua vez, são feitos de um material chamado semicondutor, que é um meio termo entre um condutor e um isolante; algo entre um metal e uma borracha. O que nos importa é que esse material pode conduzir ou não; e no caso do transistor, pode-se controlar isto. Quando ele está conduzindo dizemos que está ligado, e quando não, está desligado; ou seja ele possui 2 estados.
Representamos o estado ligado como 1 (um) e o desligado como 0 (zero).

Fim do mistério!!!
Por ser feito de um material semicondutor, que possui 2 estados, ligado e desligado, o PROCESSADOR de um computador, só entende 0's e 1's (sistema binário).
Para 'falar' de forma que o computador entenda, temos que 'falar' usando 0's e 1's.
Quando falamos de números isto é fácil (modo de falar rsrs), pois todo o número pode ser representado de forma binária. Mas, o mundo não é feito só de números!
Para resolver este pequeno problema, foi criado um sistema de códigos que atribui um número a qualquer símbolo (números, letras, sinais, etc.). O problema é que cada fabricante criou o seu próprio código. Tentando resolver mais este problema foi feita uma padronização (não tão padronizada assim, mas funciona na maioria dos casos ;). E assim, chegamos aos conhecidos bit e byte. Um byte é um número binário de 8 digitos que representa um símbolo qualquer; cada um desses dígitos é chamado de bit.
O 'quadro' já pode ser escrito! Podemos escrever em qualquer lugar do quadro, estando ele vazio ou não. Se tinha alguma coisa escrita antes, ela será perdida para dar lugar a nova.

Pronto! Assim encerramos o nosso início do começo. Falaremos ainda sobre estes conceitos ao longo do nosso aprendizado de C/C++, mas esta introdução já é o suficiente (por enquanto).

Vamos ao C !!!

O início do começo... Parte II

Vamos continuar a nossa jornada.


Conforme vimos no post anterior, C/C++ não é a linguagem do computador.

Vamos tentar entender agora que linguagem é essa que o computador 'fala'. Para isso, precisamos saber como ele funciona. (A partir de agora, todas as vezes que falarmos de computador, vamos nos referir ao computador pessoal, desktop ou laptop.)

Como funciona um computador?


PARTES DE UM MICRO:

1-MONITOR LCD
2-PLACA-MÃE
3-PROCESSADOR
4-MEMÓRIA RAM
5-PLACAS DE EXPANSÃO (REDE, VÍDEO, SOM,...)
6-FONTE DE ALIMENTAÇÃO
7-LEITOR DE CD/DVD
8-DISCO RÍGIDO (HD)
9-MOUSE
10-TECLADO




Na figura acima podemos ver as partes de um computador desktop. Os itens 1,7,9 e 10 com certeza devem ser conhecidos de todos. Eles são chamados de dispositivos de entrada e saída (mais precisamente: 9 e 10-entrada, 1-saída e 7-entrada/saída).


Através dos dispositivos de entrada é feita a entrada dos dados . E nos dispositivos de saída, é exibido o resultado do processamento desses dados que foram inseridos. Mais fácil que isso impossível!



Os itens de 2 a 8, formam o que é chamado comumente de UCP (Unidade Central de Processamento, e não essa UCP ;), embora, na minha opinião, este nome fique melhor indicando somente o item 3-PROCESSADOR.

O item 6-FONTE DE ALIMENTAÇÃO é o responsável por fornecer energia para os demais itens, exceto para o 1-MONITOR LCD.

Ao item 2-PLACA-MÃE, ficam conectados todos os outros, e possivelmente por isto, ela tem este nome rsrs. O item 5-PLACAS DE EXPANSÃO, permite expandir as funcionalidades do computador.

Os itens que realmente nos interessam são o 3-PROCESSADOR, o 4-MEMÓRIA RAM e o 8-DISCO RÍGIDO (HD). Estes merecem uma atenção especial, pois são a base do funcionamento do computador.



ORGANIZAÇÃO DE COMPUTADORES (até aqui isso me persegue!!! rsrsrs)





Quem faz alguma faculdade ligada a tecnologia, já deve ter se deparado com esta disciplina (ela também é chamada de Arquitetura de Computadores), que explica o funcionamento de um computador. Não pretendo ensinar aqui tudo o que ela aborda, e nem da forma que ela aborda. (Farei como o post anterior, indo do fim até o começo de forma resumida, ok?)

A figura que ilustra este tópico representa a Arquitetura de von Neumann. Nela está representada aquela base do funcionamento do computador que falei mais acima.

As UNIDADE ARITMÉTICA E LÓGICA e UNIDADE DE CONTROLE, juntas, formam o PROCESSADOR.

O PROCESSADOR é o cérebro do computador. É ele que comanda tudo o que acontece no computador. Sua 'potência' é medida atualmente em Ghz (Gigahertz), que indica o número de ciclos (oscilações/vibrações) por segundo. 1Ghz é igual a 1.000.000.000 (1 bilhão) de ciclos por segundo. Para cada operação que o computador executa ele gasta no mínimo 1 ciclo. Ou seja, a cada 1 segundo, um computador de 1Ghz pode fazer cerca de 1 bilhão de operações.

Agora só falta ver a MEMÓRIA. Ela é dividida em primária e secundária. A primária é o item 4-MEMÓRIA RAM e a secundária, o item 8-DISCO RÍGIDO (HD). Qual a diferença entre as duas?

Para explicar isto, vou usar a analogia de uma sala de aula.

A memória primária seria um quadro negro (ou branco). É usada para armazenar dados chamados 'rápidos', que serão perdidos se não forem salvos na memória secundária, que na nossa analogia seria um caderno.

O professor escreve a matéria no quadro; se você não copiar no seu caderno, assim que ele apagar o quadro, o que foi escrito se perde. Uma vez apagado o quadro, pode ser novamente escrito, quantas vezes se quiser. Quanto maior for o quadro, mais matéria poderá ser escrita sem que seja preciso apagá-lo. Por isso, quanto mais MEMÓRIA RAM um computador tiver, mais 'rápido' ele ficará, já que será necessário 'apagar' com menor frequencia.

Quanto ao caderno, tudo o que foi escrito, fica guardado, e pode ser lido novamente a qualquer momento, pode ser copiado e inclusive, apagado.

O PROCESSADOR usa a MEMÓRIA RAM o tempo todo. Usando o que é chamado de conjunto de básico de instruções, que fica armazenado na UNIDADE DE CONTROLE, ele consegue 'ler', apagar e escrever no quadro.

E o que é 'escrito' no quadro e no caderno?

Aguarde a continuação...

quinta-feira, 15 de outubro de 2009

O início do começo... Parte I

Agora que já foram esclarecidos alguns pontos; vamos ao que interessa!
C/C++ são linguagens de programação de computadores.
Linguagem? Programação? Computadores? Hã!?
Pra entender o que é isso, vamos ao começo. Ou melhor, ao final.

Computador: Isso eu sei o que é! Será?
Segundo a Wikipédia, computador "é uma máquina capaz de variados tipos de tratamento automático de informações ou processamento de dados."
Não é só essa máquina que está na sua frente, que você usa pra conversar no MSN ou 'fuxicar' no orkut alheio! Pode ser qualquer máquina que faça processamento de dados. Ficou fácil agora,né?
E o que é processamento de dados? De forma simplificada, processamento de dados é a retirada de informações úteis de um amontoado de informações qualquer.
É quando você fornece informações (entrada) e a máquina te dá um resultado destas informações (saída) de forma automática.
Uma calculadora é um computador! Isto é verdade?
Vamos aplicar a definição de computador para verificar se é ou não?
Para fazer uma multiplicação, por exemplo; como se deve proceder?
1º _Digite o 1º número;
2º _Pressione a tecla *;
3º _Digite o 2º número;
4º _Pressione a tecla =;
5º_O resultado da multiplicação vai aparecer na tela.
Do 1º ao 4º passo, são fornecidas informações (entrada). Após a finalização da entrada, automaticamente, a calculadora apresenta o resultado (saída).
Então, é verdade. A calculadora é um computador! (Você pode dar outros exemplos de computador? Comenta aí, povo!)
Mas, como isso é feito? Mágica? Voodoo? Ocultismo? NÃO!
É aí que entra a nossa próxima palavra (próxima não, anterior; já que estamos indo do fim para o começo).

Programação: Antes de explicar o que é programação, tenho algo chocante a revelar!
A calculadora, que usamos como exemplo para explicar o que é um computador NÃO SABE FAZER CONTAS!!!
Não só ela, como todas as outras calculadoras, e todos os computadores que conhecemos. (Não pare de ler ainda. Não estou delirando, nem fiquei louco.)
Antes que você pegue a sua calculadora, e jogue na parede, preste atenção ao que eu disse exatamente.
Eu disse que ela não SABE fazer contas. Não falei que as contas que são feitas nela estão erradas (isso se ela está funcionando como deveria). Confundi? Vamos 'desconfundir'.
Um computador não tem a capacidade de aprender (ainda). Portanto, não tem como saber nada. Só sabe quem aprende!
Então, como ele faz as coisas se não sabe? Resposta: Da mesma forma que você faz uma receita que viu na TV (confundi ainda mais rsrs).
Explico: Alguém vai dizendo o que fazer, e você vai fazendo, da forma que foi dito (simples,né?). A forma de dizer para o computador o que ele deve fazer, é chamada de programação (garanto que essa você já sabia!).
Voltando à calculadora... Quando o homem inventou (descobriu) a forma de multiplicar números, nem se imaginava (ou imaginava rsrs) o que seria uma calculadora. Quando a calculadora foi inventada, alguém 'disse' para ela o que deveria fazer quando a entrada fosse multiplicação (*).
Entendido até aqui? Alguma pergunta? Ou você está imaginando uma sala secreta onde alguém pega uma calculadora e 'fala' no 'ouvido' dela: "Quando for digitado *, é para multiplicar."?

Linguagem:
Houve uma época da minha vida em que eu andava com um grupo de pessoas que tinha muito a esconder. Ninguém podia saber o que se falava entre eles. Para conversar, sem que ninguém soubesse o que se falava, só usando a 'gualin do teteca'? Deutenen? (língua do catete: uma forma de falar trocando a ordem das sílabas das palavras, tem esse nome porque foi inventada num bairro carioca chamado Catete).
Só entendia a conversa, quem sabia falar daquela forma. Isso é um exemplo de linguagem.
Da mesma forma, o computador tem a sua própria linguagem. E ele só entende essa linguagem.
Para 'dizer' o que ele tem que fazer, só falando do jeito que ele entende.
Então, C/C++ é a linguagem do computador? A resposta é NÃO.
C/C++ é um meio termo entre a linguagem humana e a linguagem do computador. O que se 'diz' em C/C++ tem que ser 'traduzido' para a linguagem do computador. O que é feito por um compilador. Mas isso é assunto para outra conversa.

Continua...

Quem, o que e por quê?

Antes de começarmos a ver o que realmente interessa, quero deixar alguns pontos bem claros.

Quem: Para os que não me conhecem, me chamo Edson JR. Até onde sei, sou um cara normal (quer dizer, ninguém é realmente normal rsrs :). Trabalho com informática a cerca de 12 anos e (pasmem) gosto de C/C++. Atualmente sou aluno do 1º período de TI do IST-Petrópolis. E esta é a minha 1ª aventura na blogesfera, o que nos leva ao O que.


O que: Para falar sobre o O que, tenho que complementar o Quem.


NÃO SOU UM EXPERT EM C/C++!


Isto mesmo. Como disse lá em cima, eu gosto de C/C++. E por isso, estudo e procuro aprender tudo o que posso sobre estas linguagens de programação. Com este blog, quero passar um pouco do pouco que sei, trocar algumas idéias sobre o aprendizado e acima de tudo aprender. Por quê? Vamos a ele.


Por que: Lembra que no Quem eu disse que atualmente sou aluno do 1º período de TI? Esta é a principal razão!


Eu sempre estudei sozinho, peneirando nos infindáveis links que o Google retorna a cada pergunta, em livros usados comprados em sebos e na internet (louvado seja Deus pelos sebos, já viu a diferença de preço entre um livro novo e o mesmo usado vendido num sebo?) e em comunidades do Orkut. Só depois de muito tempo trabalhando com isso (não só programação, mas informática em geral), resolvi fazer um curso superior; afinal, o diploma dá direito a cela especial, e nunca se sabe rsrs :).


Essa volta à sala de aula me fez rever coisas que já nem lembrava como eram. Vejo bons professores, que por conta de um calendário apertado e repleto de feriados, empurram informação goela abaixo dos alunos, pressupondo que esses tem um conhecimento que, em 99,99% dos casos, não tem. Mas, vejo também, aqueles alunos que conseguem entender o que o professor está dizendo e explicam aos que não entenderam de uma forma, muitas vezes, até mais fácil do que a do professor.


Quero fazer isto aqui. Tentar explicar de forma mais fácil como programar em C/C++. A forma mais fácil nem sempre será a minha (pode ser que a minha forma de explicar seja até mais difícil algumas vezes). Para isso, conto com a participação e ajuda de todos.


Críticas, dúvidas e, principalmente, sugestões são bem vindas!