Para que realmente serve o software?

Dada a atenção indevida atraída pelo post “Para que serve o software?“, onde leitores casuais desavisados caíam na armadilha de ler uma coisa que não tinha nada a ver com o que procuravam, me senti na obrigação de escrever um post (anos depois) explicando realmente, em nível técnico-didático-objetivo, para que serve o software, e não aquela baboseira que era o post original.

Software é um estrangeirismo vindo do inglês que antagoniza a palavra hardware, que significa: “hard” -duro; “ware” -bem de consumo, mercadoria. O termo originalmente utilizado para designar pequenas peças de metal, adquiriu um novo sentido no século XX: designar a parte dura, material do computador. Daí, já que “hard” é duro e “soft” é mole, não custou nada para alguém cunhar a palavra software, que em contrapartida ao hardware, designa a parte lógica do computador, seus procedimentos de funcionamento, seu “conjunto de instruções” (e coloco “conjunto de intruções” entre aspas porque, apesar de as pessoas normais conseguirem entender muito bem o sentido que dou aqui a esta expressão, já posso prever eventuais leitores programadores reclamando disso e dizendo que “conjunto de instruções” é uma propriedade de arquiteturas de processadores e coisas afins; mas não é este sentido que aplico aqui).

Para entender melhor, é preciso saber que computadores são mais que simples calculadoras gigantes (embora pareça, e muitas pessoas os usem assim); têm uma característica fundamental que os diferencia de calculadoras puras: eles são programáveis (tá, tem calculadoras programáveis, mas isso também as define como computadores). Significa que um computador é uma máquina feita para seguir instruções precisas, um conjunto de passos bem definidos, orientados para algum propósito (bem, assim esperamos, mas nada impede você de programar o seu computador para fazer coisas sem propósito, ou de rodar programas despropositados nele), e essas instruções podem ser alteradas sem ter que se reconstruir a máquina. As tarefas dadas aos primeiros computadores (dado o contexto da Segunda Guerra Mundial) eram cálculos de trajetórias balísticas e decifragem das comunicações inimigas.

Mas o computador não sabia fazer isso sozinho. Como calcular a trajetória das balas de canhão, Isaac Newton já ensinou para todo mundo faz muito tempo, então coube a alguém que aprendeu com ele ensinar ao computador como fazê-lo. Esse alguém (mais provavelmente, vários alguéns) já o sabiam como fazer à mão: existe um conjunto de passos bem definidos e fórmulas já bem conhecidas para o procedimento; não é necessário nenhuma intuição ou criatividade para realizá-lo, só é preciso saber como se faz e repetir o processo. Só que fazer isso à mão é lento e passível de erro, porque pessoas se cansam e se distraem, especialmente se for um trabalho chato como esse. Daí os engenheiros programaram a sequência de passos objetivos que o computador deveria seguir para chegar ao resultado, o procedimento para realizar a tarefa, e é precisamente esse procedimento, codificado na língua do computador, que é o software.

Descifrar códigos secretos é um trabalho mais chato ainda, tem que ficar testando muitas variações e técnicas de decifragem em cima do código, até sair alguma coisa legível. Como um computador é muito mais rápido que uma pessoa, ele é bastante adequado para a tarefa, desde que ele saiba de antemão quais técnicas e em que ordem elas devem ser aplicadas ao texto. Esses técnicas, dadas em ordem bem definida, e codificadas na língua do computador, constituem o software.

Veja que estresso a importância da “ordem” do procedimento. Alguém poderia perguntar: mas e se o computador aplicasse as técnicas em ordem aleatória? Então eu responderia que daí não é um computador. Um computador é incapaz de uma ação aleatória. Nem mesmo consegue escolher uma carta de um baralho fechado. O melhor que ele consegue é chamado de “pseudoaleatório”: ele segue um processo tão esquisito, matematicamente forjado para este propósito, que simula aleatoriedade, porque a distribuição dos valores gerados por esse processo é uniforme e aparentemente imprevisível. Mas se depois de gerar um bilhão de números pseudoaleatórios, você “rebobinar” o computador para o ponto em que ele começou, ele gerará exatamente os mesmos números. É uma disciplina abrangente e complexa o estudo dos processos de geração de valores pseudoaleatórios, que se justifica por essa incapacidade dos computadores.

É claro que alguém pode desenvolver alguma engenhoca que gera eventos aleatórios e ligá-la ao computador (e isso é comummente feito nos computadores, com o hardware de geração de número aleatório), ou guardar parâmetros de eventos externos aleatórios, como as ações dos usuários humanos, e usar isso para sortear suas ações, ou qualquer ideia do tipo que com certeza alguém já pensou, mas do processo puro da computação, decorrente da execução de um software, uma ação aleatória é impossível. E isso é óbvio se considerarmos que um software é uma sequencia bem definida de passos: se é bem definida, não pode ser aleatório.

