- Por Thiago "Harry" Leucz Astrizi
Apesar de parecerem tão complexo,computadores são máquinas capazes de fazer um conjunto não muito grande de operações. Normalmente eles são capazes apenas de realizar as operações básicas da matemática, são capazes de comparar valores para descobrir qual é maior ou se são iguais, podem armazenar e retirar coisas de uma memória e enviar um conjunto de sinais elétricos para periféricos como monitores, impressoras e caixas de som. Eles também são capazes de alterar a atividade que estão prestes à executar dependendo do resultado de uma conta ou comparação anterior.
Todos os programas de computador, por mais sofisticados que sejam, funcionam por meio da combinação destas operações. Programar significa escrever instruções que o computador é capaz de seguir e colocá-las dentro de arquivos.
Este artigo tem como objetivo ensinar os primeiros passos que uma pessoa deve seguir para aprender a programar. O objetivo dele é mostrar que programar não é algo tão difícil como parece à primeira vista. Na verdade, é algo que qualquer pessoa pode aprender. A revolução tecnológica trazida por computadores eletrônicos tem tornado cada vez mais importante um conhecimento básico do funcionamento de um computador. Espero que este tutorial faça a sua parte levando este conhecimento para mais pessoas.
Antes de prosseguir, devo avisar que antes de prosseguir, você deve possuir alguns conhecimentos prévios. Do contrário irá achar o meu texto confuso e sem sentido. Primeiro, estou assumindo que você já sabe o básico sobre como manusear um computador mechendo em programas desenvolvidos por outras pessoas. Saber usar um editor de textos e como salvar coisas no computador é essencial. Segundo, estou assumindo que você usa Linux. E terceiro, você deve saber o básico de como navegar em seu sistema sem interfaces gráficas, somente com um terminal. Não é preciso nenhum conhecimento tão grande nisso, mas você deve saber o que são os comandos cd, ls e rm. E também invocar programas pelo terminal. Saber o que são processos em primeiro-plano (foreground) e segundo-plano (backgroud) também ajuda. Se você não tem os pré-requisitos, recomendo que você os obtenha primeiro. Não são tão difíceis assim.
Nesta introdução, iremos apenas falar sobre um pouco de teoria. Coisas que é útil você saber. Os mais impacientes podem até pular esta parte se acharem que já estão prontos para criar um primeiro programa. O conhecimento aqui não é essencial, mas é algo que ajuda a entender o que acontece quando programamos.
No princípio, programar era uma atividade bastante complexa e só podia ser feita consultando várias tabelas. Para fazer um computador somar dois números, por exemplo, era necessário escrever uma instrução para carregar o primeiro número para dentro do processador do computador, escrever uma segunda instrução para colocar o segundo número também dentro do processador e só então escrever uma terceira instrução que ordenava que os números fôssem somados. O detalhe é que as instruções precisavam ser escritas diretamente na forma que um computador fôsse capaz de entender: digitando um monte de "0"s e "1"s. Um código escrito assim tinha a seguinte aparência:
1010101011010101010101010101101010100000101010111101010101010101010 1101001010101110101010011110101010101110000110010010101001010100001 1010010101010010101100101010001010111001010101001010111000101100100
O processo era extremamente trabalhoso e tedioso. Tanto que logo alguém teve a idéia de automatizá-lo. Para isso foi escrito um programa que recebia instruções como "carregue no processador" e "some" par em seguida traduzir isso automaticamente para "0"s e "1"s. Programas que fazem isso passaram a ser chamados de Montadores e durante muito tempo, eles ajudaram muito os programadores a escreverem instruções para o computador mais facilmente. Os códigos escritos desta forma passaram a ser mais legíveis:
# Este programa soma os números 5 e 7 addi $s1, $zero, 5 addi $s2, $zero, 7 add $s3, $s1 , $s3
Entretanto, programar ainda era difícil. Os programas eram sempre longos e continuavam sendo difíceis de entender apesar da ajuda dos Montadores. Mesmo instruções simples como "somar" eram trabalhosas e difíceis, pois era necessário entender como funcionava a máquina para saber quais instruções precisavam serfeitas em seqüência para conseguirmos somar. Foi então que alguém pensou: "Hmmm... Não seria ótimo se ao invés de escrever tudo isso eu pudesse apenas escrever '5+7'? O que impede que eu faça um programa de computador que ao receber uma operação matemática, ele traduza automaticamente esta operação para o conjunto de instruções adeqüado para aquela máquina?"
Realmente não havia nada que impedisse isso. E assim surgiram os primeiros programas capazes de traduzir operações matemáticas como (5+2)*(4+3) para instruções equivalentes. Estes programas passaram a se chamar Compiladores. Com a juda deles, códigos de programas de computador ficaram ainda mais legíveis:
// Este programa também soma 5 e 7.
int main(void){
int a = 5 + 7;
}
Programar tornou-se mais fácil. O problema maior era a necessidade de compilar e montar o programa antes de ser usado. Era preciso fazer isso em cada máquina que quizéssemos utilizar o programa. Afinal, cada computador tem o seu próprio conjunto de instruções. A conta 5+7 poderia ser traduzida de uma forma em um computador PowerPC e de outra em um computador Intel.
Foi então que veio uma outra pessoa com uma idéia nova. Esta pessoa pensou da seguinte forma: "O maior problema que temos é que cada computador tem as suas próprias instruções. Isso depende do modelo da máquina e do Sistema Operacional. Mas... E se construíssemos um "computador virtual"? Este novo computador seria na verdade um programa que atuaria como um computador: recebendo instruções e as executando. Este computador deve ser capaz de entender instruções bastante sofisticadas e próximas do idioma dos humanos. E por ser um programa, ele deve poder ser instalado dentro de qualquer outro computador real. Depois de fazermos isso, ao invés de escrevermos programas para máquinas reais, escreveremos programas para a nossa máquina virtual. E todo programa feito para ela irá funcionar automaticamente sem precisar ser compilado e montado!"
E assim foi feito. E com isso surgiram novas lingüagens de programação mais simples. Estas novas lingüagens não precisavam passar por processos de compilação e montagem. Elas funcionavam diretamente funcionando por meio de programas chamados Interpretadores. Programar uma soma ficou tão fácil como escrever:
a = 5 + 7
Tudo isso nos mostra que existem muitas formas de se programar. Quando vamos passar ordens para um computador, podemos utilizar lingüagens de vários níveis.
A lingüagem de mais baixo nível é aquela formada por montes de "0"s e "1"s. Chamamos ela de Lingüagem de Máquina. Ela é a única lingüagem que um computador entende sem que precisemos utilizar qualquer tipo de programa para traduzir o que escrevemos. O seu maior problema é o fato de ser quase impossível fazer qualquer programa complexo somente digitando "0"s e "1"s. Pelo menos se quizermos manter a nossa sanidade.
Em um nível um pouco mais alto que as Lingüagens de Máquina, estão as Lingüagens de Montagem (ou Assembly). São todas aquelas que precisam passar por um Montador que traduzirá todo o código diretamente para a Lingüagem de Máquina. Assim como cada máquina possui sua própria Lingüagem de Montagem, a Lingüagem de Montagem de cada família de computadores é sempre única. Um programa escrito nestas línguas só irá rodar nos computadores que pertencerem à mesma "marca". Para poder rodar um mesmo programa em outras máquinas, é sempre preciso reescrevê-lo. Atualmente é muito raro programadores fazerem programas em um núivel tão baixo.
A maioria dos programas que as pessoas utilizam são feitos em Lingüagens Compiladas. Estas lingüagens podem gerar programas capazes de funcionar em praticamente qualquer computador. O único problema é que eles precisam passar por um Compilador e Montador antes de poderem funcionar.
Por fim, no nível mais alto de todos estão as Lingüagens Interpretadas. Programas escritos nelas podem funcionar automaticamente em qualquer computador sem precisar passar por nenhum processo de preparação. O único pré-requisito é que o computador precisa ter instalado o Interpretador daquela lingüagem. A lingüagem que iremos aprender, Python, é interpretada.
Geralmente quanto mais alto o nível de uma lingüagem, mais fácil de aprender e mais rápido de programar ela é. Entretanto, o preço que se paga é sacrificar um pouco da velocidade e do desempenho. Quanto menor o nível de uma lingüagem, mais rápidos tendem a ser os programas gerados nelas.
Esta seção contém respostas para uma série de dúvidas que você pode ter ao começar a aprender a programar.
Se as lingüagens de mais "baixo-nível" são mais rápidas, por que eu devo começar a aprender a programar em Python se ela é de "alto-nível" e portanto, mais lenta?
Velocidade não é tudo. Com o passar do tempo, os novos computadores que vem sendo produzidos ficam cada vez mais rápidos e a velocidade dos programas torna-se algo não tão essencial. Para a percepção de um humano não há nenhuma diferença entre um programa que demora 1 milisegundo para rodar e outro que leva 100 milisegundos. Um deles é 100 vezes mais rápido que o outro, mas ao executarmos os dois, ambos parecem produzir o resultado esperado instantaneamente.
Com o tempo, a tendência que pode ser observada é que os programas passam a ser escritos em lingüagens de nível cada vez mais alto. O motivo é justamente a facilidade de aprendizado e a velocidade com que novos programas são gerados desta forma. Este motivo é o que me faz pensar ser melhor aprender a programar em lingüagens de nível alto.
Eu quero aprender a programar, mas além disso eu quero aprender como um computador REALMENTE funciona. Não somente como gerar programas. Por isso eu quero aprender a programar à partir de lingüagens de mais baixo-nível. O que devo fazer?
Existe um livro (em inglês) escrito com este enfoque. Ele é bastante didático (ou o mais didático que dá pra ser lidando com lingüagens de baixo-nível). Seu nome é Programming from the Ground Up e pode ser obtido gratuitamente aqui.
Seguir por este caminho significa aprender a programar aprendendo como um computador realmente funciona. Entretanto, os programas que você fará ao longo do aprendizado serão mais longos e serão capazes de fazer bem menos coisas do que os programas que você fará no meu tutorial. Aprender a programar por lingüagens de baixo nível pode ser desestimulante e frustrante para muitas pessoas pelo pouco resultado prático que obtém-se e pelo trabalho maior. Por outro lado, o conhecimento aprofundado do funcionamento de computadores pode ser estimulante para alguns.
O que é que dá para fazer nesta lingüagem Python?
Qualquer coisa que seja computável. Qualquer programa que pode ser obtido em uma lingüagem de programação, poderá ser obtido em outra. No fundo, todas as lingüagens são conjuntos de instruções bastante semelhantes. O que muda é a sintaxe e a gramática. Portanto, não é necessário perguntar o que dá para fazer com esta lingüagem. Em todas elas dá para fazer qualquer coisa. Muda só a quantidade de trabalho que temos dependendo do programa que queremos.
Por que você escolheu Python? Por que não Java? Ou Ruby?
Eu sei mexer melhor em Python e pessoalmente gosto muito mais da sintaxe desta lingüagem do que das outras duas.
Ruby já possui um ótimo tutorial voltado para iniciantes (AQUI).
Java eu não recomendo como lingüagem boa para se começar. Tem a vantagem das lingüagens interpretadas por poderem rodar em qualquer lugar. Mas não tem a vantagem de possuir uma sintaxe simples e enxuta. Neste sentido ela lembra muito lingüagens de baixo nível.
Eu uso Windows! E 99% das pessoas também! Por que você não faz um tutorial voltado para Windows?
Primeiro porque eu uso Linux e tenho mais facilidade para mexer nele.
Segundo porque por motivos ideológicos, sou contrário ao uso e disseminação de softwares proprietários como o Microsoft Windows. Não acho certo a forma pela qual usuários tem seus direitos tirados pela licença de uso destes programas e nem das práticas das grandes empresas da indústria de software. Por isso, não tenho interesse em estimular o uso de Windows ou estimular a criação de novos programas para este sistema.
Terceiro porque programar em Windows é muito ruim. Praticamente não existem softwares no sistema para interpretar, compilar ou montar qualquer programa. Tudo precisa ser obtido à parte. O único lugar em que dá para programar diretamente é no Internet Explorer usando Javascript (outra lingüagem interpretada). Acredite, isso não é um bom começo. O Windows carece de boas ferramentas para programação e as poucas que existem integradas ao sistema são pagas e proprietárias. Python funciona no Windows, mas é preciso a instalação de softwares à mais. Enfim, começar no Windows é mais problemático.
Como posso entrar em contato com o autor deste tutorial?
Aqui:
Computar significa calcular. Computadores são máquinas de calcular. Não é à toa que programas que lidam com números são os mais simples possíveis de serem feitos.
Bem, agora você deve estar ansioso(a) para poder fazer o seu primeiro programa, não é? Bem, então vamos começar.
Abra um editor de textos simples. Nada de usar algum que faça coisas como negrito ou sublinhado. Estas formatações inserem coisas estranhas no texto que irão impedir seu programa de funcionar. Pode ser algum simples como gedit, kedit ou kate. Ou então emacs ou vi. Não importa muito.
Em seguida, escreva (sem colocar espaços antes do print):
print 1 + 1
Agora salve o documento com o nome soma.py. Costuma-se usar a extensão ".py" para se referir à programas feitos em Python.
Você pode não acreditar, mas isto é um programa. Não foi tão difícil assim fazê-lo,né? O que ele faz é calcular quanto é 1 + 1 e imprimir o resultado na tela.
Para poder executá-lo, abra um terminal e navegue até o local em que você salvou o seu programa. Em seguida execute o seguinte comando:
harry@skynet:~$ python soma.py
2
Se tudo der certo, você verá aparecer o número dois logo após você executar o comando, como na imagem acima. Se ao invés disso apareceu alguma outra mensagem de erro, certifique-se de que você copiou o programa corretamente. Você pode ter digitado algo errado. Encontre o erro e corrija-o antes de seguir adiante.
Se tudo funcionou para você, tente também fazer alguns experimentos? Será que o programa funciona adicionando ou removendo espaços entre os números? E se colocar um monte de linhas em branco antes e depois da instrução? E se mudarmos os valores dos números? Ou se separarmos ambos os números em duas linhas? Tente brincar com o seu primeiro programa alterando-o. Tente entender os efeitos de sua alteração. E não esqueça de salvar o arquivo antes de tentar executá-lo.
Como você deve ter percebido, print é um comando da lingüagem Python que pede para o computador imprimir o resultado de tudo aquilo que vem logo em seguida até o final da linha. Removendo o print, o programa ainda funciona e ainda faz a conta, mas não imprimirá nada na tela. Você pode colocar qualquer conta logo após o comando e ele irá imprimir o resultado para você.
Somar não é a única operação que você pode fazer. É possível subtrair, multiplicar, dividir e muito mais. Assim como era de se esperar, quando você mistura adição e multiplicação na mesma conta, a multiplicação sempre é feita primeiro, seguindo as regras aritméticas. Se quiser mudar a prioridade das operações, basta usar parênteses, assim como nas notações matemáticas.
Também podemos usar exponenciação. Ela é representada pelo operador **. Assim, 2 ** 2 representa "dois ao quadrado" e 2 ** 3 é "dois ao cubo". O operando da subtração é o -, o da multiplicação é o *, da divisão é o / e para obter o resto de uma divisão é o %.
Existe mais uma coisa importante que precisamos saber antes de continuar. Toda vez que escrevemos um programa, devemos colocar no código um comentário explicando o que é o programa que estamos produzindo. O que ele faz? Por que o estamos criando? Além disso, toda vez que fazemos alguma operação complexa, devemos deixar um comentário explicando o que estamos fazendo. Contudo, nunca escreva comentários redundantes e nem gaste tempo explicando coisas óbvias. Isto é uma boa prática de programação. Para escrever um comentário, basta inserir o caractere # no código. Tudo aquilo escrito em uma linha após este caractere é considerado comentário do programador e é ignorado pelo interpretador.
Vamos ver agora um exemplo de tudo o que estamos falando?
# Este programa imprime na tela o resultado de 3 operações.
print 81 ** 9
print (2 + 42) * (37 - 7)
print 9 / 2
A primeira linha imprimirá na tela o valor de 81 elevado à nona potência. A segunda imprimirá o resultado daquela expressão com parênteses, multiplicação, soma e subtração. A terceira irá imprimir o resultado do número 9 dividido por 2. Copie isso para um arquivo e salve como contas.py.
Uau! Você já fez o seu primeiro programa com mais de uma linha. Vamos ver se ele funciona? Pelo terminal, mas uma vez vá até onde ele está e execute:
harry@skynet:~$ python contas.py
150094635296999121
1320
4
O primeiro número impresso é o resultado de 81 elevado à 9. Incrível, não? Aposto que a sua calculadora de bolso não é capaz de lidar com números tão grandes. Agora você já sabe o que fazer quando precisar fazer contas envolvendo números gigantescos. Basta fazer um programa! Er... Digo, basta programar o computador para fazer isso por você!
O segundo número é o resultado da segunda conta e o terceiro é o resultado daquela divisão. Mas... Pense bem: não tem alguma coisa errada aí? O resultado de 9/2 não é 4, mas sim 4,5!
Calma, não é um defeito! O que acontece é que nós fizemos a conta envolvendo dois números inteiros. Logo, o resultado desta conta também precisa ser um inteiro. Para obtermos números não-inteiros, devemos fazer contas envolvendo números não-inteiros. Na próxima seção aprenderemos como usá-los.
Além de lidar com números inteiros, computadores também podem lidar com números não-inteiros. Tais números são chamados de números em ponto-flutuante. Eles também podem ser chamados de floats.
Para representar um float em Python, basta escrever um número com um ponto no local onde estaria a vírgula deste número. Assim, o número 2,5 torna-se 2.5 e o 10 vira 10.0. Quase todas as operações que podem ser feitas com inteiros, também funcionam com floats. A única exceção é o %. Afinal, quando dividimos números reais e desejamos uma resposta real, a divisão nunca tem resto.
Outra coisa: você percebeu que sabendo disso nós já podemos calcular a raízes quadradas de números? Lembre-se que a raíz quadrada de um número é igual à este número elevado à 1/2. A raíz cúbica é igual ao número elevado à 1/3, e assim por diante. Desta forma, para calcular o resultado da raíz quadrada de 9, basta escrever: 9.0 ** 0.5.
Entretanto, este tipo de número tem os seus efeitos colaterais. Primeiro, a precisão dos computadores tem os seus limites. Podem acontecer alguns erros ocasionalmene porque nem todos os números reais existentes podem ser representados em um computador. Apenas uma pequena parcela. Na maioria das vezes ocorre um arredondamento para um número bastante próximo que você digitou. Na maioria dos casos, você não irá notar nenhum problema. Mas se forem feitas muitas contas com um mesmo valor, os minúsculos erros podem se acumular e gerar resultados ligeiramente incorretos.
Outro problema destes números: eles tem um limite de tamanho que muda dependendo do computador. Se você digitar 9.0 ** 81.0, provavelmente irá obter uma resposta como: 1.9662705047555292e+77. Esta é a forma do computador escrever notação científica para números muito grandes. Isso é o mesmo que: 1,9662705047555292 * 1077. Isso não se parece nem um pouco com a resposta certa que descobrimos rodando aquele programa anterior que fizemos, não é? É que agora estamos pedindo para que um float seja multiplicado por ele mesmo 81 vezes. Na primeira multiplicação obtivemos um resultado com uma margem de erro pequena. Na segunda, multiplicamos a margem de erro anterior pela atual. E assim por diante até obtermos um resultado com uma margem de erro gigantesca.
Se tentarmos calcular 8100.0 ** 8100.0, tudo fica ainda pior. Desta vez a operação não é finalizada e uma mensagem de erro estranha será impressa. O computador não pode lidar com números em ponto-flutuante tão grandes. Já se usarmos inteiros e calcularmos 8100 ** 8100, obteremos o resultado sem problemas. O único inconveniente será que a conta talvez demore um pouco e o resultado será tão grande que não caberá em sua tela. Faça alguns testes e verifique isso por conta própria.
Apesar de toda a limitação que computadores tem para lidar com números floats, eles ainda são bastante úteis. Eles são fundamentais para cálculos científicos, matemáticos e para fazer coisas como jogos. O único problema é que devemos tomar cuidado para que a nossa margem de erro não fique grande demais. Contas simples como somas, multiplicações, divisões, subtrações e exponenciações não muito grandes geralmente funcionarão sem problemas.
Até agora nós sempre imprimimos na tela o resultado de toda operação que fizemos. Mas nem sempre isso é interessante. Às vezes nós queremos fazer uma conta e guardar o resultado para usarmos depois. É para isso que serrvem as Variáveis de um programa.
Uma variável é um número cujo valor exato é desconhecido ou muda com o tempo. Todas as variáveis precisam ter um nome e um valor. O nome delas é sempre o mesmo, mas o seu valor pode ser diferente toda vez que o programa é executado ou quando pedimos para que seu valor mude. Para criarmos uma variável chamada "Var" que começa tendo o valor "5", escrevemos em nosso código:
Var = 5
Depois de fazermos isso, podemos passar a usar a variável Var em nossas contas como se ela fôsse um número. Também podemos imprimir o seu valor na tela e fazer qualquer outra coisa que poderíamos fazer com números. Quando quizermos mudar o valor da variável para 7, por exemplo, basta escrever no código:
Var = 7
Podemos até mesmo escrever coisas como:
Var = Var + 5
O que o código acima faz é aumentar o valor pré-existente da variável Var em 5 unidades.
Bem, então vamos mais uma vez tentar fazer um programa para praticarmos nosso novo conhecimento? Praticando o que estamos vendo é a melhor forma de entendermos. Que tal fazer um programa que resolva a fórmula de Bháskara? A fórmula é útil para resolver eqüações do segundo grau do tipo: aX2 + bX + c = 0. Ela pode ser enunciada da seguinte forma:
Como programar isso? É o que nos mostra o exemplo abaixo:
# Este programa resolve uma eqüação do segundo grau usando a fórmula de Bháskara
# Estas são as variáveis a, b e c da eqüação a*X*X + b*X + c = 0.
# Você pode alterá-las para mudar a eqüação que será resolvida:
a = 2.0
b = 4.0
c = 0.0
delta = b * b - 4 * a * c
print (-b + delta ** 0.5) / 2 * a
print (-b - delta ** 0.5) / 2 * a
Se salvarmos este programa como bhaskara.py e o executarmos, obteremos:
harry@skynet.com:~$ python bhaskara.py
0.0
-2.0
Se o resultado que você obteve foi o mostrado acima, seu programa está funcionando. Afinal, 0 e -2 são mesmo raízes da eqüação 2X2+4X+0=0.