Prévia do material em texto
PENSAMENTO COMPUTACIONAL
Tema 1
MODULO 1
EQUAÇÃO FUNDAMENTAL DOS COMPUTADORES
COMPUTADOR = a imensa capacidade de processar x pela terrível deficiência no pensar.
Vamos entender o que é isso.
Este módulo trata dos recursos básicos do funcionamento dos computadores. Isso é muito importante, pois, em
pleno século XXI, não é desejável que um profissional pense no computador como algum tipo de caixa mágica com a
qual todos interagem diariamente. De fato, no mercado de trabalho atual, é cada vez mais importante que os
profissionais saibam como o computador faz o que faz.
É importante perceber que o mercado de trabalho não é um ente determinador, mas, sem dúvida, a relação com a
empregabilidade é fundamental. Você consegue perceber alguma função na qual, em alguma medida, o uso da
tecnologia não é necessário?
Pense bem: as salas de aula, os treinamentos... Enfim, tudo, de alguma forma, vivencia o uso da tecnologia.
Com isso, nós nos deparamos com um dilema: a adoção da tecnologia não é linear, nem todos têm acesso a ela nem
possuem a mesma experiência enquanto usuários.
A essência fundamental dos computadores é que eles são extremamente poderosos e profundamente tolos. Eles são
poderosos, pois um computador pode fazer bilhões de operações por segundo e consegue gerar dados a uma
velocidade inconcebível para nós, humanos.
Essa é a parte poderosa na essência dos computadores. No entanto, o computador também é muito tolo, pois as
operações que ele pode realizar rapidamente são extremamente simples.
Por exemplo, adicionar dois números para obter um terceiro número, ou verificar se um número é zero.
COMPUTADOR=poderosamente rápidos, porém tolos
Estudos revelaram que os humanos possuem impressões digitais singulares. Com base nisso, foi elaborada uma
forma de retirar esses dados – primeiro, foi utilizada graxa para colher digitais; atualmente, usam-se luz e calor –,
criando um banco de dados com essas informações. Portanto, o trabalho de discernimento é humano; o computador
apenas cruza, de forma mais rápida e efetiva, os dados armazenados pelas pessoas.
Isso ocorre porque discernimento e compreensão são qualidades humanas!
É importante compreender o seguinte: o computador é realmente um mundo mecânico, onde é possível executar
operações muito simples a uma velocidade incrivelmente alta. Por exemplo, desde 2005, processadores são capazes
de executar mais de 1 bilhão de instruções por segundo. Já os processadores lançados em meados de 2019 são
capazes de executar mais de 48 bilhões de instruções por segundo.
Ao longo do tempo, Hollywood tem retratado em seus filmes computadores que nunca são mostrados como
mecânicos, mas, sim, como entidades com características essencialmente humanas, como discernimento,
compreensão, criatividade e capacidade de se emocionar.
A realidade não poderia estar mais distante daquilo que é mostrado nos filmes. O que temos é uma combinação
engraçada, que une a poderosa capacidade de executar instruções a um conjunto de instruções que, inicialmente,
parecem tolas. Então, é necessário compreender como é possível, mesmo assim, criar recursos/soluções
interessantes e poderosos.
2
Qualquer pessoa que interage com computadores, provendo instruções em alguma linguagem de programação,
experimenta uma sensação vívida dessa combinação.
Vamos retomar o início do tema, quando falamos dos gregos. Um dos principais movimentos intelectuais
trabalhados pelos gregos foi perceber que, no mundo, existe uma parte física, calculável, com possibilidades amplas,
e que, sem essa percepção, não é possível entendê-la – trata-se do mundo físico. Também temos outra parte, que,
embora seja proveniente das representações físicas do mundo, não depende delas para a construção dos sujeitos.
Estamos falando da metafísica, a construção de percepções mentais que olham pela lógica, pela argumentação,
pelo estudo, pela dialogia, pela capacidade mental de o sujeito alcançar o entendimento. Essa parte não tem
limites; suas representações são infinitas.
3
Uma velha alegoria de Platão ajuda a explicar isso. Trata-se da alegoria da caverna, em que é mostrado que
todos nós vivemos em um mundo limitado, físico, de pedra, com as representações nas paredes iluminadas por
um fogo contínuo atrás de nós. Quando libertos, o que encontramos é um mundo infinito, perfeito, é o mundo
do pensamento, da abstração. Nossa capacidade de abstração e de pensar é infinita, mas nossa capacidade de
materializar o que foi pensado é limitada. Esse é um dos sentidos da alegoria. Buscamos ser mais eficientes,
mais próximos das múltiplas possibilidades de nossa mente.
O mundo perfeito, infinito, com possibilidades de construir e destruir, infelizmente, não mora em uma
máquina, mas na capacidade humana. A máquina, o computador, é só mais um aprimoramento de nossos usos
e nossas ferramentas, ainda que aprisionados, limitados, mas tentando e buscando ir mais longe.
MODULO 2
ENTRE CÓDIGOS E ALGORITMOS – APRENDENDO A LÓGICA DO COMPUTADOR
Vamos voltar à dinâmica do entendimento do pensamento computacional. Você está fazendo uma prova de
Matemática, e o conteúdo é análise combinatória; portanto, aprendeu todas as fórmulas e métricas, basta aplicá-las.
Agora, é ler o problema e colocar tudo lá.
Se a máquina é extremamente rápida, mas muito tola, como é possível a implementação de tantos recursos úteis nos
computadores?
Imagine um motorista que condicionou o seguinte: sinal (farol) amarelo é para parar. Porém, no trânsito, nem todos
pensam da mesma forma. Logo, se esse motorista vê um sinal amarelo e para, pode ser que o condutor que vem
atrás, por não pensar como ele, não consiga frear. O resultado é a colisão. O ponto é que, para que um computador
execute o que você deseja, ele precisa de informações, padrões e leituras, pois só assim ele será capaz de ampliar
suas possibilidades de soluções.
CÓDIGO
Para compreendermos a essência do funcionamento de um computador, precisamos entender o que é um código.
Então, dentro do computador, temos um corpo de códigos, e eles são apenas uma série de instruções, como, por
exemplo: adicione dias e medidas e compare-os.
Um computador corresponde à velocidade X a incapacidade de pensar. Então, o trabalho da máquina consiste em
apenas uma série de instruções; ela só executa o que é pedido na ordem em que recebeu as orientações de quem
escreveu o código. O computador é capaz de passar por uma sequência de instruções de uma forma incrivelmente
rápida.Quem pensa e estrutura, podendo ser cada vez mais complexo ou simples, é o sujeito que programa.
Há uma série de instruções, e o computador apenas caminha através delas, executando cada uma exatamente como
instruído. São as famosas palavras executar e rodar, como você já deve ter ouvido.
Então, sim, um código é executado de forma muitíssimo rápida, mas as instruções individuais são bastante simples, o
que leva a uma pergunta natural:
Se essas instruções são tão simples, como podemos ter um recurso útil?
Ou seja, como tornar o computador capaz de realizar tarefas que dependam de algum nível de inteligência e
discernimento?
Vamos tentar algo prático.
Sempre que você pensar em um código, deve imaginar o seguinte: se ele foi criado e, principalmente, se alcança um
grande número potencial de utilização, não foi o computador que evoluiu, mas, sim, a sociedade. Alguém captou
uma demanda e observou que a máquina, que a criação de um código, poderia suprir essa carência, nem que fosse
fazer rir.
Então, o que liga esses dois lados da essência de um computador: a demanda humana e a necessidade de criação de
um código para alcançar a solução? A resposta é a seguinte: programadores.
4
Voltemos ao exemplo dos olhos vermelhos. Um programador de computador talvez tenha tido a seguinte ideia:
“Seria legal se os computadores fossem capazes de reduzir os olhos vermelhos de fotografias, pois esse defeito é
meio macabro, e eu fico desconfortável ao vê-lo”.
Essa é uma ótima ideia!
Trata-se de um discernimento, uma escolha humana que atende a seus anseios: deveríamos ter redução de olhos
vermelhos. Assim, o programador de computador pensa em uma maneira de tornar isso possível.
Resumidamente:Voltemos ao exemplo dos olhos vermelhos. Um programador de computador talvez tenha tido a
seguinte ideia: “Seria legal se os computadores fossem capazes de reduzir os olhos vermelhos de fotografias, pois
esse defeito é meio macabro, e eu fico desconfortável ao vê-lo”.
Essa é uma ótima ideia!
Trata-se de um discernimento, uma escolha humana que atende a seus anseios: deveríamos ter redução de olhos
vermelhos. Assim, o Programador de computador pensa em uma maneira de tornar isso possível. Resumidamente:
5
6
ALGORITMO
Para usar o e-mail, assistir a um vídeo, conversar pelo WhatsApp, realizar operações bancárias, ou qualquer outro
recurso útil via computador, smartphones etc., foi preciso que, em algum momento, uma pessoa ou uma equipe
pensasse:
“Bem, deveríamos escrever um algoritmo para isso”.
Alguém estruturou os procedimentos necessários e, depois, transformou os passos de alto nível em instruções
suficientemente simples, para que o computador/smartphone pudessem executá-las. Essa pessoa ou a equipe
trabalhou, então, escrevendo o código para a solução. Em seguida, um bom tempo foi gasto para testar e melhorar o
código, até que ele, de fato, representasse com fidelidade o algoritmo projetado originalmente.
O programador pode se concentrar em ser criativo, para, então, criar um algoritmo capaz de resolver um problema
real.
Vamos entender a diferença entre código e algoritmo.
CÓDIGO
O código é um conjunto qualquer de instruções simples escrito em alguma linguagem padrão compreensível para o
computador.
ALGORITMO
Por outro lado, um algoritmo é um termo que reflete uma ideia mais completa, em que o conjunto de instruções
possuem uma finalidade útil. Um algoritmo não precisa ser escrito em uma linguagem de computador, podendo ser
escrito, por exemplo, em português.
CÓDIGO
Definição simplificada
Sequência de instruções que computadores podem executar.
Linguagem
Deve ser escrito em uma linguagem de programação padrão, senão os computadores não conseguirão executá-lo.
ALGORITMO
Definição simplificada
Sequência de passos simples e bem projetados para realizar uma tarefa ou resolver um problema.
Linguagem
Pode ser escrito em português ou em uma linguagem de programação padrão.
LEI DE MOORE
A previsão feita há mais de 50 anos por Gordon Moore é fantástica. A tecnologia está em evolução e
desenvolvimento contínuos. Afinal, cada vez mais, sistemas dependem da tecnologia, em virtude de sua
interconexão, permitindo a ampliação da tecnologia e dos produtos e aumentando a velocidade de sua substituição.
Dessa forma, a cada nova geração, um conjunto geracional antigo de tecnologia passa a estar presente no mercado,
sendo consumido por públicos que não teriam acesso antes. Por outro lado, a cada evolução, a capacidade de troca
de dados e informações seriam maiores, e a necessidade de uso de material, menor, permitindo um barateamento
relativo. No limite, a evolução tecnológica acaba barateando os computadores.
MODULO 3
7
CÓDIGOS EM EXECUÇÃO
Neste módulo, queremos chegar ao ponto em que você possa escrever algum código de computador, executá-lo e
ver o que ele faz.
No computador, tudo se resume realmente a códigos em execução (rodando). É assim que as coisas acontecem.
Assim, para que a natureza dos computadores seja entendida, nada melhor do que rodar um pouco de código e ver
como ele funciona.
Antes de chegar ao código, será necessário um pouco de paciência. Os elementos de código que serão mostrados
aqui não são chiques, chamativos ou complexos. Eles são muito simples. Talvez seja um pouco como um brinquedo
de peças de encaixe, isoladas, dispersas, complexas; porém, com o tempo e a familiaridade, as possibilidades e o uso
vão se modificando.
Assim como usamos alguma língua (Português, Inglês etc.) para conversar com as pessoas, para escrever códigos que
o computador compreenda, é necessário usar uma das linguagens disponíveis. Existem várias linguagens de
computador diferentes para informar ao computador o que fazer.
Aqui, utilizaremos uma das mais usadas na atualidade, a Javascript. Usaremos somente os principais recursos, para
que você possa escrever e manipular códigos bem simples e brincar com a ideia-chave: compreender de fato como
funcionam os computadores.
Javascript
No mundo de computadores, alguns termos, como Javascript, são nomes próprios e, por isso, não possuem tradução.
Não se preocupe, pois rapidamente você estará bem ambientado com este termo. O mesmo ocorre com as
instruções reconhecidas por linguagens de programação. Por exemplo, a instrução print é reconhecida pela
linguagem Javascript, e ambos os termos não possuem tradução.
Por fim, precisamos abordar mais um conceito básico: variáveis. Uma variável no computador é como uma caixa, ou
seja, um local onde podemos armazenar valores para uso futuro.
Então, se tivermosum código como o descrito a seguir, onde atribuímos o valor 7 a uma variável V, o que isso
significa é que há uma caixa no computador chamada V, conforme ilustrado na tabela a seguir, nós simplesmente
podemos armazenar um valor, como um 7, nesta caixa. Também poderíamos armazenar qualquer valor que
quiséssemos.
Código para atribuir valor a uma variável V
V=7;
O que significa na prática
“Caixa” de nome V, onde atribuímos o valor numérico 7
"Caixa" V 7
Sendo um pouco mais específico, essa “caixa” é, na verdade, um espaço na memória do computador, em que
podemos armazenar valores, e V é o nome que damos a esta área reservada para armazenar o valor que desejarmos.
Em linhas posteriores, no código, se um V aparecer, o computador sabe o que colocamos dentro da caixa (em nosso
exemplo, o 7). A variável se torna uma espécie de abreviação conveniente para qualquer valor que eu queira usar.
Veja o exemplo a seguir.
Na primeira linha, atribuímos o valor 7 à variável que optamos por chamar de V.
Na segunda linha, damos um comando para imprimir o valor da variável, que será 7 neste exemplo.
Na terceira linha, imprimimos uma string informando “O valor da variável é:” e, depois, indicamos “V” para que o
computador imprima de fato o valor recuperado da variável.
Conclusão
8
CONSIDERAÇÕES FINAIS
Pensamento Computacional parece um tema futurístico. Inclusive, muitos alunos devem ter se lembrado dos filmes
de catástrofe, em que a tecnologia se levanta contra o homem. Neste tema, você foi tranquilizado sobre essas
questões. Primeiro, descobriu que máquinas são terrivelmente ignorantes e profundamente capazes. Somente a
partir da interação e da estruturação de um conjunto de linguagens específicas, o grande potencial das máquinas –
armazenamento e processamento – pode ser efetivamente estruturado.
Sendo assim, Pensamento Computacional é um convite para que você entenda como funciona essa relação entre
máquinas e homens e, com isso, perceba que não é preciso dominar tecnicamente uma ferramenta apenas em
determinado momento, pois, embora elas sejam atualizadas constantemente, a dinâmica e os fins permanecem os
mesmos.
Neste sentido, o que você precisa conhecer, então, são as linguagens que compõem esse novo universo: códigos e
algoritmos. Se você entendeu que código são as instruções que o ser humano dá à máquina – mostrando que
computadores executam nossas demandas – e que algoritmo é a linha deste comando estruturado para que a
máquina interprete e execute, você entendeu a essência da dinâmica comando, forma de comando, execução, novas
demandas, comandos e forma de comando, sempre impulsionada pelas demandas humanas.
Para concluir, sugerimos que você faça inúmeros testes (em alguma das práticas acima) a fim de perceber como se
relacionou com o assunto, criou e executou a dinâmica proposta. Como uma criança que aprende a engatinhar e a
ficar em pé, daqui por diante, busque dar os primeiros passos, entendendo a mecânica, e, em breve, você estará
correndo.
O QUE É SOFTWARE?
Sempre que você baixa um programa ou vê um computador ligado, está presenciando algum software sendo
executado.
Até mesmo no passado, telégrafos, telefones, aparelhos de fax, todos já possuíam um software, um conjunto de
ações programadas que usavam a estrutura física e lhes davam materialidade: voz, letras e imagens. Cada máquina
exercia exatamente a sua função, e repare: estamos indo além da função mecânica.
Agora, imagine uma máquina de costura.
Ela faz sempre a mesma operação, um movimento mecânico repetitivo.
Porém, quem atua para que ela execute funções a partir do domínio de técnica é o sujeito; a máquina mecânica é
estruturada, e a mente humana é quem faz a função.
Quando um sujeito decidiu que era possível programar a máquina para fazer além da função repetida, para trançar
uma estrutura, sucedendo e alcançando a partir disso objetivos claros e novos, criou-se o software.
A máquina é capaz de ser programada para cumprir um conjunto de funções definidas e desenhadas pelo sujeito.
O computador é filho da Guerra Mundial, da necessidade de novos desenvolvimentos, de realizar processamento de
informações e comunicação mais eficientes, cruzando dados e armazenamento.
Porém, não basta construir a máquina; é necessário executar, definir o que se deseja, programar e reprogramar.
Softwares para computadores, então, passaram a ser uma demanda, uma construção e sofisticação contínuas.
Sempre que um software é criado, imediatamente, passamos a pensar em como melhorá-lo, transformá-lo em algo
mais eficiente. Pessoas vivem disso e recriam isso.
Nunca mais dominaremos perfeitamente todos os softwares que desejamos; afinal, sempre que aprendemos sobre
um, novas mudanças estarão chegando.
9
Já jogou videogame? Esses aparelhos mudaram e continuam mudando; hoje, possuem gráficos e programações cada
vez mais complexos.
Para entender tudo isso, é necessário compreender o que é, afinal, um software para computadores.
Mas, afinal, o que é software?
Software é o conjunto de funções executadas na programação de um computador.
Embora não seja uma entidade física, ganha materialização em sua construção virtual, independentemente da rede.
É a manifestação de uma imagem e dos desdobramentos a partir da construção de códigos e execuções.
Vamos entender melhor esse processo:
A CPU (Central Processing Unit), também chamada de processador, é uma espécie de cérebro. É ela quem realmente
executa o que chamamos de “instruções de código de máquina”.
Estas instruções são extremamente simples e constituídas apenas dos números 0 (zero) e 1 (um), conhecido como
código binário.
Podemos pensar no conjunto de instruções de código de máquina que uma CPU é capaz de executar como sendo um
idioma de baixo nível, ou “código de máquina” (também conhecido como “código nativo”). O idioma do código da
máquina está intimamente conectado ao projeto do hardware da CPU , ou seja, não é algo que possa ser mudado à
vontade.
Cada família de CPUs compatíveis (por exemplo, a popular família Intel x86 usada em computadores pessoais)
possui seu próprio código de máquina específico, que não é compatível com o código de máquina de outras famílias
de CPUs.
Como isso é feito?
Os programadores escrevem instruções usando alguma linguagem de programação.
Vamos a um exemplo:
Na linguagem JavaScript, a instrução (linha de código) para definir um pixel (ponto) da tela com nível de vermelho
para o nível 255 seria:
pixel.setRed(255).
Esta instrução é muito mais complexa do que uma instrução de código de máquina individual que CPUs são capazes
de executar. Então, nós a chamamos de uma instrução de altonível.
Instruções de alto nível são facilmente compreensíveis pelos humanos, mas os computadores não são capazes de
executá-las.
O que ocorre, então, é que, antes de ser executada, a instrução de alto nível será expandida em uma sequência –
talvez cinco ou dez instruções de baixo nível (código de máquina) –, de modo que, quando essas cinco ou dez
instruções forem executadas, uma após a outra, o resultado final terá o efeito de definir o valor vermelho do pixel
para 255, conforme designado pela instrução de alto nível escrita pelo programador.
10
Como corrigir um erro de programação cometido pelo programador?
Se você quiser adicionar um recurso para corrigir um bug no Firefox (por exemplo), a forma real de fazer isso é voltar
ao código-fonte original e realizar os ajustes necessários, alterando as instruções.
Em seguida, é necessário executar o compilador novamente para compilar (traduzir de linguagem C++ para
linguagem de máquina) uma nova versão do Firefox que incluirá os ajustes realizados no código-fonte.
SOFTWARE DE CÓDIGO ABERTO
É importante construirmos uma noção do que significa software de código aberto.
Trata-se de uma forma de distribuição de software em que o programa compilado é fornecido, mas também há
acesso ao código-fonte original do programa.
Geralmente, o código-fonte é acompanhado de uma licença que diz algo como:
“Aqui está o código-fonte, se você quiser criar sua própria versão realizando as alterações que desejar, fique à
vontade.”
Mas qual a diferença entre
softwares de código fechado e softwares de código aberto?
CÓDIGO FECHADO
Se você precisa de algum recurso diferente ou adicional, ou se há um bug que você precisa corrigir, você realmente
depende do fornecedor, pois somente ele detém o código-fonte.
Então, somente o fornecedor é capaz de realizar ajustes e correções.
✗
CÓDIGO ABERTO
Caso sejam necessários ajustes, correções e incrementações que você realmente queira fazer com o programa – ou
se o fornecedor original não existe mais –, você tem total liberdade para agir.
11
Você mesmo pode realizar as modificações, ou talvez prefira contratar alguém para fazer uma alteração e produzir
sua própria versão personalizada.
Um comentário, em JavaScript, começa com duas barras. Em seguida, você pode escrever notas para você mesmo,
para lembrá-lo, no futuro, do que você pretendia ou do que está tentando fazer neste ponto do seu código. O
computador sabe ignorar comentários, então é apenas uma maneira de adicionar decorações/lembretes ao código
com pequenas observações.
O uso de comentários é considerado bastante importante, pois ajuda o programador a compreender um código que
não foi escrito por ele, ou até mesmo um código que foi escrito por ele há tanto tempo, que ele não lembra mais
como raciocinou para escrever aquele trecho de código.
Um computador é apenas mais uma das históricas tentativas humanas de facilitar e resolver demandas que surgem
de forma recorrente. Na busca dessas demandas, cada inovação que aparece torna-se uma estrutura – quer dizer,
parte da sociedade, ao mesmo tempo, é estruturante e força novas buscas, transformando toda a sociedade. Nós,
humanos, temos essa característica, e as máquinas vivem para atender demandas que são pensadas e estruturadas
por nós.
Depois que uma demanda é pensada, precisamos focar no processamento das informações e na capacidade de
armazená-las. Isso, aliás, é a origem de todo o processo da computação. Homens precisavam ampliar sua capacidade
de arzenamento, de reprodução, de execução.
O QUE É UM PROGRAMA?
Então, um programa/aplicativo, como, por exemplo, o navegador de Internet Firefox, ou o editor de textos
Microsoft Word, nada mais são do que uma enorme sequência dessas instruções simples de código de máquina.
Assim, quando o Firefox está sendo executado no seu computador, isso significa que, em algum lugar na RAM, há um
bloco dessas instruções, e a CPU as executa uma após a outra sequencialmente.
Tudo o que você pode ver o Firefox fazendo – como piscar o cursor, conectar-se via rede a uma URL fornecida pelo
usuário, desenhar imagens na tela, obter páginas da Web, entre outros – ocorre graças à CPU, que roda as
instruções de forma tão inacreditavelmente rápida, que você interage com o Firefox de forma fluida e natural.
Para executar as instruções de código de máquina, as instruções usam um método chamado ciclo busca-execução
(fetch execute cycle).
No ciclo busca-execução, a CPU iniciará buscando a instrução 1 e carregando-a para dentro de si (CPU), e a
executará.
Por exemplo, a CPU adicionará os dois números. Após executar a instrução 1, a CPU simplesmente desce na lista e
executa novamente o ciclo busca-execução para a instrução 2. Em seguida, faz o mesmo para a instrução três, e
assim por diante. As instruções são executadas uma após a outra sequencialmente.
Saiba mais
Quando dizemos que uma CPU opera a 4 GHz (giga-hertz), ou 4 bilhões de operações por segundo, estamos nos
referindo exatamente a essas pequenas instruções.
INSTRUÇÃO PARA ALTERAR A ORDEM DE EXECUÇÃO DE INSTRUÇÕES
Normalmente, a CPU apenas desce a lista e faz a execução das instruções na ordem em que elas estão armazenadas
na memória.
12
Conforme ilustrado na Figura 3, digamos que a instrução quatro diga: “Pule para trás e comece a executar
novamente na instrução 1”.
Neste caso, a CPU executaria as instruções na ordem: 1, 2, 3, 4 e, em seguida, em vez de seguir para a instrução 5,
daria um pulo para trás e iria para (goto) a instrução 1, executando-a novamente, seguida das instruções 2 e 3.
É assim que as estruturas de repetição de instruções (loops) são implementadas pela CPU.
INSTRUÇÃO QUE TESTA ALGUMA CONDIÇÃO
Se a condição for verdadeira, diz, por exemplo, que ela avance para a instrução 5.
Há uma instrução que olhará para alguma condição; assim, se a condição for verdadeira, é como dizer à CPU: “Vá
para (goto) a linha indicada”. Caso seja falsa, a CPU vai para (goto) outra linha.
Então, organizando as instruções, você pode obter o efeito de uma estrutura condicional, conhecida como
declaração if.
COMO O PROGRAMA VAI PARAR NA MEMÓRIA RAM?
Ao serem instalados, programas são colocados em um dispositivo de armazenamento persistente, como HD, SSD ou
pendrive.
Vamos entender com o exemplo do Firefox:
O programa é basicamente um arquivo chamado Firefox.exe, que possui muitos bytes. Na maioria dos casos, esses
bytes são apenas as instruções que compõem o programa, além de alguns ícones e fotos, por exemplo.
Modulo 2
SISTEMA OPERACIONAL
Trata-se de um conjuntode tipos de programas administrativos e de supervisão que organizam todo o sistema. O
sistema operacional está para os computadores como o governo está para uma nação.
O SO de um computador é como um primeiro programa de supervisão que começa a ser executado quando o
computador é inicializado (“inicializa”). Ele desempenha um papel administrativo e contábil invisível nos bastidores.
Quando um desktop, laptop ou smartphone é iniciado, o SO, normalmente, organiza as coisas e inicia um programa
“explorador de arquivos” que exibe janelas e menus, entre outros, que mostram ao usuário quais sistemas de
arquivos estão disponíveis. Isso permite que ele navegue e opere seu equipamento, solicitando que
programas/aplicativos sejam iniciados ou finalizados, interagindo com esses programas/aplicativos.
O sistema operacional mantém as coisas organizadas em segundo plano, para que vários programas possam ser
executados ao mesmo tempo, o que é conhecido como “multitarefa”.
O SO fornece a cada programa sua própria área de memória, de modo que cada programa acessa apenas seus
próprios recursos, tentando limitar, por motivos de segurança, o que um programa incorreto ou mal-intencionado
pode fazer.
Manter os programas separados é conhecido como “área restrita”. Isso é importante para que cada programa
funcione independentemente, sem interferir em outros programas ou no sistema como um todo. Da mesma forma,
cada programa tem algum acesso à tela através de uma janela, mas essa área de saída é separada da saída de outros
programas.
Vamos ver dois exemplos?
13
Arquivo Word.exe
Um arquivo .exe é essencialmente apenas um arquivo de instruções de código de máquina. Quando você clica duas
vezes no programa, está ordenando que o SO “inicie” o programa, executando as etapas de limpeza de alocação de
uma área de memória na RAM para o programa, carregando a primeira seção do código de máquina do programa
nessa memória e, finalmente, direcionando a CPU para começar a executar esse código.
Câmera digital
Uma câmera digital também é um pequeno computador. Quando é iniciado, ele não executa um programa de
gerenciamento de arquivos. Em vez disso, depois que a limpeza básica for configurada, a câmera poderá executar
um único programa que desenha os menus, entre outros, na tela da câmera e responde a cliques nos botões da
câmera, e assim por diante.
Portanto, em particular, o SO gerencia vários programas e inicia e finaliza programas. Dessa forma, um computador
moderno pode executar vários programas ao mesmo tempo; assim, o SO trabalha (duro) para manter as coisas
organizadas.
BOOT E REBOOT
O sistema operacional é, antes de qualquer programa do usuário, a primeira coisa a ser executada quando seu
computador é ligado.
Somente após o carregamento do SO, o usuário pode selecionar os programas que deseja rodar, clicando duas vezes
nos ícones correspondentes na área de trabalho.
Você pode estar se perguntando:
Qual é o programa que cuida da inicialização do SO logo que o computador é ligado?
Há um programa especial, e muito pequeno, denominado firmware, que é gravado pela fábrica no hardware.
O firmware é responsável por detectar quando um computador estava desligado e acaba de ser ligado, e realiza
alguns procedimentos iniciais de teste de hardware, para então, basicamente, procurar um dispositivo de
armazenamento persistente que contenha um SO instalado.
Depois disso, é possível, então, iniciar seu carregamento (cópia das instruções que compõem o SO do disco para a
RAM e indicação para a CPU de qual é a primeira instrução do SO a ser executada).
O termo firmware é usado, geralmente, para se referir especificamente ao firmware de inicialização, que controla
um computador desde o momento em que é ligado até o sistema operacional principal assumir o controle.
A principal função do firmware de inicialização é inicializar o hardware e, em seguida, inicializar (carregar e
executar) o sistema operacional principal.
Veja o esquema a seguir de um computador pessoal. Neste tipo de computador o firmware de inicialização é
chamado, geralmente, de BIOS (Basic Input/Output System), ou sistema básico de entrada e saída.
Este processo é comumente denominado inicializar
(boot ou boot up).
E quando ocorre o Reboot?
Ocorrerá o reboot quando ordenamos ao SO que o computador seja reiniciado, ou seja, o próprio SO cuida das
tarefas necessárias para a finalização e o desligamento do computador. Imediatamente, o computador é religado, e
o processo de boot recomeça.
Agora que conhecemos conceitualmente os sistemas operacionais, que tal darmos uma olhada em alguns exemplos
de SO?
Somente os sistemas operacionais e os firmwares são exemplos de softwares funcionais?
https://estaciodocente.webaula.com.br/cursos/temas/refatorados/fundamentos_de_softwares_de_computadores/#collapse01-01ab
https://estaciodocente.webaula.com.br/cursos/temas/refatorados/fundamentos_de_softwares_de_computadores/#collapse01-02ab
14
O que define um software como funcional? Qual a sua importância no âmbito do pensamento computacional?
Modulo 3
INTRODUÇÃO
Em sistemas computacionais contemporâneos, é extremamente raro escrever códigos de máquina manualmente.
Isso ocorre porque eles são compostos por um número enorme de instruções muito simples; assim, fica difícil para
os humanos fazerem esse processo.
Em vez disso, um programador escreve o código (instruções) em uma linguagem de computador de “alto nível”, com
recursos mais úteis e poderosos do que as operações simples encontradas no código da máquina.
Exemplos de estruturas de alto nível são:
● Estruturas de repetição (loops), em que o programador ordena que um conjunto de instruções seja
executado repetidamente;
● A função print(), que imprime algo na tela; ou
● A estrutura condicional (if), onde o programador solicita que alguma condição seja testada, e, caso passe no
teste, algumas instruções sejam executadas.
Nenhum desses recursos de alto nível está diretamente presente no código da máquina de “baixo nível”. Eles são
adicionados por linguagens de programação, como JavaScript, Java, Python, C, C++, entre outras.
TIPOS DE LINGUAGEM DE PROGRAMAÇÃO
A classificação de linguagens de programação é mais detalhada e abrangente do que a apresentada aqui, mas vamos
nos limitar, por questões de simplicidade, a agrupá-las nestas categorias.
O funcionamento de uma linguagem de programação é definida por seu tipo, que pode ser:
1. LINGUAGEM COMPILADA
São aquelas em que o processo de tradução (compilação) é feito com antecedência e o código é necessariamente
executável.
Quando se utiliza uma linguagem compilada, é necessário executar um programa para traduzir os arquivos-fonte,legíveis em linguagem de alto nível, em código executável. As linguagens compiladas têm a vantagem de produzir
código de alta performance, o qual está ajustado para o funcionamento em um tipo específico de processador ou
arquitetura de processador. Aplicativos compilados, chamados de código binário, só podem rodar no tipo de
computador para o qual foram compilados, uma vez que esses aplicativos consistem, na realidade, em instruções em
linguagem de máquina, entendidas e executadas pelo microprocessador.
Exemplo
No código a seguir, escrito na linguagem C++, na primeira linha, o texto/string “Bom dia” está sendo atribuído à
variável “a”, e, na segunda linha, a variável “b” recebe o conteúdo da variável “a” (ex.: “Bom dia”), e a exclamação é
adicionada ao final da frase.
a = “Bom dia”;
b = a + “!”;
Então, o programador escreve o que é chamado de código-fonte na linguagem de programação que escolher. Como
vimos, humanos preferem linguagens de alto nível pois são mais fáceis e intuitivas.
Como a CPU consegue executar (rodar) instruções escritas em linguagem de alto nível, se sabemos que a CPU só
executa código de máquina?
15
Uma das estratégias utilizadas é usar o compilador.
Como já vimos, trata-se de um software de propósito muito específico: olhar para o código-fonte escrito pelo
programador e traduzi-lo, para criar um grande corpo de código de máquina compatível com a CPU em que o
programador deseja rodar o programa.
Exemplo
Talvez haja uma parte do código-fonte onde existe uma instrução if (estrutura condicional), mas não há uma
instrução específica em um código de máquina para uma instrução if.
No entanto, talvez haja uma sequência de cinco instruções de código de máquina que, na verdade, chegam ao
mesmo resultado de uma instrução if. Portanto, o compilador faz esse tipo de expansão.
Vamos usar o Firefox como exemplo novamente:
Esse navegador é escrito em C ++. Assim, para criar uma nova versão do Firefox, após realizar os ajustes desejados
em seu código-fonte, alguém executa o compilador C ++, que lê o grande corpo de código-fonte em linguagem de
alto nível que constitui o Firefox e produz, essencialmente, o arquivo Firefox.exe.
Este arquivo é a saída do compilador e contém as instruções de código de máquina obtidas através da tradução do
código-fonte escrito pelos desenvolvedores do Firefox.
A etapa de compilação pode ser feita uma vez e bem antes da execução do programa (por exemplo, produza o
Firefox.exe na sede da entidade que o desenvolve, a Mozilla, e depois distribua o Firefox.exe, para que usuários de
PC possam usá-lo).
Importante
A compilação só precisa ser feita pelo desenvolvedor/programador uma vez.
Conforme ilustrado pela Figura 7, o desenvolvedor/programador, que escreveu o código-fonte, realiza a compilação
e cria o arquivo executável (exemplo: Firefox.exe), e pode simplesmente enviá-lo para que outras pessoas consigam
rodá-lo em seus computadores, contanto que sejam compatíveis com o código de máquina gerado.
Os usuários finais não precisam do código-fonte nem do compilador.
Porém, o processo não funciona ao contrário.
Ou seja: não é possível, a partir das instruções em código de máquina do Firefox.exe, realizar a tradução reversa e
obter o código-fonte em linguagem de alto nível originalmente escrita pelo(s) programador(es). É até possível obter
uma versão imperfeita do código-fonte original, mas esta versão fica bem distante do ideal.
2. LINGUAGENS DINÂMICAS OU INTERPRETADAS
A linguagem dinâmica se diferencia por se pautar no tempo de execução, cruzando os dados com os protocolos por
meio de bibliotecas, criando “meta-objetos”, quer dizer, bibliotecas complexas de combinação e execução.
Exemplo
Java, JavaScripts e Python são linguagens de programação dinâmicas/interpretadas.
Uma forma de compreender essa categoria é pensar que, em vez do compilador, é usado outro software de
propósito especial denominado interpretador.
Trata-se de um programa que lê código-fonte escrito em uma linguagem como Java, JavaScript, Python, entre
outras, e o “executa/roda”.
Talvez, o melhor exemplo para linguagem interpretada seja o JavaScript:
Um interpretador para a linguagem JavaScript vem embutido em navegadores de Internet, como o Firefox, o
Chrome, o Microsoft Internet Explorer ou o Microsoft Edge.
16
Assim, quando um navegador se depara com um website que contenha algum código JavaScript embutido, ele pode
usar seu interpretador para executar esse código. Portanto, de forma bastante resumida, a maneira como um
intérprete funciona é a seguinte: ele executa uma linha de código por vez.
Então, supondo que o exemplo a seguir seja um código-fonte contendo duas instruções escritas em JavaScript,
quando o interpretador JavaScript do navegador for executar isso, ele olharia a primeira linha e a executaria.
//Código Javascript
a = 1;
b = a + 1;
Portanto, neste exemplo, o interpretador diria: “Acho que preciso de um nome de variável ´a´, e preciso colocar o
valor ‘1’ nela”. Então, após executar essa linha, ele segue em frente e interpreta/executa a próxima linha, e assim por
diante.
TENDÊNCIAS
Falando de forma geral, atualmente, a tendência para a programação de computadores caminha para o uso de
linguagens dinâmicas/interpretadas. Isso ocorre porque há um consenso de que é bastante atraente poder
programar de forma mais simples e eficiente, mesmo sabendo que o programa final rodará mais lentamente na CPU.
Isso talvez seja um pouco contraintuitivo, mas podemos refletir sobre essa questão da seguinte forma:
Qual o recurso mais escasso em programação de computadores?
Geralmente, a resposta é o programador!
Em todo o mundo, o mercado de trabalho da área da computação sofre, cada vez mais, em virtude da falta de
profissionais qualificados. Portanto, usar menos horas de trabalho dos programadores é um atrativo muito
importante.
O fato de que o programa rodará mais lentamente na CPU é considerado menos relevante, até porque, conforme a
lei de Moore, as CPUs estão cada vez mais baratas e o poder de processamento delas cresce continuamente.
Então, se pensarmos em qual será a tendência para os próximos anos, também há um consenso, no mercado, de que
o programador continuará a ser considerado um recurso cada vez mais escasso, se comparado ao poder de
processamento das CPUs.
Para finalizar, vale a pena comentar sobre uma coisa chamada JIT (Just in Time Compiler). O objetivo dos JITs é
tentar obter o melhor dos dois mundos: linguagens compiladas e linguagens interpretadas.
A ideia é ter os benefícios da maior simplicidade de desenvolvimento de programas usando linguagens dinâmicae,
ao mesmo tempo, obter um programa que rode mais rapidamente na CPU.
Dessa forma, o JIT é responsável por ler parte do código-fonte e tentar compilá-lo rapidamente, antes de
executá-lo. O mais interessante é que isso funciona
muito bem!
Navegadores modernos de internet, como o Firefox, o Chrome, o Microsoft Internet Explorer e o Microsoft Edge,
agora embutem JITs para código JavaScript. Assim, na verdade, quando você está executando o código JavaScript
dentro do navegador, o JIT examina trechos do código dinâmico (Javascript) que estão sendo executados com muita
frequência e compila o código nativo destes trechos em tempo real.
Portanto, o intérprete não é usado para casos simples, mas para seções importantes do código dinâmico (como o
interior de uma estrutura de repetição), e o JIT cria um bloco de código de máquina na memória.
O código da máquina é executado para essa seção do código dinâmico, oferecendo desempenho semelhante a
linguagens compiladas, como C e C ++, e é descartado quando o programa é encerrado.
17
Note que, mesmo com o uso de JITs, ainda assim, linguagens interpretadas possuem desempenho inferior ao de
linguagens compiladas com C e C++.
Além do JavaScript, a linguagem Java também usa a tecnologia JIT extensivamente. O enorme ganho de
desempenho dos navegadores de internet nos últimos anos deve-se, em grande parte, à implementação da
tecnologia JIT para JavaScript.
CONSIDERAÇÕES FINAIS
Neste tema, você mergulhou na representação do que é um software para computadores, reconhecendo alguns
softwares funcionais que fazem parte do seu cotidiano. No fim, aproximou-se da linguagem de programação,
podendo, com isso, perceber como a linguagem e sua dinâmica são atualizadas continuamente.
Tema 3
Quem nunca ouviu essa infame anedota? Caso não tenha ouvido, você precisará ainda mais do que será visto aqui.
Porém, se você conhece e achou que tinha entendido, saiba que essa definição não o ajuda muito.
Para começar, estamos trabalhando com a construção do mercado de produtos que mais se modifica na
contemporaneidade. A maior parte de nós compra um produto quando ele já está obsoleto para determinados
setores, ainda que nos atenda muito bem.
Já reparou como a aparência dele muda o tempo todo? Computadores e celulares evoluem de um ano para o outro.
Se essa indústria muda tão rápido, como eu posso explicar o funcionamento de um hardware? Como é possível não
lhe ofertar um produto obsoleto de antemão?
O CONCEITO PROPRIAMENTE DITO
Hardware é o termo usado para se referir à parte física de um equipamento. Devemos pensar que estamos falando
dos componentes diretamente utilizados pela estrutura tecnológica. Você já viu o interior do seu celular? Tudo ali se
encaixa, tem uma função, desde mecanismos para levar energia, poupar e armazenar dados até possibilidades de
encaixes que agregam outras tecnologias. Cada um desses elementos é uma mistura de tecnologia de
desenvolvimento técnico e equilíbrio econômico para produção em massa.
O que difere hardware de software?
O software é o código, ou seja, as instruções, o que é executado no computador.
Então, um hardware é a estrutura física que permite executar as funções que desejamos.
O transistor é provavelmente uma das invenções mais importantes do século. Este é um pequeno componente
eletrônico que pode ser usado para criar todo tipo de coisas diferentes.
Atualmente, encontramos transistores embutidos em componentes chamados de chips.
Os componentes mais comuns dos chips são os transistores. CPU, memórias e diversos outros dispositivos
eletrônicos se resumem a chips compostos por transistores.
Saiba mais
Chips são dispositivos de estado sólido (solid state), isto é, sem qualquer tipo de partes móveis internamente. Não
há engrenagens, rodas ou eixos que girem dobradiças. Isso torna os chips dispositivos muito confiáveis, pois partes
móveis se desgastam com o tempo e requerem manutenção constante, como ocorre em motores de veículos. Além
disso, como já citamos, eles são fabricados com altíssima quantidade, mas de forma muito barata. A combinação de
baixo custo e alta confiabilidade é uma das principais forças motrizes da revolução dos computadores.
18
LEI DE MOORE
Uma das forças mais importantes do desenvolvimento do silício é a lei de Moore, uma observação feita por Gordon
Moore sobre como a fabricação de chips vinha sendo capaz de inserir cada vez mais transistores dentro de um chip.
Essa lei diz que o número de transistores contidos em um chip dobra em um período entre 18 e 24 meses.
Podemos entender a Lei de Moore sob dois aspectos:
Desempenho
A lei pode significar que a indústria tem conseguido dobrar o número de transistores embutidos em um chip a cada
dois anos. Essa observação descreve um crescimento exponencial bastante poderoso.
Econômico
Os transistores estão ficando cada vez mais baratos. Dessa forma, com o passar do tempo, devido ao baixo custo, é
possível criar sistemas computacionais em outros aparelhos, como telefone celular, geladeira, torradeira,
termostatos e até em óculos.
É importante entender que a lei de Moore não é uma lei da natureza, como a lei da gravidade de Isaac Newton. Ao
contrário, é apenas uma observação sobre como a fabricação de transistores tende a funcionar. O comportamento
observado por Moore tem seguido firme desde 1965. Neste sentido, as possibilidades do desenvolvimento de
melhoria e aceleração da parte física acabam por permitir o barateamento, transformando o hardware em uma
variável importante para o desenvolvimento das sociedades tecnológicas.
Para termos a real noção da importância deste fenômeno para o crescimento do poder computacional na
atualidade, pense que um telefone celular (smartphone) X, fabricado em 2019, possui poder de processamento
bilhões de vezes maior do que o computador de cálculo de trajetória usado na nave espacial Apollo XI (AGC – Apollo
Guidance Computer), que levou o homem à Lua, em 1969.
Uma forma internacionalmente conhecida para medir o poder computacional de processadores é o FLOPS
(Floating-point Operations per Second ou Operações de Ponto Flutuante por Segundo), que indica quantas
operações matemáticas com casas decimais o processador consegue realizar por segundo.
Com base nisso, veja a comparação a seguir:
AGC
Fabricado em 1969
14,6 FLOPS
Capaz de realizar, aproximadamente, 14 operações matemáticas com casas decimais por segundo.
Smartphone
Fabricado em 2019
Mais de 40 GFLOPS (Giga FLOPS)
Capaz de realizar cerca de 40 bilhões de operações por segundo.
Computador de mesa
(Desktop)
Fabricado em 2019
Pode chegar a 400GLOPS
Capaz de realizar, aproximadamente, 400 bilhões de operações por segundo.
Outro exemplo que você provavelmente observou em sua vida é que, a partir de 2000, surgiram os pen drives, com,
inicialmente, 8MB de capacidade de armazenamento. Pelo mesmo preço, em 2019, já era possível comprar pen
drives de mais de 2000GB de capacidade. Ou seja, em menos de 20 anos, houve um aumento de 250 mil vezes na
capacidade de armazenamento dos pen drives.
19
Pela lei de Moore, a fabricação dos chips que armazenam informação em pen drives evoluiu de tal forma que é
possível embutir mais transistores por, praticamente, o mesmo preço. Então, eles podem oferecer mais e mais
capacidade de armazenamento.
Modulo 2
Para falar sobre computadores, vamos tratar dos componentes fundamentais que o constituem.
Conforme ilustrado a seguir, temos a CPU, a memória RAM e a memória Disco/HD/ pen drives.
CPU
A parte mais importante do computador é a CPU. Ela faz a computação, ou seja, executa instruções. A CPU possui
um rol padronizado de operações bastante simples para executar. Então, quando dizemos que um computador
executa dois bilhões de operações por segundo, realmente estamos falando sobre a CPU. Isso significa que ela pode
fazer centenas de bilhões de coisas muito simples por segundo.
As instruções executadas pela CPU são escritas por pessoas que desejam usar o computador e seu incrível poder de
processamento para alcançar algum objetivo útil. As instruções escritas em linguagens de programação são
denominadas código de computador.
RANDOM ACCESS MEMORY
A Random Access Memory (RAM), que significa Memória de Acesso Aleatório, pode ser chamada apenas de
memória. A RAM é considerada a memória principal, pois é o armazenamento temporário usado pela CPU para
manter os dados e o código utilizados enquanto processa instruções.
Em código de computador, quando escrevemos instruções como a = 2 + 5, com o objetivo de que a variável a receba
a soma dos valores 2 e 5, ocorrem, na verdade, quatros coisas na memória RAM:
1 O valor 2 é armazenado em uma posição.
2 O valor 5 é armazenado em outra posição.
3 A instrução somar é armazenada em mais uma posição.
4 O espaço para a variável a é armazenado em mais um endereço.
A CPU lê/carrega os valores 2 e 5 da memória RAM e, depois, a instrução soma. Então, a CPU realiza a operação e,
depois, armazena o resultado na posição da memória reservada para a variável a.
É importante observar que a CPU precisa da RAM para processar as instruções de acordo com o código de
computador escrito pelo programador. É por isso que ela é chamada de memória principal.
A principal característica da RAM é que ela não é uma memória persistente, mas, sim, uma memória volátil. Isso
significa que, quando a energia elétrica é desligada, ela imediatamente fica em branco. Portanto, ela funciona muito
bem como armazenamento rápido e temporário, mas não se trata de um armazenamento de longo prazo.
Para ficar mais claro, vejamos o exemplo a seguir.
Imagine que o computador desligue por acidente enquanto você está digitando o texto de um trabalho no Word
antes de apertar o botão salvar. Você certamente ficará chateado, pois perderá as informações digitadas desde a
última vez em que salvou seu trabalho.
20
Isso ocorre porque esses caracteres ainda estavam somente na memória RAM, que não é persistente. Assim, a
versão que você possui é a última versão que salvou.
MEMÓRIA PERSISTENTE
O nosso terceiro componente de hardware é a memória/armazenamento persistente, também chamada de
memória secundária. Vejamos como ela funciona de forma diferente da memória RAM.
Em um editor de texto, quando você pressiona o botão salvar, instrui o computador a copiar a versão do documento
que está na RAM (versão temporária) para o disco/pen drive/HD, que são memórias persistentes, ou seja, que
permanecem com as informações armazenadas mesmo após o desligamento.
Este exemplo simples permite que você compreenda a noção do que significa ser persistente, como um
disco/HD/pen drive, ou volátil, como a RAM.
Avanço das tecnologias de armazenamento persistente
Veja alguns dos dispositivos de armazenamento persistente.
Hard Disk
Por muito tempo, o armazenamento persistente em computadores foi feito com um disco rígido (HD – Hard Disk).
No passado, o preço do armazenamento em memórias flash, SSD, pen drives e cartões SD era muito mais caro que os
discos rígidos e, por isso, os discos rígidos eram usados para tudo.
Note que um HD possui um disco giratório, que é rígido! Além disso, há uma pequena cabeça semelhante às agulhas
dos toca-discos antigos que escreve e lê padrões magnéticos no disco para armazenar e ler dados.Quando você
estiver operando um computador e ouvir vários sons agudos de “cliques”, o que você provavelmente está ouvindo é
o disco rígido girando em seu pequeno compartimento, com sua cabeça se movimentando para um lado e para o
outro.
Solid State Disk
Mais recentemente, houve avanços no que chamamos de discos de estado sólido (SSD – Solid State Disk). Assim,
uma unidade SSD também armazena dados persistentemente, mas, em vez de usar discos, como nos HDs, são
usados chips de memória de estado sólido. Estes componentes são chamados de sólidos, pois não há partes móveis,
como discos e cabeças de escrita/leitura. Ao contrário, tudo é feito eletronicamente.
Dispositivos de armazenamento baseados em SSD são dezenas e até centenas de vezes mais rápidos do que os
discos rígidos, além de serem mais confiáveis, já que não possuem partes mecânicas móveis. Seguindo esta mesma
tendência, um dos tipos mais recente de armazenamento secundário é chamado de SSD M.2.
Pen drive
Os pequenos pen drives USB utilizam tecnologia semelhante à do SSD. Seu tamanho reduzido nos permite levar
nossos arquivos conosco para qualquer lugar. Desde o lançamento do seu primeiro modelo até hoje, a capacidade de
armazenamento dos pen drives cresceu consideravelmente e promete aumentar ainda mais.
Cartões SD
Os cartões SD, usados em câmeras fotográficas digitais e celulares, conta com a mesma tecnologia usada no Solid
State Disk e nos pen drives. Apesar de seu pequeno formato, já existem cartões SD com capacidade de
armazenamento acima de 500GB.
21
Observando o avanço das tecnologias de armazenamento persistente, podemos reconhecer o padrão da lei de
Moore. Chips de memórias flash estão ficando mais baratos, e, assim, é cada vez mais comum o uso de dispositivos
de armazenamento baseados em estado sólido. É possível que, em algunsanos, o disco rígido deixe de ser utilizado
para o uso diário.
Para chegar a este ponto, precisamos apenas que a lei de Moore continue ocorrendo e que os preços de SSD sigam
caindo até alcançarem um valor bastante convidativo, a ponto de as pessoas pensarem o seguinte: “Não precisamos
mais de HD. Podemos apenas usar esses chips, pois eles são muito mais rápidos e confiáveis”.
SISTEMAS DE ARQUIVOS
Quando você tem um dispositivo de armazenamento secundário e persistente, há uma grande capacidade de
armazenamento. Entretanto, por si só, estes dispositivos não estão realmente prontos para o usuário.
Normalmente, o armazenamento de dados em disco rígido ou unidade flash é organizado com esquemas
convencionados, que são conhecidos como sistemas de arquivos.
Um sistema de arquivos é apenas uma maneira de organizar a grande área de bytes de dispositivos persistentes,
dando a eles um tipo de estrutura familiar de arquivos e pastas. Cada arquivo e pasta possuem nomes, que podem
ser movidos, copiados, editados, removidos etc.
Agora, vamos refletir sobre o assunto.
Será que, ao tentarmos gravar mais dados em um pen drive cheio, acabaremos sobrescrevendo os dados que já
estavam lá?Um arquivo é apenas uma maneira de ocupar certa área do dispositivo de armazenamento e atribuir um
nome a ele. O sistema de arquivos, então, garante que, caso o usuário tente gravar novos arquivos quando o
dispositivo já está lotado, os dados já existentes não sejam sobrescritos.
PLACA-MÃE
Já estudamos CPU, memória RAM e diversos tipos de armazenamento persistente (HD, SSD, M.2, pen drive), mas
falta um componente fundamental do computador, que é responsável por interligar CPU, RAM, discos etc.
A imagem a seguir apresenta uma placa-mãe, onde todos os componentes eletrônicos são conectados.
Veja como conectamos alguns dos componentes na placa-mãe:
A CPU é montada em um compartimento próprio da placa-mãe.
A CPU recebe uma aplicação de uma pasta térmica, que é importante para ajudá-la a transferir calor para o
dissipador que será instalado por cima e, assim, manter-se adequadamente resfriada durante seu funcionamento.
Um dissipador de calor, também chamado de cooler, é firmemente preso por cima da CPU, ficando em contato com
ao CPU e a pasta térmica.
Os pentes de memória RAM também precisam ser encaixados na placa.
MICROCONTROLADORES
Uma interessante consequência da lei de Moore é que os computadores se tornaram tão pequenos e baratos, que
você pode comprar versões cada vez menores dessas máquinas por preços relativamente baixos. Eles podem se
encaixar em inúmeros lugares, o que antigamente era algo inimaginável.
Um pequeno computador embutido em um único chip é conhecido como microcontrolador, que possui todos os
componentes básicos, como CPU, RAM e armazenamento persistente, em uma escala realmente pequena.
Logicamente, seu poder computacional, quando comparado a computadores de mesa, é bastante limitado.
22
Então, microcontroladores são computadores realmente pequenos, que não têm muito poder, mas são muito
baratos, e quem tornou isso possível foi a lei de Moore. Veja, a seguir, alguns exemplos de equipamentos que
utilizam microcontroladores.
Termostatos
Carros
Fornos de micro-ondas
Um bom exemplo de um microcontrolador é uma placa Arduino. Trata-se de um equipamento de projeto e de código
aberto, oferecido apenas por artistas ou entusiastas, ou apenas para brincar.
Observe o microcontrolador do Arduino destacado na imagem a seguir. É ali que ficam a CPU, a memória RAM e o
armazenamento persistente.
O microcontrolador está instalado sobre a placa azul, onde encontramos outros componentes auxiliares, ou seja, de
suporte. Por exemplo, para alimentação elétrica e interface com um monitor de vídeo.
Atualmente, é possível comprar um Arduino por valores acessíveis. Este é um item bem interessante para ser
utilizado em sistemas computacionais a fim de ler sensores ou interruptores. Também é possível controlar pequenas
luzes, por exemplo.
Portanto, é apenas uma maneira divertida de brincar e fazer uma espécie de projeto de arte ou algo assim. O
Arduino também é usado por escolas e universidades de todo o mundo, pois permite que alunos estudem e
implementem sistemas computacionais de forma bastante efetiva a um custo realmente reduzido, inclusive sem a
necessidade de gastos com licenças e royalties.
Modulo 3
Antigamente, os computadores – famosas torres – tinham processadores tão barulhentos, que pareciam aviões
decolando. Sempre que um problema era detectado, surgia a possibilidade de um aquecimento, e logo era posto um
23
ventilador para esfriar as coisas. Assim, um processador era associado não à capacidade de processar, mas à
velocidade do cooler, e por aí vai.
As tecnologias físicas passaram pelo mesmo processo por séculos, ou seja, primeiro vem a invenção, depois, a
desconfiança. Com a expansão, vem a assimilação. O resultado é a plena utilização dos vocabulários e das práticas
da tecnologia, como se sempre tivessem sido íntimas de nós. Pense no número de pessoas que desejam saber
quantos cavalos tem um motor, se a sua potência é 1.0 ou 2.0, com 8 válvulas ou 16 válvulas.
O que você verá agora é uma breve introdução ao entendimento das unidades de medida e sua lógica de utilização.
BYTE
Um byte é a espécie de medida mais comum de armazenamento de informações. Uma forma simples de pensar em
um byte é imaginar uma letra que você digita no teclado. Cada caractere, como um “a” ou um “G”, pode ser
internamente armazenado no computador como um byte.
A capacidade de armazenamento de memórias, como RAM e discos/HD/pen drives, é medida em bytes. Podemos
dizer que um megabyte é um termo que a maior parte de nós está acostumada a ouvir. Cada megabyte equivale a um
milhão de bytes.
Um gigabyte equivale a cerca de um bilhão de bytes. Então, com isso em mente, confira as unidades a seguir.
Os equipamentos atuais utilizam a seguinte escala:
Pen drive( GB); HD (TB); RAM (GB)
24
BITS E BYTES
Historicamente, computadores são construídos de forma que a unidade básica de informação a ser processada seja
uma unidade denominada bit, que pode assumir apenas dois valores, 0 (zero) ou 1 (um). Provavelmente, você já
ouviu a expressão que diz que computadores são apenas capazes de lidar com números 0 (zero) e 1 (um). Isso se
refere a bits.
Tudo o que computadores são capazes de fazer é necessariamente construído a partir dessa coleção de bits simples.
Então, no hardware de computadores, qualquer componente interno é capaz de assumir doisestados diferentes e,
quando assume um estado, ele pode ficar nele. Por exemplo, um transistor pode estar no estado ligado (1) ou no
estado desligado (0).
Em um disco rígido, os dois estados diferentes são feitos com uma pequena área onde o fluxo magnético tem
polaridade sul-norte (bit zero) ou polaridade norte-sul (bit um).
Por que os computadores funcionam dessa forma?
Os engenheiros que trabalham no desenvolvimento de computadores notaram que esta é uma forma muito mais
barata de construir tais hardwares quando comparada a outras formas, pois a unidade fundamental de dados pode
assumir mais do que dois estados, como em um computador em que a unidade fundamental de armazenamento seja
o sistema decimal, que estamos acostumados a usar.
Um bit, por si só, é pequeno demais para ser útil para qualquer coisa. Então, o que podemos fazer é agrupar oito bits
para criar um byte. Então, ao olhar para um byte, você, na verdade, está olhando para um conjunto de oito dígitos
binários, ou seja, cada dígito só pode assumir os valores zero ou um, como no exemplo a seguir.
Matematicamente, poderíamos expressar assim: 2x, onde x é o número de Bits.
Portanto, se um Byte é um grupo de oito bits, teremos 28 = 256 combinações diferentes.
Usando o raciocínio ilustrado anteriormente, sabemos que, com um byte (8 bits), podemos representar 28 valores
distintos, ou seja, 256 valores.
Mas qual é a utilidade do que acabamos de aprender?
Vamos começar refletindo sobre como usar esses padrões para representar números decimais. Cada número
receberá um dos 256 padrões diferentes. Assim, um byte pode representar cada número das 256 combinações.
Não vamos entrar em mais detalhes sobre como eles são atribuídos, mas cada número precisa de um padrão e não
pode compartilhar seu padrão com outro número.
Ok, eu tenho 255. Por que não 256, já que 8 bits podem representar 256 padrões diferentes?
A razão pela qual não é 256 é que começamos a contar do zero, e não do um. Então, um byte armazenará números
entre zero e 255. Dessa forma, 255 é o máximo, mas são 256 valores distintos.
25
Um bom exemplo de como um byte (0-255) é usado na prática é o sistema de representação de cores em
computadores, em que cada um dos componentes R (Red – vermelho), G (Green – verde) e B (Blue – azul) são
representados na memória do computador através de um byte cada. Ou seja, no padrão RGB, temos 256 níveis
distintos de vermelho, 256 níveis distintos de verde e 256 níveis distintos de azul. Usando este padrão, o
computador será capaz de representar 256x256x256 = 16.777.216 de cores (16.77 milhões de cores).
Achou tudo muito confuso? Não se preocupe, pois, no vídeo a seguir, você poderá sanar as dúvidas que restaram
sobre bit e byte.
Tema 4
FUNDAMENTOS SOBRE PIXELS
Neste módulo, aprenderemos como imagens são representadas em computadores, ou seja, estudaremos as imagens
digitais.
Na parte interna do computador, entretanto, essa imagem, e qualquer outra, resume-se a uma grande quantidade
de números pequenos.
Lembre-se: computadores são capazes de lidar somente com números. Então, como é que isso funciona?
O primeiro passo para compreendermos as imagens digitais, ou seja, como o computador representa uma imagem
por meio de um conjunto de números pequenos.
Quando olhamos para uma imagem digital como um todo, sequer percebemos que ela é formada por esses pequenos
quadrados. Isso ocorre porque os pixels são tão pequenos que geram uma ilusão de ótica, assemelhando-se a uma
imagem natural e arredondada.
Você conhece algum outro exemplo, fora do mundo dos computadores, em que pontos (pixels) também são
usados para representar imagens?
A ideia básica por trás de imagens digitais é praticamente a mesma usada pelas nossas avós quando costuravam
lindos bordados ponto de cruz.
Nesses bordados, as imagens também são formadas por um conjunto de pequenos “x” (pontos de cruz), cada um de
uma cor. Os pontos de cruz são os pixels dos lindos bordados das nossas avós.
As características fundamentais de qualquer imagem digital são:
1Elas são formadas por pixels.
2 Pixels são quadrados.
3Um pixel só pode assumir uma cor por vez. Você não pode, em um mesmo instante, representar mais de uma
cor em um pixel.
Se você quiser analisar a quantidade de pixels em uma imagem, basta checar quantos formam sua largura (colunas) e
quantos formam sua altura (linhas). Então, o número total de pixels é apenas uma questão de multiplicação.
Se houver uma imagem com 800 pixels de largura por 600 de altura, o total de pixels será: 800 x 600 =
480.000.
A imagem do pássaro apresentada na figura 1 é formada por 3.892 pixels de largura (colunas) e 3.328 pixels de
altura (linhas): 3.892 x 3.328. Aquele lindo pássaro foi representado pelo uso de 12.952.576 pixels, ou seja, quase 13
milhões. Agora, fica fácil entender por que a imagem nos parece tão natural.
26
Você, provavelmente, já deve ter ouvido o termo megapixel.
Telefones celulares, hoje em dia, são capazes de capturar imagens com resoluções de 5, 10, 12, 16, 20 e até 100
megapixels. Com o passar dos anos, as câmeras digitais se tornaram capazes de capturar cada vez mais megapixels.
GRADE DE PIXEL
Notamos que uma imagem digital é representada pelo computador como uma grade de pixels.
Cada pixel é um quadrado que só é capaz de assumir uma cor por vez. Além disso, é necessário que haja um esquema
de endereçamento para identificar cada pixel na composição da imagem.
Nos computadores, foi padronizado o uso de um conjunto de números para representar a coluna em que o pixel se
encontra, onde 0 (zero) corresponde à primeira coluna, 1 (um) corresponde à segunda, e assim por diante.
Temos o conjunto de valores do eixo y, onde 0 (zero) representa a primeira linha (topo), 1 (um) representa a segunda,
2 (dois) representa a terceira etc. Historicamente, é assim que os pixels de uma imagem são enumerados pelo
computador.
No exemplo da tabela 1, podemos ver três pixels indicados por setas. O pixel (5,0), em azul, o pixel (1,1), em branco, e
o pixel (2,4), em amarelo. É bem comum dizer que esses valores são as coordenadas de um pixel, algo como o
endereço da posição do pixel em referência ao canto superior esquerdo.
Modulo 2
REPRESENTAÇÃO DE CORES EM COMPUTADORES
Agora que sabemos como os computadores identificam pixels de uma imagem, vamos descobrir como representam
a cor de cada um deles.
Para entendermos como isso é feito, precisaremos recordar o lendário físico Isaac Newton e seu experimento com o
prisma de cores,que hoje chamamos de prisma de Newton.
Newton bolou e realizou este famoso experimento com um prisma, que é apenas um pedaço triangular de vidro.
Conforme ilustrado na figura 5, a luz solar branca vem da esquerda, e o prisma de vidro transparente divide este
fecho de luz em um espectro de cores, que está projetado na cadeira (o ideal é uma superfície branca), revelando que
a luz branca não é algo puro e indivisível.
27
Em vez disso, a luz branca pode ser separada em um espectro de cores constituintes. Essas são justamente as cores
que você vê em um arco-íris. Portanto, as cores estão realmente em um espectro contínuo.
Uma forma de representar cores é pensar em cores puras como uma espécie de paleta. Um esquema mundialmente
aceito é o uso as cores puras vermelho, verde e azul.
Agora, vamos estudar o esquema de codificação de cores específico chamado de Red Green Blue (RGB) ou
Vermelho, Verde e Azul. Desejamos que este esquema seja simples o suficiente para que nos tornemos capazes de
instruir (codificar ou programar) computadores a representar qualquer cor como uma combinação dessas três.
Se olharmos para a grade de pixels da tabela 1, precisaremos refletir sobre o que cada cor representa dentro da
grade. No esquema RGB, vamos usar luzes vermelhas, verdes e azuis puras, e misturá-las em diferentes
combinações para alcançarmos todas as cores possíveis.
Vamos descrever o funcionamento do explorador RGB, que é bem simples.
Há três controles deslizantes. Cada um serve para ajustar as intensidades de verde, de azul e de vermelho.
Se você escolher o valor 0 (zero) para o azul, significa que está ajustando o “pixel grande” do centro para que não
tenha absolutamente nenhuma intensidade de azul.
À medida que você desliza o controle para a direita, vai aumentando a intensidade de luz azul para 1, 2, 3... até
chegar ao nível 255, que representa o máximo de intensidade de luz azul que sua tela é capaz de emitir. O mesmo
vale para o vermelho e para o verde.
Já sabemos com mais detalhes como os computadores usam o esquema RGB para representar qualquer cor em um
pixel.
Essencialmente, cada um desses pixels tem seus próprios três números, que formam o código RGB de cores. Como já
vimos, cada pixel possui uma única cor por vez. Toda a informação necessária para representar a cor de um pixel
está nesses três números.
PENSAMENTO COMPUTACIONAL
Como humanos, estamos naturalmente acostumados a ver o mundo, pensar e refletir a respeito dele sob a ótica de
tudo o que é natural e orgânico.
Quando temos um arquivo de computador que armazena uma imagem, na prática, o que está dentro desse arquivo
são os dados de cada pixel, ou seja, números para a posição x,y do pixel na tela, e números (RGB) usados para indicar
qual é a cor do pixel.
E se pensarmos em um processamento nos dados?
Por exemplo, se quiséssemos tirar uma foto e, talvez, torná-la um pouco mais clara? No computador, vamos traduzir
isso em alguma operação com números.
Tema 5
INSTRUÇÕES PARA MANIPULAÇÃO SIMPLES DE DADOS
Para começar, veja a imagem da figura 1, cujo nome é circulo.bmp, composta por uma grade de 10x10 pixels:
A imagem possui um fundo branco, com um círculo desenhado. O BMP(
Bitmap image file ou arquivo de imagem bitmap)
é um formato de arquivo usado para armazenar imagens digitais.
Como escrever um código que solicita que o computador amplifique a imagem circulo.bmp?
28
Para isso, usaremos três instruções que fazem parte do conjunto de funções da linguagem de programação
JavaScript, conforme resumido na tabela 1:
Agora vamos partir para um segundo cenário um pouco mais interessante.
Queremos estender o código usado na Prática 1 para sermos capazes de manipular individualmente cada pixel.
Para isso, tudo que precisamos fazer é ajustar os passos da tabela 1 e adicionar duas novas instruções logo antes da
instrução print, conforme ilustra a tabela 2:
passo introdução significado em portugues
1 img =
newSimpleImage("circu
lo.bmp");
Carrega a imagem
circulo.bmp na memória e
a armazena na variável que,
neste exemplo, chamamos de
img.
2 img.setZoom(20); Estabelece ampliação de 20
vezes o tamanho original para
a imagem armazenada na
variável img.
3 print(image); Apresenta a imagem na tela.
passo introdução significado em portugues
1
img = new
SimpleImage("circulo.b
mp");
Carrega a imagem circulo.bmp na memória e a
armazena na variável chamada img.
2 img.setZoom(20); 20 vezes o tamanho original para a imagem
armazenada na variável img. Um zoom menor do
que 0 (zero) equivale a um afastamento. Por
exemplo, um zoom de 0.5 equivale a um
afastamento de 2x.
3 pixel =
img.getPixel(4,4)
Obtém a referência ao pixel (4,4) da imagem
armazenada na variável img e atribui essa
referência à variável pixel.
4 pixel.setRed(255) Instrui o computador a ajustar para 255 o nível de
vermelho para o pixel em questão.
29
Recomendação
A partir de agora, qualquer operação que fizermos com a variável img será efetuada sobre o pixel (4,4).
Em seguida, no Passo 4, a instrução pixel.setRed (255) ordena que o computador ajuste a saturação de vermelho do
pixel para o nível 255, que é o maior valor possível.
Considerações
Fique à vontade para experimentar com a Prática 2. Você pode escolher qualquer valor entre 0 e 9 para as
coordenadas do pixel (lembre-se: é uma imagem de 10 pixels por 10 pixels) e qualquer valor entre 0 e 255 para o
nível de saturação vermelho do pixel (conforme o esquema de cores RGB).
Esquema de cores RGB
Esquema de codificação de cores, chamado RGB (Red, Blue, Green/Vermelho, Azul, Verde). Trata-se de um esquema
simples que permite que possamos instruir (programar) o computador para representar qualquer uma das 16.7
milhões de cores formadas com a combinação dessas três.
Assim como a função setRed() ajusta o nível de vermelho para o pixel, temos duas outras funções análogas para
manipular os níveis de azul e de verde de um pixel. A tabela 3 apresenta as três funções possíveis para essa
manipulação:
TEORIA NA PRÁTICA
Suponha que, em vez de manipular apenas um pixel por vez, conforme fizemos neste módulo, desejássemos
manipular todos os pixels de uma imagem, digamos de 10x10 pixels (exemplo: circulo.bmp).
Se usássemos o código que aprendemos a escrever neste módulo, teríamos de escrever 100 vezes a instrução pixel =
img.getPixel(), em que, a cada vez, passaríamos os valores x,y para cada um dos pixels da imagem.
Isso traz vários problemas.
1. O primeiro deles é que o código ficaria difícil de ler/compreender.
5 print(image); Apresenta a imagem na tela.
passo introdução significado em portugues
1 pixel.setRed(número) Ajusta o nível de vermelho do
pixel conforme o número
informado. O número deve
ser entre 0 e 255.
2
pixel.setGreen(número)
Ajusta o nível de verde dopixel conforme o número
informado. O número deve
ser entre 0 e 255.
2 pixel.setBlue(número) Ajusta o nível de azul do pixel
conforme o número informado. O
número deve ser entre 0 e 255.
30
2. O segundo é que, se for uma imagem maior, de 1980x1024 pixels, teríamos cerca de 2 milhões de pixels.
Portanto, a instrução pixel = img.getPixel() teria de ser escrita cerca de 2 milhões de vezes no código fonte, a cada
vez fazendo referência para um pixel diferente.
No mundo real, quase sempre desejamos realizar operações com uma quantidade muito grande de dados. Os
engenheiros e cientistas de computação pensaram nesta questão décadas atrás.
Felizmente, há técnicas de programação/codificação que nos permitem manipular uma quantidade arbitrária de
dados, sem ter de escrever muitos códigos de computador.
Modulo 2
ESTRUTURA DE REPETIÇÃO FOR
Observe a imagem de um pássaro apresentado na figura 2:
Figura 2: Imagem com 584 pixels de
largura e 500 pixels de altura representando um pássaro.
Se multiplicarmos o número de pixels de largura pelo número de pixels de altura, teremos o total de pixel da
imagem.
Neste caso:
584x500 = 292.000 pixels ou quase 0.3 megapixels.
Essa nem é uma imagem muito grande, dado que os telefones celulares atuais são capazes de tirar fotografias de
mais de 10 milhões de pixels (10 megapixels).
Mesmo assim, se o autor de um código de computador, sem usar estruturas de repetição, tentar escrever um código
de computador para manipular cada um dos pixels da imagem da figura 2, precisará repetir 292 mil vezes as
instruções que apontam para determinado pixel (exemplo: pixel = img.getPixel( x,y )), cada uma delas seguidas com
as instruções de manipulação desejada (exemplo: pixel.setRed(255)).
Claramente, isso não é uma maneira prática de realizar uma operação com grande quantidade de dados. As
desvantagens vão desde um código de computador difícil de ler, por ser muito extenso, até a dificuldade de
manutenção, atualização ou correção do código, caso haja necessidade futura.
31
Então, o que queremos é uma construção na qual possamos escrever algumas poucas linhas de código que
capturam certas mudanças desejadas.
Depois, deixamos o computador executar essas linhas de código repetidamente, uma vez para cada dado que
desejamos manipular, ou seja, em nosso exemplo, uma vez para cada pixel da imagem.
Existem diferentes maneiras de realizar isso em códigos de computador, mas, por motivos de simplicidade, vamos
estudar a estrutura de repetição for, também chamada de loop for.
Repetição for = Loop for
Analise a sintaxe da estrutura de repetição for apresentada na figura 3:
A linha de código for ( pixel: img ), traduzida de código de computador para português, significa:
Para cada pixel da imagem armazenada na variável img, repita uma a uma todas as instruções cercadas por
abre chaves “{“ e fecha chaves “}” logo a seguir.
No exemplo da figura 3, temos três instruções destacadas em cinza dentro da estrutura for. Nesse caso, estas serão
as instruções repetidas para cada um dos 292 mil pixels da imagem “pássaro.jpg”.
Na prática, o que o computador fará para o código da figura 3 é fixar-se no primeiro pixel da imagem, (0,0), no canto
superior esquerdo, e executar os três comandos que ajustam o nível das cores constituintes vermelho, verde e azul
todas para 0. Este pixel, então, ficará preto.
1Observe a seta azul que liga o “}”, no final do loop for, no início da estrutura de repetição. Quando o computador
percebe que está na linha de instrução que fecha a estrutura de repetição, acontece isso, conforme indicado pela
seta azul: o computador volta novamente para o início do loop.
2 Em seguida, o computador se fixará no segundo pixel (1,0) da imagem e executará os três comandos em cinza,
deixando o segundo pixel preto. O mesmo ocorrerá para o terceiro, o quarto, o quinto e para todos os 292 mil pixels
da imagem do pássaro, até que toda a imagem esteja completamente preta.
3 Você perceberá que as três instruções em cinza que formam o corpo do loop for estão descoladas para a direita.
Isso não é obrigatório para que o computador compreenda as instruções.
4 É, no entanto, uma convenção muito comum mostrar que as linhas de dentro da estrutura de repetição são
especiais em relação às demais, porque são executadas várias vezes, até que a condição estabelecida no início da
estrutura for seja satisfeita.
Neste exemplo, a condição para finalizar é que as três instruções sejam executadas pelo computador para todos os
pixels da imagem.
32
A técnica de recuar a linha de código para deixar claro à pessoa que o estiver lendo que estas são instruções internas
à estrutura de repetição é amplamente chamada de indentação.
TEORIA NA PRÁTICA
Afinal para que serve a estrutura de repetição for?
A estrutura de repetição for é um recurso muito poderoso, que nos permite escrever algumas poucas linhas de
código capazes de ordenar ao computador que processe/manipule uma enorme quantidade de dados.
Neste módulo usamos exemplos de imagens para demonstrar o enorme potencial das estruturas de repetição. Este
foi apenas um exemplo.
Esteja certo de que essa estrutura é amplamente usada em computação e, com certeza, faz parte do dia a dia de
todos que, de alguma forma, escrevem códigos para computador.
Por fim, devemos mencionar um detalhe da linguagem usada aqui: JavaScript. Essa linguagem não possui uma
estrutura de repetição for tão compacta e simples como a que estudamos.
Usamos uma versão com sintaxe propositalmente simplificada, pois nosso objetivo era compreender os princípios
que motivam o uso de estruturas de repetição. Entendemos que o uso de uma estrutura simplificada ajudaria você a
compreender melhor o que se passa.
Modulo 3
Expressões são construções bastante importantes, pois, em vez de usar apenas valores simples em instruções,
podemos combinar diferentes valores para calcular o parâmetro mais personalizado.
Isso nos permite escrever códigos de computador que alcançam resultados mais realistas. Quando apresentarmos
exemplos práticos de manipulação de imagens, você entenderá melhor o assunto.
Usaremos a linguagem de programação JavaScript, com algumas simplificações para facilitar a compreensão.
EXPRESSÕES
Se analisarmos o código/instrução a seguir, veremos um tipo bem simples de passagem de valor (51):
print(51);
Essa instrução imprimirá o valor 51 na tela.
Dizemos que 51 é o valor passado como parâmetro para a função print.
As linguagens de programação compreendem códigos que envolvem expressões, conforme mostra o exemplo a
seguir:
Exemplo
print(40+11);
Então, o termo 40+11, passado como parâmetro para a função print, é o que chamamos de expressão.
Basicamente,em vez de um número fixo conhecido antecipadamente, podemos usar um pouco de expressão
aritmética. Assim, temos uma forma mais rica de fornecer parâmetros para funções.
Isso funciona da seguinte maneira: quando o computador executar a linha de código que contém a expressão, o
primeiro passo será avaliá-la. Assim, ele lerá e resolverá a expressão para chegar ao valor resultante.
Neste exemplo, 40+11 é apenas uma soma. O computador calcula que 40+11 é igual a 51. Uma vez que a expressão
foi avaliada e o resultado foi 51, então, o computador continua a execução do código, usando o resultado da
expressão como parâmetro para a função. Com efeito, em nosso exemplo o computador simplesmente imprimirá o
valor 51 na tela.
Antes de continuar, vamos conhecer três funções de manipulações de pixels que fazem parte da linguagem de
programação JavaScript:
33
Tabela 4: Dado um pixel da imagem, como saber qual é o valor atual para os componentes RGB do pixel?
Suponha um pixel em amarelo (exemplo: Código RGB 255,255,0). Neste caso, a função pixel.getRed() retornará o
valor 255, pois este é o valor atual do componente vermelho (R) do pixel.
De forma análoga, a função pixel.getBlue() retornaria 0 (zero), pois este é o valor atual do componente azul (B) do
pixel em questão. Isso ocorre porque o amarelo puro não possui azul em sua composição.
Agora, vamos supor que desejamos duplicar o valor atual do componente vermelho de um pixel. Se esse valor for 50,
ajustaremos para 100. Se for 105, ajustaremos para 210. Em resumo, desejamos realizar um ajuste relativo no valor.
Então, seja qual for o valor atual, nós o duplicaremos.
Já conhecemos a função pixel.getRed() e a possiblidade do uso de expressões. Logo, a tarefa ficou mais fácil. Uma
primeira solução seria usar este código:
ultimo = pixel.getRed();
pixel.setRed(ultimo*2);
Antes de continuar, vamos conhecer três funções de manipulações de pixels que fazem parte da linguagem de
programação JavaScript:
Tabela 4: Dado um pixel da imagem, como saber qual é o valor atual para os componentes RGB do pixel?
Suponha um pixel em amarelo (exemplo: Código RGB 255,255,0). Neste caso, a função pixel.getRed() retornará o
valor 255, pois este é o valor atual do componente vermelho (R) do pixel.
De forma análoga, a função pixel.getBlue() retornaria 0 (zero), pois este é o valor atual do componente azul (B) do
pixel em questão. Isso ocorre porque o amarelo puro não possui azul em sua composição.
so rução nificado em português
el.getRed() tém/Lê o valor atual para o componente RGB vermelho do pixel.
el.getGreen() tém/Lê o valor atual para o componente RGB verde do pixel.
el.getBlue() tém/Lê o valor atual para o componente RGB azul do pixel.
passo introdução significado em portugues
1 pixel.getRed() Obtém/Lê o valor atual para o
componente RGB vermelho
do pixel.
2
pixel.getGreen()
Obtém/Lê o valor atual para o
componente RGB verde do
pixel.
3
pixel.getBlue()
Obtém/Lê o valor atual para o
componente RGB azul do
pixel.
34
Agora, vamos supor que desejamos duplicar o valor atual do componente vermelho de um pixel. Se esse valor for 50,
ajustaremos para 100. Se for 105, ajustaremos para 210. Em resumo, desejamos realizar um ajuste relativo no valor.
Então, seja qual for o valor atual, nós o duplicaremos.
Já conhecemos a função pixel.getRed() e a possiblidade do uso de expressões. Logo, a tarefa ficou mais fácil. Uma
primeira solução seria usar este código:
ultimo = pixel.getRed();
pixel.setRed(ultimo*2);
Primeira linha
O que a primeira linha faz é chamar pixel.getRed() e armazenar o valor retornado na variável ultimo.
Segunda linha
A segunda linha usa a função pixel.setRed() para informar que o novo valor deste pixel será o dobro do último valor.
Logo, quando começar a executar a segunda linha:
1 O primeiro passo do computador será avaliar qual é o resultado da expressão ultimo*2. Se imaginarmos que o
último valor para o pixel é 60, a expressão multiplicará esse valor por 2, o que resultará em 120.
2 Em seguida, o computador executará a função pixel.setRed() com o valor 120 como parâmetro, o que dobrará a
intensidade de vermelho do pixel em questão.
3 Com efeito, o resultado das duas linhas de código é, de fato, duplicar a intensidade de vermelho do pixel atual.
Agora que entendemos os princípios do uso de expressões em códigos de computadores, vamos analisar o mesmo
exemplo de duplicação do valor atual da intensidade de vermelho de um pixel, porém com uma solução muito mais
comum no mundo real.
Veja a linha de código a seguir:
pixel.setRed( pixel.getRed()*2 );
Na prática, desejamos mostrar que a solução em questão pode ser condensada em apenas uma linha de código.
Note que a variável ultimo não tinha um objetivo muito importante no código. Ela apenas armazenava
temporariamente o último valor do componente vermelho do pixel para que este fosse usado na instrução seguinte.
Vamos supor que o pixel em questão esteja com os valores RGB (50,20,30). Então, o componente vermelho possui o
valor 50. O computador fará o seguinte:
Executar a instrução pixel.getRed() para obter o valor atual do pixel, que é 50;
Avaliar a expressão pixel.getRed()*2 e resolvê-la, multiplicando o valor atual do pixel por 2 e obtendo o resultado
100;
Executar a instrução pixel.setRed() usando como parâmetro o resultado da operação aritmética do Passo 2, ou seja,
o valor dobrado para o componente vermelho do pixel, que é 100.
Com isso, o novo valor RGB para o pixel em questão será: RGB (100,20,30). Se fizermos o mesmo para todos os
pixels de uma imagem, o usuário perceberá essa alteração como uma imagem com os tons de vermelho mais
destacados.
Se, no mesmo exemplo, desejássemos reduzir pela metade a intensidade de vermelho do pixel, a linha de código
ficaria assim:
pixel.setRed( pixel.getRed()/2 );
Note que, em vez de usarmos o asterisco, que denota multiplicação, utilizamos o “/”, que denota divisão.
Outra forma de escrever a mesma solução seria multiplicar o pixel atual por 0.5, o que é o mesmo que dividir por 2.
Então, nesse caso, teríamos:
pixel.setRed( pixel.getRed()*0.5 );
35
Considerações
Reflita sobre a quantidade de operações realizada em um piscar de olhos pelo computador, dado o código-fonte que
geramos.
Para cada um dos 194 mil pixels da imagem da figura 4, o computador fez as seguintes operações:
● Obteve a intensidade de verde do pixel;
● Multiplicou a intensidade de verde do pixel por 0.7;
● Ajustou a intensidade de verde do pixel para o resultado dos dois passos anteriores.
Então, em português, poderíamos descrever o objetivo deste exercício simplesmente como: tornar a imagem um
pouco mais laranja.
Reflita sobre como esse objetivo foi traduzido do português para o código de computador que usamos ao
realizarmosa operação.
A capacidade de fazer essa tradução e escrever uma solução que computadores são capazes de executar
rapidamente é para nós uma habilidade chave para o chamado pensamento computacional.
Modulo 4
O que são estruturas condicionais?
Estruturas condicionais são as linhas de código de computador empregadas para expressar a ideia de lógica ou
seletividade.
Usando esses tipos de instruções, somos capazes de preparar o computador para realizar um teste, cujo resultado
será verdadeiro ou falso, aplicando-o para controlar se determinado pedaço de código será ou não executado.
Todas as linguagens de programação possuem estruturas condicionais. Neste módulo, analisaremos um tipo
específico: a declaração if (do inglês, if-statement). Não deixe de manter em mente que if, em inglês, significa se.
Nós nos basearemos em exemplos e práticas na linguagem JavaScript, estando sempre voltados para a resolução de
interessantes problemas de manipulação de imagens.
ESTRUTURA CONDICIONAL
A seguir, vemos a sintaxe de uma declaração if conforme a linguagem de programação JavaScript:
1. if( pixel.getRed() > 160 ) {
2. pixel.setRed(0);
3. pixel.setGreen(0);
4. Pixel.setBlue(0);
5. }
Se a intensidade do componente vermelho do pixel for maior do que 160, então execute as instruções que estão
entre as chaves esquerda e direita.
Em outras palavras, as instruções das linhas 2, 3 e 4 só serão executadas pelo computador se o resultado do teste for
verdadeiro.
Pense nessa instrução como uma forma de selecionar os pixels que serão afetados pelas instruções das linhas 3, 4 e
5.
1 Por exemplo, ainda na instrução 1, se o valor do componente vermelho do pixel em questão for 140, então, as
instruções 2,3 e 4 não serão executadas pelo computador, pois o teste if( 140> 160) retornará, é claro, falso.
2 Se o valor do componente vermelho do pixel em questão for 160, então as instruções 2,3 e 4 também não serão
executadas, pois o resultado do teste if (140 > 160) será falso.
36
3
A execução das instruções 2, 3 e 4 só ocorrerá, por exemplo, se o valor do componente vermelho do pixel em
questão, obtido pela função pixel.getRed(), for 161 ou qualquer valor maior do que este.
4 Note, na linha 1, onde há a instrução if, que o teste a ser realizado pelo computador está entre parênteses. Esta é
uma sintaxe requerida pela linguagem JavaScript.
Somente seguindo essa sintaxe o computador será capaz de entender que se trata de um teste que ele deve realizar,
para então decidir se irá ou não executar as instruções entre as chaves esquerda“{“ e direita “}”, que delimitam a
declaração if.
Comentário
Na prática, frequentemente vemos uma declaração if ser usada dentro de uma estrutura de repetição, como a
estrutura for. Esse tipo de combinação permite que problemas bastante interessantes sejam resolvidos.
Para o restante deste módulo experimentaremos com a estrutura condicional if. Abordaremos várias práticas
simples que envolvem manipulação de imagens digitais, começando por casos bem rudimentares e chegando a
aplicações do mundo bem interessantes, ainda que simples.
Optamos por usar exemplos com imagens digitais, pois esta é uma forma muito simples, intuitiva e rápida para você
observar os efeitos da execução de algumas linhas de código de computador. Isso ocorre porque estamos
acostumados a observar imagens do mundo real desde que nascemos. Então, este é um processo altamente intuitivo
para todos.