Introdução

"O computador está para a computação assim como o telescópio está para a astronomia."

Edsger Dijkstra

Neste capítulo vamos apresentar um pouco da história da computação pois isso facilita a introdução de vários conceitos importantes e a motivação de seu estudo. Nosso objetivo no entanto é apenas apresentar esses conceitos sob uma perspetiva histórica, de forma breve e sucinta. Você pode encontrar mais detalhes no site do Projeto MAC Multimídia (https://www.ime.usp.br/~macmulti/historico).

Como a história da computação está muito relacionada à evolução dos computadores (máquinas usadas para realizar as computações ou cálculos), vamos começar com uma breve descrição dessas máquinas.

Objetivos

Ao final desse capítulo você deve ser capaz de:

  • explicar como funciona um computador baseado na arquitetura de von Neumann;

  • descrever como dados e programas são armazenados na memória e definir o que é um bit, byte, kilobyte, megabyte etc.

  • identificar linguagens de programação de baixo e de alto nível;

  • descrever a diferença entre linguagens compiladas de linguagens interpretadas;

  • definir os conceitos de hardware, software, IDE, contexto de um programa, programação e computação.

Calculadoras e Computadores

A habilidade de representar quantidades e manipulá-las (como “fazer conta” de mais e de menos) é uma necessidade básica para muitas atividades humanas. O ábaco e a régua de cálculo são exemplos de instrumentos inventados para nos ajudar a “fazer contas”.

A primeira calculadora mecânica foi desenvolvida por Blaise Pascal em 1642. A Pascaline (https://en.wikipedia.org/wiki/Pascal%27s_calculator) utilizava um complexo sistema de engrenagens para realizar operações de adição e subtração.

Além de realizar operações matemáticas como fazem as calculadoras, os computadores são máquinas que podem ser programadas. Os programas de computador permitem a repetição de cálculos repetidas vezes, como por exemplo, calcular o calcular o pagamento de cada funcionário baseado no número de horas trabalhadas.

Os primeiros computadores eletrônicos (usando válvulas) foram desenvolvidos na década de 1940 e o rápido e contínuo desenvolvimento tecnológico resultou nos computadores modernos, que tem desempenho muitas vezes superior a esses primeiros computadores, com tamanho e consumo de energia muitas vezes menor. A figura 1 mostra um diagrama de blocos com os componentes básicos de um computador: a unidade central de processamento (UCP), a memória, e os dispositivos de entrada e saída. Esses dispositivos são interligados por uma via de comunicação de dados.

_images/vonNeumann.png

Esse diagrama ilustra a arquitetura proposta por John von Neumann (https://en.wikipedia.org/wiki/Von_Neumann_architecture).

A primeira coisa que vemos quando olhamos para um computador são os dispositivos de entrada e saída, necessários para que o computador se comunique com outros computadores e pessoas. Dessa forma, os dispositivos de entrada permitem que o computador receba os dados a serem processados (por meio de dispositivos como teclado, mouse, disco ou Internet) e transmita os resultados para um dispositivo de saída como uma impressora ou um monitor.

Esses dados ficam armazenados na memória do computador em formato digital, ou seja, na forma de dígitos binários. Um dígito binário assume apenas 2 valores (como zero ou um) e são mais adequados para representar eletronicamente que um dígito decimal pois é possível utilizar uma chave eletrônica (aberta ou fechada) ou um capacitor (carregado ou descarregado). Um único dígito binário é chamado de bit e 8 (oito) bits formam um byte. A capacidade da memória é comumente representada em kilobyte ou KB (cerca de mil bytes), megabytes ou MB (cerca de um milhão de bytes), gigabytes ou GB (um bilhão) e assim por diante. Hoje é comum encontrar discos com mais de 1 terabyte (um trilhão de bytes) de capacidade. Para se ter uma ideia, um filme de cerca de 2 horas de duração gravado em alta resolução pode ser armazenado usando cerca de 2 GB no formato mp4, enquanto todos os textos contidos na Enciclopédia Britânica (https://websitebuilders.com/how-to/glossary/terabyte/) no ano 2010 (último ano quando foi publicada com 32 volumes) pode ser armazenado em apenas 300 MB (300 milhões de caracteres ou cerca de 50 milhões de palavras).

Um programa de computador é uma sequência de instruções que deve ser executada uma de cada vez pela UCP. Os programas também ficam armazenados na memória em código binário (também chamado de código de máquina ou em linguagem de máquina). Uma instrução pode ser de natureza aritmética ou lógica, que basicamente permite ao computador executar operações matemáticas como uma calculadora, ou de controle. As instruções de controle permitem, entre outras coisas, movimentar dados e desviar a execução do programa. A UCP contém um pouco de memória local (ou um grupo de registradores) para trabalhar os dados internamente.

Um registrador importante que possibilita a execução da sequência correta de instruções é chamado de contador de programa (CP). O CP simplesmente aponta para o local da memória (endereço) que contém a próxima instrução a ser executada. A unidade de controle da UCP busca a instrução indicada pelo CP, a decodifica e decide se a executa ou passa para a unidade lógica e aritmética (ULA) executar. Após terminar de executar a instrução, o CP é atualizado para que a unidade de controle busque a próxima instrução. O computador fica simplesmente executando esse ciclo (busca -> executa -> atualiza CP -> busca -> …) ininterruptamente. Apesar de cada instrução ser bastante simples, um computador pessoal moderno é capaz de executar bilhões de instruções por segundo, que lhe confere o poder de realizar tarefas bastante complexas com desempenho superior a de um ser humano. Em geral essas tarefas são repetitivas e entediantes, permitindo que as pessoas tenham mais tempo livre para as atividades criativas.

Programação e Computação

A parte física dos computadores é chamada costumeiramente de hardware. A parte digital responsável pelo funcionamento da parte física (os programas de uma forma geral) é chamada de software. O objetivo de programar é criar software para resolver algum problema computacional, que pode ser um simples cálculo matemático ou algo um pouco mais complexo como controlar a navegação de um foguete até a Lua. A atividade de desenvolver esses programas é chamada de programação.

Um conceito que devemos relembrar para começar a programar é que um computador comum executa apenas uma instrução por vez e, portanto, a ordem das instruções é muito importante. Observe que, como cada instrução pode modificar o conteúdo da memória, cada nova instrução executada utiliza os dados atualizados, resultantes da execução passo-a-passo das instruções anteriores. A cada instante, dizemos que o contexto de um programa é formado pelo conjunto de valores que o programa pode acessar, armazenados na memória naquele instante.

Um programa portanto é uma sequência de instruções que, ao ser executada, vai “transformando” (processando por meio de cálculos) os dados de entrada até chegar no resultado desejado na saída. Podemos ainda considerar que cada instrução gera um resultado intermediário (dado processado) que pode ser armazenado na memória e cada resultado intermediário seguinte fica mais perto do resultado final. Resultados armazenados na memória podem ser acessados por meio de variáveis, que são “nomes” que fazem referência aos dados.

Considere por exemplo o problema de multiplicar 2 por 5. Usando apenas instruções de somar, podemos começar com o resultado de 2 + 2 (ou seja 4) e armazenar em uma variável “soma”. A seguir adicionamos 2 ao valor associado a “soma” (resultando no valor intermediário 6) e mais 2 e finalmente mais 2, chegando no resultado final 10.

Exemplo de cálculos intermediários até o resultado final

soma = 2 + 2 -> variável soma recebe o 1o resultado intermediário, com valor 4

soma = soma + 2 -> soma recebe o resultado de soma + 2, ou (2 + 2) + 2

soma = soma + 2 -> soma recebe o resultado de soma + 2, ou ((2 + 2) + 2) + 2

soma = soma + 2 -> soma recebe o resultado de soma + 2, ou (((2 + 2) + 2) + 2) + 2

Como vimos, um programa com instruções que uma UCP é capaz de executar é escrito em linguagem de máquina ou linguagem de baixo nível, por serem as linguagens “compreendidas” pelas máquinas. Muito cedo na história dos computadores eletrônicos se descobriu que é muito difícil programar usando linguagem de máquina e assim foram surgindo várias linguagens de programação, cada uma com propostas diferentes para tratar certos problemas computacionais.

De uma forma genérica porém, o desenvolvimento das linguagens de programação buscou se aproximar de alguma linguagem natural que usamos para nos comunicar, como o inglês e o português. Essas linguagens, chamadas de linguagens de alto nível por serem mais fáceis de usar por humanos, vem se tornando mais poderosas ao apresentar conjuntos de instruções mais extensos e recursos mais apropriados a aplicações modernas como computação gráfica, jogos eletrônicos e inteligência artificial.

Como os computadores não entendem as linguagens de alto nível, é necessário traduzir ou interpretar esses programas antes de serem executados pela máquina. Vamos chamar de código fonte o programa escrito pelos programadores e que fica armazenado em um arquivo fonte. Os programas que traduzem um arquivo fonte em linguagem de alto nível e geram um arquivo executável em linguagem de máquina são chamados de compiladores. Ao invés de traduzir o programa e gerar um arquivo executável, algumas linguagens interpretam e executam cada comando como se rodassem diretamente na linguagem de alto nível. Esse esforço para interpretar cada instrução durante a execução pode prejudicar um pouco o desempenho das linguagens interpretadas, mas tendem a agilizar o desenvolvimento de programas por evitarem a compilação.

A (ciência da) computação vai além da programação. Como ciência, ela estuda os fundamentos teóricos da informação (dados) e da computação (transformação dos dados) e as considerações práticas para aplicar essa teoria em sistemas computacionais. Por exemplo, nesse curso vamos estudar formas para representar diferentes tipos de dados e algoritmos eficazes para manipular esses dados. Consideramos o estudo dessas estruturas e algoritmos uma excelente forma de desenvolver um raciocínio computacional, algo parecido com estudar partidas entre grandes mestres para aprender a jogar xadrez.

Aplicações

É difícil imaginar hoje um ramo da atividade humana que não tenha se beneficiado diretamente dos avanços da computação. Seus impactos são tão notáveis que não precisamos ir longe para perceber seus efeitos. A começar talvez pelos dispositivos móveis como os telefones celulares rodando inúmeros aplicativos que, para o bem ou para o mal, vem transformando comportamentos pessoais, sociais e até criando alguns novos. Esse exemplo mostra que um dispositivo “comum” como um telefone, ao se tornar digital e conectado à Internet, se torna uma coisa muito diferente e, por ser programável, sua utilidade aumenta a cada nova aplicação que instalamos nessa coisa (a coisa vira outra coisa!).

Uma outra tecnologia que começa a ser notada a nível pessoal é a Internet das Coisas ou IoT (do inglês Internet of Things). A IoT vem permitindo que “coisas” se tornem mais “inteligentes”, desde uma lâmpada que pode ser controlada remotamente pela Internet, até a integração de “coisas” em toda uma cidade. Dessa forma, as cidades inteligentes poderão otimizar melhor seus recursos, como por exemplo melhoria no trânsito, maior conservação de energia e redução de poluentes.

Assim, a medida que mais coisas se tornam digitais, conectadas à Internet e programáveis, abrem-se infinitas novas oportunidades de uso, tanto de coisas agindo individualmente, quanto coisas agindo em conjunto com outras coisas. Imagine agora a quantidade de dados produzidos por essas coisas. Saber programar novos usos dessas coisas é certamente um desafio que, quem sabe, você mesmo vai ajudar a resolver usando algumas das habilidades que você vai desenvolver nesse curso.

Mas não precisamos ser tão ambiciosos. Para alunos e alunas de cursos de engenharia e ciências exatas por exemplo, as ferramentas computacionais vistas nesse curso podem ajudar a entender conceitos de cálculo e estatística, visualizar dados multidimensionais e simular modelos. Alunas e alunos das áreas humanas e biológicas também podem utilizar as habilidades desenvolvidas nesse curso para começar a explorar seus dados e testar seus próprios modelos. Mas seja qual for a sua área de interesse, desenvolver um raciocínio computacional vai ajudar você a desenvolver melhores programas assim como pode ajudar você a utilizar programas existentes de forma mais eficaz.

Laboratório: Como instalar Python em seu computador

O desenvolvimento do raciocínio computacional requer muita prática. Para isso, cada capítulo traz uma seção de exercícios em laboratório que você deve realizar utilizando um computador para praticar. Nesse primeiro capítulo, vamos ajudar você a arrumar o seu ambiente de programação e testá-lo, para que você possa fazer os exercícios dos próximos capítulos. A instalação também é um bom exercício inicial para os alunos e alunas sem prévia experiência com computadores e serve para que eles e elas comecem a se habituar com o uso de computadores e das ferramentas de desenvolvimento de programas que serão utilizadas nos exercícios.

Instalando o Python

Vamos utilizar o pacote Anaconda que reúne várias ferramentas úteis para desenvolver programas científicos. Como historicamente a maioria de nossas alunas e alunos costumam utilizar um computador com o sistema operacional Windows, as instruções a seguir são voltadas para essa plataforma. Caso você use um outro sistema operacional, como Linux ou Mac OS, você pode seguir as instruções específicas para o seu sistema na página de instalação do Anaconda (https://docs.anaconda.com/anaconda/install/).

Antes de instalar, é preciso baixar (gratuitamente) o software da Anaconda. Para isso, dirija o seu navegador favorito para a página de download da Anaconda (https://www.anaconda.com/distribution). Clique no botão para fazer o download da versão 3.x do Python (que na figura corresponde a versão 3.7). Sugerimos que você salve o arquivo para evitar fazer o download novamente caso algo de errado aconteça durante a instalação.

_images/anaconda.com.salvar.png

Depois que terminar o download (que pode demorar um pouco dependendo da velocidade da sua conexão e por ser um arquivo meio grande), abra o arquivo que você baixou (clique nele) para executar o instalador. Isso deve abrir uma janela como

_images/anaconda01.png

e depois basta “concordar” com todas as sugestões, como na sequência de figuras abaixo.

  • clique em “I agree”

_images/anaconda02.png
  • selecione “Just me (recommended)”

_images/anaconda03.png
  • selecione a pasta de instalação e clique em “Next”

_images/anaconda04.png
  • selecione a opção “Register Anaconda as my default Python 3.7” e clique “Install”.

_images/anaconda05.png

Aguarde o final da instalação, que pode demorar vários minutos.

_images/anaconda06.png

e pronto! O navegador pode sugerir para instalar outras ferramentas, mas você não precisa fazer mais nada e pode continuar clicando em “Next” até fechar o instalador do Anaconda.

Teste a sua instalação usando o Anaconda Prompt

Clique na barra de pesquisa do Windows e digite “Anaconda Prompt”. Dentre as primeiras opções deve estar o “Anaconda Prompt (Anaconda 3)” que você acabou de instalar, como ilustrado abaixo:

_images/anaconda.pesquisa.png

Clique nessa opção (“Anaconda Prompt”) para abrir uma janela como essa mostrada na figura abaixo, que vamos chamar de “terminal” (para ficar mais compatível com outras instalações).

_images/anaconda.prompt01.png

No terminal, digite “python” para abrir o Python Shell:

_images/anaconda.prompt02.png

O Python Shell faz parte do ambiente Python que permite você digitar comandos de forma interativa, ou seja, para cada comando que você envia o Python te dá uma resposta. O Python Shell é muito útil para testar um comando quando você não tiver certeza de como funciona e também serve como uma calculadora. Por exemplo, digite a expressão: “2 + 2” seguida por “ENTER” (ou qualquer operação que desejar) e veja o resultado.

Toda vez que você aperta ENTER você está enviando ao Python Shell um comando, que ele vai tentar interpretar. Se você enviar um comado incorreto ou incompleto, como 2 * ENTER, o Shell vai apontar um SyntaxError (Erro de Sintaxe) que significa que o Python não conseguiu entender o comando.

_images/anaconda.prompt03.png

Teste a sua instalação usando o Spyder

O Spyder é um ambiente integrado de desenvolvimento (IDE do inglês Integrated Development Environment) que faz parte do Anaconda. Ele é chamado de ambiente integrado pois reúne várias ferramentas em um só lugar, dentro de uma mesma interface gráfica. Dentre as principais ferramentas que vamos utilizar estão o editor de texto, o Python Shell, e o depurador de programas (ou debugger em inglês).

Para abrir o Spyder, digite “spyder” na área de busca do Windows (como você fez anteriormente para abrir o Anaconda Prompt). A figura a seguir ilustra a janela com a interface do Spyder.

_images/spyder01.png

A janela no canto inferior direito funciona como um Python shell. Você pode clicar nessa janela e digitar uma expressão aritmética qualquer, como “2 + 3 * 4 ENTER” e ver o que acontece.

O Python shell fica esperando um comando do usuário. Assim que o usuário aperta “ENTER”, o Python shell lê o texto que foi digitado pelo usuário na linha de comando e tenta executá-lo. Caso seja um comando válido, o Python shell mostra o resultado na saída. Caso seja um comando inválido, o Python shell mostra uma mensagem de erro que descreve o problema com o comando recebido.

Para escrever programas, mesmo que simples, devemos usar o editor de texto para escrever todos os comandos, salvar o programa em um arquivo e depois executar o programa. Copie o seguinte programa para o editor do Spyder no seu computador.

# IMPORTANTE: todas as linhas abaixo devem começar na 1a coluna
nome = input("Digite o seu nome: ")
print("olá", nome, "!")
print("Parabéns! Seu 1o programa em Python está funcionando!")

O texto do seu programa precisa estar exatamente igual a esse exemplo. Em Python, a tabulação de cada linha é muito importante e força uma estrutura visual que ajuda a identificar os blocos de um programa. Como esse exemplo é um programa com apenas 1 bloco, verifique se todas as linhas do seu programa estão alinhadas na 1a coluna no editor do Spyder. Caso não estejam, remova todos os espaços iniciais para que cada linha comece exatamente na 1a coluna do editor.

Salve esse programa clicando na opção de menu no canto superior da janela

Arquivo -> Salvar como

em alguma pasta no disco do seu computador. Use um nome qualquer com “teste.py”. Evite usar espaços e caracteres acentuados no nome e lembre-se de sempre incluir a extensão “.py” para indicar que se trata de um programa em Python. Depois de salvo, clique na opção de menu

Executar -> Executar

(ou simplesmente aperte a tecla “F5”) para executar esse programa ou no triângulo verde na barra de ferramentas localizada abaixo da linha de menu no topo da janela.

Ao ser executado, o programa é executado instrução por instrução pelo Python, mas sem o shell. Em inglês, shell significa concha ou casca. Na janela do Python shell, essa casca corresponde a uma camada de interface entre o Python e o usuário. O shell permite a interação com o Python por meio da linha de comando, ou seja, a linha que, quando digitamos algum comando e apertamos “ENTER”, o shell passa o comando para o Python. O shell também recebe a resposta e a exibe na tela. Ou seja, o Python, como linguagem, não tem uma interface fixa. Sem o shell, os programas precisam especificar como a informação entra e sai do programa. Vários programas funcionam sem o shell. Por exemplo, um programa em Python pode controlar o tráfego em um site na Internet, simplesmente recebendo e enviando dados de uma placa de rede.

Esse exemplo usa as funções input() e print() do Python para receber dados e imprimir mensagens. Nesse caso, vamos usar a janela do Python shell como casca dos nossos programas. Assim, ao executar o programa observe que a mensagem “Digite o seu nome: ” aparece na janela do Python shell. Clique nessa janela para ativá-la e digite o seu nome usando o teclado. Aperte a tecla “ENTER” para que o shell envie sua resposta ao programa sendo executado. Finalmente, após recebida sua mensagem, o programa continua sua execução enviando ao Python shell as mensagens finais a serem impressas no shell.

Resumo

Esse capítulo introduziu alguns conceitos básicos de computação sob um brevíssimo contexto histórico. Nesse contexto, o Python é uma linguagem de programação de alto nível altamente portável (roda praticamente em qualquer computador, até mesmo em telefones celulares) e flexível (pode ser usada para diversos tipos de aplicação). O Anaconda fornece um pacote com várias ferramentas integradas, facilitando a instalação e manutenção do ambiente de desenvolvimento.

Nos próximos capítulos vamos utilizar o Python shell para ilustrar alguns comandos do Python e o Spyder para escrever programas em Python.

Exercícios

Indique todas as alternativas corretas

    Q-1: O Python shell é:

  • uma interface que permite escrever comandos do Python e ver o resultado.
  • Correto
  • um ambiente integrado de desenvolvimento de programas em Python.
  • Incorreto: o Python shell não é um IDE.
  • uma ferramenta que permite a execução de comandos em Python e pode ser integrada com outras ferramentas.
  • Correto: como ocorre no Spyder
  • uma casca para proteger o Python conta ataques.
  • Incorreto: o shell se refere a uma interface por linha de comando.
  • uma concha onde o Python fica armazenado.
  • Incorreto: o shell se refere a uma interface por linha de comando.

    Q-2: Quantos bits de informação podemos armazenar em 2 KB (dois kilobytes)?

  • aproximadamente dois mil bits
  • Incorreto: 1 byte possui 8 bits
  • aproximadamente quatro mil bits
  • Incorreto: 1 byte possui 8 bits
  • aproximadamente oito mil bits
  • Incorreto: 1 byte possui 8 bits
  • aproximadamente dezesseis mil bits
  • Correto: 1 byte possui 8 bits
  • nenhuma das alternativas anteriores
  • Incorreto: 1 byte possui 8 bits

    Q-3: O Python é:

  • uma linguagem de programação de baixo nível
  • Incorreto: uma linguagem de baixo nível usa código que roda diretamente (ou quase) na máquina.
  • uma linguagem de programação de alto nível
  • Correto: um programa em Python parece um texto em inglês.
  • uma linguagem de máquina
  • Incorreto: os computadores não conseguem executar diretamente programas em Python.
  • uma linguagem de programação interpretada
  • Correto: um programa em Python não é compilado para linguagem da máquina hospedeira.

    Q-4: Cada bloco corresponde a um programa em Python com apenas 2 linhas. Qual desses programas foi digitado corretamente no editor do Spyder?

    # Bloco A
    nome = input('Digite seu nome: ')
        print('Olá', nome)
    
    # Bloco B
        nome = input('Digite seu nome: ')
    print('Olá', nome)
    
    # Bloco C
    nome = input('Digite seu nome: ')
    print('Olá', nome)
    
    # Bloco D
        nome = input('Digite seu nome: ')
        print('Olá', nome)
    
  • todos os blocos foram digitados corretamente.
  • Incorreto: lembre-se que a tabulação é importante em Python.
  • apenas os blocos A e B
  • Incorreto: lembre-se que a tabulação é importante em Python.
  • apenas o bloco C
  • Correto. As linhas devem começar na primeira coluna.
  • apenas o bloco D
  • Incorreto: lembre-se que a tabulação é importante em Python.

Para saber mais

Next Section - Expressões aritméticas, relacionais e lógicas