É uma questão física/filosófica se eventos realmente aleatórios existem no mundo real; se tivermos todos os parâmetros de um dado e a força com que foi lançado, podemos calcular precisamente como ele cairá. A existência, portanto, admitiria algo realmente aleatório? Certamente podemos detectar eventos aleatórios na física quântica, mas não seriam eles parte de um processo mais primordial que ainda não entendemos? Essa incerteza sobre a natureza da realidade leva à especulação mais fascinante da computação teórica: seria a realidade um software, uma simulação? Se sim, ela não é fundamentalmente diferente de nenhum simulador ou jogo de computador que jogamos, somente maior. Claro que essa ideia é refutada por aqueles que acreditam na superioridade do intelecto humano sobre o computador, eles argumentam que um computador nunca poderá ter consciência, criatividade, imaginação, etc, e portanto é fundamentalmente incapaz de reproduzir a realidade, mesmo se fosse grande o suficiente, já que obviamente há vida consciente nesta realidade que ele seria incapaz de reproduzir.

Divagações filosóficas à parte, agora que já expliquei o conceito teórico fundamental sobre o software, vamos à parte prática. Na década de 1950 o software era tão pequeno que não era nada além de um procedimento de cálculo balístico, um mero acessório do computador. Hoje em dia software vem em todos os tamanhos, e pode ser tão grande que o custo do computador é irrelevante perto do seu custo. Antigamente o software tinha que ser projetado para um computador específico, cada computador tinha seu próprio “conjunto de instruções” suporatas (agora sim, no sentido ortodoxo do termo), sua própria linguagem para montar os programas (linguagem de montagem, assembly em inglês), e embora equivalentes, eram incompatíveis (você pode expressar as mesmas idéias em português ou alemão, portanto são línguas “equivalentes” para o propósito de comunicação, mas quem só fala português não entende alemão, portanto são “incompatíveis”). O programa de um não rodava no computador do outro. A lógica era: o fabricante projetava e fazia o computador do melhor jeito que pudesse dentro dos recursos, depois os programadores se viravam para (re)escrever os programas.

Hoje o software é mais valioso que a máquina em si, dezenas de fabricantes diferentes fazem computadores compatíveis entre si, só para poderem funcionar com o software já existente. O software se tornou tão grande que os cálculos e processamentos úteis realizados pelo computador se perdem no meio de firulas gráficas, sons, animações e coisas piscando, mas tudo criado fundamentalmente do mesmo jeito: bilhões de instruções executadas por segundo para decodificar um filme 3D FullHD com som 8.1 surround, todas executadas passo a passo, bem definidas, perfeitamente ordenadas, totalmente previsíveis, e com seus efeitos cuidadosamente planejados pelos programadores e engenheiros. Cada pixel da tela precisamente identificado por suas coordenadas cartesianas X e Y têm cada um dos seus três canais de cores (vermelho, verde e azul) definidos pelo preciso processo de funcionamento do software, que instrução por instrução, diz para o computador exatamente o que fazer com aqueles dados vindo do disco de Blu-Ray para chegar naquela intensidade daquela cor daquele pixel naquela posição da tela que você observa por menos de um vigésimo de segundo enquanto o filme passa.

Nossa, isso foi dramático. Na verdade não é bem assim. Computadores modernos na verdade possuem vários processadores, que podem executar vários programas simultaneamente, ou trechos diferentes do mesmo programa, ou então até o mesmo trecho do programa, mas cada um com um pedaço diferente dos dados que precisam ser processados. As possibilidades são bem flexíveis; afinal, é o software (ou o programa) que determina como vai ser; o hardware só obedece. Na verdade verdadeira, dentro da caixa que chamamos computador, podem ter ainda mais processadores, com propósitos específicos que rodam software diferente dos o processadores principais, que é o caso das placas de vídeo, que têm processadores projetados para simular efeitos gráficos tridimensionais.

Todo esse circo do computador moderno é coordenado pelo software mãe: o sistema operacional. Ele é primeiro software que liga e último que morre (bem, quase). Ele determina como todos os outros programas serão executados, em que ordem eles serão executados, como interagirão entre si e com o usuário e como eles se alternarão entre os recursos do computador rápido o suficiente para que você ache realmente que todos os programas que você tem aberto funcionam simultaneamente (não fosse assim, um Quad-Core não poderia rodar mais que quatro programas ao mesmo tempo). Ele também controla todo o hardware, sabe do que o hardware precisa, quando precisa e sabe se comunicar com ele (os famosos drivers), traduzindo de/para os outros programas o funcionamento do mouse, do teclado, do vídeo, do som, da rede, etc. Tudo isso com seu descrito passo a passo, instrução por instrução, que é pacientemente lida, decodificada e executada pelo processador, bilhões de vezes por segundo…

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s


%d bloggers like this: