Programando um mundo livre

Autor: ANDRE NUNES BATISTA <andrenbatista at gmail.com>

O que é programar?

Recentemente um amigo próximo me perguntou o que era exatamente o
trabalho de um programador. Curioso que em uma sociedade tão
atravessada por softwares se saiba tão pouco sobre o que eles são. Os
usuários conhecem dos softwares somente a interface, o que permite uma
noção apenas parcial da realidade da coisa. Pensar sobre isso me fez
perceber que a dificuldade em explicar o que é um software livre advém
do fato de que as pessoas não sabem o que é um software. Como o
software é pensado como um utilitário, um produto, falar em software
livre soa o mesmo que grátis e perde-se totalmente o foco da questão.

Assim, o presente post se propõe a explicar o que é um software, bem como o que significa torná-lo livre.

O que é programar?

Programar é a arte de resolver problemas (o que a aproxima da
engenharia), resolução feita por meio da concatenação de instruções.
Quando, por exemplo, a chefe diz para o secretário:

"Sr. Albuquerque, estarei ocupada agora à tarde, portanto, se
alguém me ligar, diga que eu estou em uma reunião e pergunte se quer
deixar recado. Ah, a não ser que seja a Cleide, aí você pede pra ela me
ligar no celular que eu quero falar com ela."

Ela o está programando para reagir frente a uma ligação.
Quando tratamos de computadores, contudo, a programação não se dá por
meio de um idioma natural (como o português), mas por meio daquilo que
chamamos de linguagem de programação, que nada mais é do que um idioma
formal, com sintaxe rígida e semântica unívoca.

Se a Sra. Santos estivesse programando um computador em vez de um ser humano, suas instruções se assemelhariam com o que segue:

Se alguém ligar:
   Perguntar quem é:

      Se for Cleide:
         Pedir para que ela ligue no celular da Sra. Santos.

      Do contrário:
         Dizer que Sra. Santos está em reunião.

   Perguntar se querem deixar recado.

   Se houver recado:
      Anotar recado.

   Agradecer a ligação e desligar.

Observe que a linguagem natural na verdade esconde um conjunto
complexo de instruções. Com poucas orações direcionadas à reação frente
a uma situação trivial da vida quotidiana, a Sra. Santos na verdade
passou várias instruções condicionais aplicáveis a uma pluralidade de
eventos. O código acima, todavia, é meramente exemplificativo da
estrutura de um programa, tratássemos de um computador, seria
necessário um maior rigor formal que somente é possível com uma
linguagem artificial.

A questão mais imediata é: por que um computador não pode ser
instruído em português? Por que a linguagem de programação não pode ser
a língua portuguesa? Apesar de soar trivial, a resposta a esta pergunta
é a chave para entender não somente a programação, mas também os
computadores e, por via reflexa, os humanos.

Um computador não pode ser programado em linguagem natural
porque ele não é capaz de entender, mas apenas de reagir. Um computador
não passa de um pedaço de silício que reage aos estímulos elétricos que
passam por ele de uma maneira determinística. Diz-se que os
computadores entendem apenas a álgebra booleana dos números binários,
mas mesmo isto é uma abstração. A álgebra booleana na verdade é a forma
como nós humanos abstraímos e formalizamos os processos físicos que
ocorrem quando aquele objeto é estimulado de diferentes formas.

Assim, no nível da máquina, programar significa fornecer à
maquina instruções em dois diferentes estados – binárias (zeros e uns).
Ao receber estas instruções, o computador as computa (do Houaiss:
calcular, efetuar confronto, comparar, igualar, contar) e isso é tudo o
que ele pode fazer, cálculos.

Porém, como ficar decorando instruções no formato "00101011 10011101
…" é simplesmente um pesadelo para um ser humano, foram criadas as
linguagens de programação, que nada mais são do que programas que
agrupam estas instruções ininteligíveis em funções matemáticas
(algoritmos) que são apelidadas com nomes próximos à linguagem natural
humana, mais fáceis de memorizar. Essa tradução, contudo, não foi feita
de imediato, mas é o resultado de uma lenta evolução ao longo dos
muitos anos da história da computação.

O primeiro passo não exigiu um programa, mas foi apenas uma
diferente forma de representar a mesma coisa. Em vez de pensar as
instruções em números binários, que são muito fáceis de confundir, elas
eram pensadas números hexadecimais
(em vez de dois algarismos – 0 e 1 -; dezesseis deles – 0-9 e A-F).
Isso, contudo, ainda é muito longe do que um humano pode entender, de
forma que diversas destas instruções foram agrupadas em mnemônicos para
o que elas faziam. Assembly é a forma como esta linguagem mais básica
foi denominada. Mas a Assembly ainda permanecia atrelada a instruções
muito básicas e é preciso conhecer intimamente a CPU para saber como
programar nesta linguagem.

Criaram-se então as linguagens chamadas de "alto nível". O exemplo
clássico é a linguagem C. As linguagens de alto nível distanciam-se da
matemática e do conhecimento do computador e possibilitam instruções
muito mais próximas à linguagem humana, parecidas com o pseudo-código
acima.

Creio que já estamos próximos aos hieróglifos egípcios, então
um exemplo para ilustrar o que é programar. Um programa extremamente
básico em linguagem de alto nível seria um que apenas dissesse uma
frase, por exemplo, "já estou entediado".

Na linguagem python, de altíssimo nível, esse programa seria:

print "já estou entediado."

Em C, um pouco mais baixo nível:

#include <stdio.h>
int main()
{
printf("já estou entediado\n");
return 0;
}

Em Assembly, baixo nível:

lea    0x4(%esp),%ecx
and $0xfffffff0,%esp
pushl -0x4(%ecx)
push %ebp
mov %esp,%ebp
push %ecx
sub $0x4,%esp
movl $0x8048490,(%esp)
call 80482d4 <puts@plt>
mov $0x0,%eax
add $0x4,%esp
pop %ecx
pop %ebp
lea -0x4(%ecx),%esp
ret

Em hexadecimal isto seria traduzido por:

8d 4c 24 04
83 e4 f0
ff 71 fc
55
89 e5
51
83 ec 04
c7 04 24 90 84 04 08
e8 13 ff ff ff
b8 00 00 00 00
83 c4 04
59
5d
8d 61 fc
c3
90

E em binários, que são as instruções que o computador de fato processaria:

10001101 01001100 00100100 00000100
10000011 11100100 11110000
11111111 01110001 11111100
01010101
10001001 11100101
01010001
10000011 11101100 00000100
11000111 00000100 00100100 10010000 10000100 00000100 00001000
11101000 00010011 1111111111 1111111111 1111111111
10111000 00000000 00000000 00000000 00000000
10000011 11000100 00000100
01011001
01011101
10001101 01100001 11111100
11000011
10010000

Na realidade ninguém programa em binários ou em hexadecimal.
A linguagem mais baixa que se usa ainda hoje é o código Assembly, mas
nem todo programador entende esta linguagem. Cada linguagem tem uma
vantagem. A vantagem daquelas de alto nível é delegar ao computador a
preocupação com a lógica e os processos básicos, permitindo que o
programador se preocupe apenas com os resultados e diminuindo muito o
tempo de estudo e a possibilidade de erros. As de baixo nível permitem
códigos mais enxutos, capazes de rodar em máquinas com menor potencial
(relógios, semáforos, celulares, tocadores de mp3 etc), permitindo,
ainda, um maior controle sobre o que será executado.

O programador de linguagens de alto nível, em vez de se
preocupar com álgebra e registradores, pensa em instruções do tipo "se
x, então y". Mas para que ele possa abstrair a lógica do computador é
necessário que alguém antes dele tenha se preocupado com ela. Para que
alguém possa escrever apenas print "já estou cansado." e fazer o
computador exibir na tela a frase desejada, é preciso que alguém antes
dele tenha criado um programa que entende caracteres, que alguém tenha
criado um programa que exibe caracteres, que alguém tenha criado um
programa que interpreta "print" e traduz em um longo conjunto de
instruções binárias (que é a única coisa que o computador entende).

O que é ser livre?

Como dito, programar é a arte de resolver problemas. A resolução
de alguns problemas, contudo, é que permite que sejam propostos outros
novos.

Um dia, exibir caracteres em uma dela foi um problema que teve
de ser enfrentado e resolvido, questão que hoje nem mais se coloca. Um
dia, fazer com que uma impressora se comunicasse com um computador e
imprimisse documentos também foi um problema. Não tão distante assim,
exibir gráficos em um monitor era um problema, o modo de interação com
as máquinas era exclusivamente no modo texto. Fazer com que
computadores se comunicassem já foi um problema. Tornar a programação
mais acessível e menos propensa aos erros já foi um problema.

A resolução destes e de muitos outros problemas é que abre
nossos horizontes para pensar outros tantos. Neste sentido, tornar um
software livre significa tornar disponível e acessível a sua forma de
resolver tais e quais problemas, significa expor a solução à crítica,
significa permitir a cooperação, significa também a transparência do
que um software faz quando você o executa. Na prática, o primeiro passo
para essa liberdade é divulgar os códigos, em vez de transmitir apenas
os arquivos binários auto-executáveis. Mas não basta apenas
divulgá-los, é necessário garantir que aquele saber poderá ser
utilizado para quaisquer fins. Muitas são as implicações de uma escolha
entre um modelo proprietário e um modelo livre e seria inviável ou
pobre tentar discorrer sobre todas em um único post.

Cabe, entretanto, uma ilustração. Programação é ciência e
também é arte. Há um mote que diz: "code is poetry". Por mais assombro
que a idéia possa trazer ao humanista, há um ponto de convergência
entre a poesia e a programação que se perfaz na dedicação à linguagem.
Assim como uma idéia pode ser transmitida de diversas maneiras, mas o
que distingue o poeta do falante é a forma como usa as palavras para
colocá-la, um problema pode ser enfrentado de diversas formas e o que
distingue o programador é a sutileza de sua solução.

Para aprender e entender poesia, os poetas lêem as obras de
outros poetas, estudam seus poemas e rascunham os próprios. Não é uma
arte que nasce pronta, mas que desenvolvem a partir das idéias que
captam em outros autores e que moldam aos seus próprios anseios.

Os programadores, em um mundo de softwares proprietários,
estão completamente abandonados em seu aprendizado. Para estudar
programação dispõem apenas de manuais que explicam linguagens de
programação, sintaxe e arquitetura de computadores. Nas faculdades de
ciência da computação não se pode estudar as obras de grandes poetas,
pois são secretas, pode-se somente estudar a cartilha.

Programação é arte e também é ciência. Hoje em dia ninguém
mais precisa desenvolver o binômio de Newton, ninguém precisa fazer
experimentos para inferir a relação entre a matéria e a energia
(E=m.C²), ninguém precisa buscar encontrar uma relação entre os lados e
ângulos de um triângulo. Este conjunto de conhecimentos já faz parte do
estado da arte e os novos estudiosos podem a partir deles se debruçar
sobre novos problemas ao mesmo tempo em que podem sobre eles se
debruçar a fim de apontar-lhes as impropriedades.

Não é o que ocorre com a programação em um mundo de softwares
proprietários. O conhecimento científico em matéria de software segue
hoje um modelo empresarial fechado, onde grande parte do conhecimento
encontra-se recluso nas mãos de poucos cujo interesse não é a crítica e
o desenvolvimento, mas o controle e o poder.

O software livre, neste sentido, é uma mudança de paradigma ao
mesmo tempo em que um retorno ao paradigma anterior. Falar em software
livre significa negar o viés do produto acabado e encaixotado e abraçar
o viés do conhecimento sempre mutante, sem fronteiras definidas, negar
a centralização e a dependência e clamar empoderamento do indivíduo.
Falar em software livre significa recursar a perpetuação de relações
desiguais, negar a existência de uma distinção fundamental entre os que
manipulam o saber e aqueles que dele apenas sentem os reflexos.
Significa rejeitar uma visão polarizada de uma sociedade divida entre
autores e leitores, desenvolvedores e usuários, produtores e
consumidores, governantes e governados.

Todos os desenvolvedores de software são também usuários e
todo usuário é em potencial um desenvolvedor. Pensar em termos de
liberdade é reconhecer e enfatizar as potencialidades individuais, é
convidar ao diálogo, é convidar à ação refletida, à transparência e à
participação de cada um no diálogo cultural. Liberdade em software,
conhecimento livre, é muito mais do que simplesmente não pagar pelo
utilitário de processamento de textos para o seu trabalho escolar.


http://www.vivaolinux.com.br/artigo/Programando-um-mundo-livre

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s