TEXTO INCOMPLETO: Linguagens de programação

(Texto incompleto de 10 de junho de 2020. Esse texto era pra ser parte de um plano bem maior de textos sobre uma explicação aprofundada, mas para leigos, sobre como os computadores funcionam de verdade, mas escrever edifício)


Eu fui ter computador em casa quando tinha 13 anos. Já tinha tido contato com computadores antes disso no laboratório da escola, na casa de amigos, etc., mas foram contatos bem esporádicos. Já era a época do PC moderno, windows xp, orkut, jogos flash, apresentações do powerpoint, etc.. Como vários garotos pré-adolescentes, eu gostava de ficar no computador para jogar o que tivesse disponível. No meu caso isso se resumia, entre outras coisas, a counter-strike, joguinhos flash da internet, alguns jogos online.

Mas meu uso de computador não se resumia a usar superficialmente o que tinha disponível. Eu tinha uma curiosidade enorme em fuçar o sistema, os programas que existiam no computador, pra descobrir como funcionavam — mas sem entender muita coisa. Esse era um costume já antigo: quando eu era criança, gostava muito de desmontar os eletrônicos da casa para descobrir como eles eram por dentro, o que tinha dentro da caixa preta mágica que cuspia imagens dentro de fitas para a tela da televisão (quase sempre acabando por danificar os aparelhos, claro).

Não levou muito tempo para descobrir que todo formato de mídia ou coisa parecida que eu abria no computador era gerado por um programa correspondente: as apresentações de powerpoint que eu recebia eram criadas no powerpoint; os vídeos engraçados que eu assistia eram editados no movie maker (ou programa do gênero); os joguinhos flash que eu jogava eram feitos no flash. Em cada uma dessas descobertas, eu ia me aventurando nos programas criadores, tentando satisfazer minha vontade de criação: já me diverti muito criando apresentações do powerpoint e até já fiz um jogo nele; já brinquei muito editando vídeos; já fiz algumas coisinhas no flash de resultado questionável, mas que me deram muita satisfação no processo de criação.

Mas daí surge uma pergunta: se o programa que cria apresentações é o powerpoint, o programa que cria vídeos é o movie maker e o programa que cria jogos flash é o flash, qual é o programa que cria programas?

Foi aí que o mundo da programação começou a se mostrar para mim.

Eu lembro muito claramente de ter aberto o google (ou o “cadê?”, não lembro se ele já tinha saído de moda) e pesquisado por “programa de criar programa”. Abri alguns resultados que falavam de programação, mas infelizmente eu não entendi nada, pois nada que fala de programação na internet é acessível para leigos — o que não mudou até hoje.

Linguagens que dizem programas

Uma linguagem de programação é uma linguagem artificial, construída com o propósito explícito de especificar programas. O código de um programa é nada mais que um texto normal como este que você está lendo, só que escrito em uma linguagem de programação (e não em português), e ele especifica o comportamento do programa: qual é o formato dos dados com que esse programa vai trabalhar, o que vai ser mostrado na tela, o que acontece quando um botão é clicado, etc..

Por exemplo, o código a seguir especifica um programa que mostra a soma de dois números dados pelo usuário e é escrito em uma linguagem chamada Lua:

primeiro_numero = tonumber(io.read())
segundo_numero = tonumber(io.read())

print(primeiro_numero + segundo_numero)

Entendeu?

Não?

Não tem problema. Isso não é um tutorial de programação, eu só queria mostrar a cara de um texto escrito em uma linguagem de programação.

Fora algumas exceções, todo programa de computador que você já usou e vai usar é escrito em alguma linguagem de programação. E, quando eu digo todo, é todo mesmo: o navegador que você está usando para ler este texto, o sistema operacional que está rodando no seu aparelho, a interface gráfica que você usa para operar o seu aparelho, este site, o controlador de seu roteador de internet, sua geladeira (possivelmente), e quase tudo que roda nos pequenos e grandes computadores que nos rodeiam.

Mas dá pra desconfiar não é a mesma linguagem que especifica todos esses programas que eu mencionei, já que eu estou o tempo inteiro falando de linguagens e não da linguagem em que os programas são escritos. Existem várias linguagens de programação diferentes em uso atualmente para várias finalidades diferentes. Cada projeto de software pode usar uma linguagem diferente por causa do que ela oferece.

Para se ter uma ideia da quantidade imensa de linguagens de programação que existem, o índice TIOBE, que classifica linguagens de acordo com sua popularidade, contém 100 linguagens de programação no total e 50 delas têm sua popularidade monitorada de perto. E é importante frisar que qualquer uma dessas linguagens, mesmo as 50 menos populares, é popular o suficiente para ter milhares de resultados no Google e pelo menos um artigo na Wikipédia. Isso é só uma fração de todas as outras linguagens menos populares que existem, como linguagens com um nicho mais restrito, linguagens experimentais, linguagens de “brinquedo” ou linguagens que simplesmente não estão entre as 100 menos populares.

Torre de Babel

Até agora, eu falei de linguagens de programação, e como programas são especificados em código escrito nessas linguagens, mas eu não respondi ainda qual é o programa que faz outros programas. Mais especificamente: como é que o código, esse texto que diz o que deve ser feito, se transforma em algo de fato sendo feito pelo computador?

A resposta, na verdade, são várias. Existem vários jeitos diferentes de concretizar a execução de um código. Por exemplo: um interpretador é um programa que lê um código fonte e o executa imediatamente. Não é gerado nenhum programa nativo, mas um outro ponto de vista é que o código em si é o programa nesse caso, que é executado por meio do interpretador. Já um compilador é um programa que lê um código dado, entende o que está sendo dito, mas, em vez de executar imediatamente o programa especificado, ele gera um programa nativo que pode ser executado diretamente.

Questões como essa, que dizem respeito a como a implementação concreta da linguagem será feita, são um dos vários motivadores para a criação de linguagens diferentes. Nesse caso específico, apesar de, tecnicamente, qualquer linguagem de programação poder ser interpretada ou compilada, na prática, questões de implementação geralmente afetam o projeto da linguagem — isto é, ao projetar uma linguagem, o projetista pode ter em mente uma implementação específica e guiar o seu projeto de acordo. Por exemplo: a linguagem C (lê-se “cê”, o nome da letra) foi uma linguagem feita para ser compilada; já Lua (a linguagem do exemplo que vimos anteriormente) foi pensada como uma linguagem interpretada.

Outros aspectos que podem motivar a escolha de linguagens diferentes incluem:

Existem inúmeros motivos além desses para se escolher uma linguagem em vez de outra, mas acaba caindo quase sempre em alguma questão de: preferência estética pessoal, familiaridade, o que a linguagem oferece, o que o ecossistema oferece e como a implementação se adequa ao problema a ser resolvido.

Alguns exemplos de linguagens

Para ilustrar melhor os aspectos descritos acima, algumas linguagens serão apresentadas a seguir. Sem entrar em muitos detalhes técnicos, pois a ideia é apenas tentar mostrar qual é o nicho que uma linguagem ocupa e quais são suas particularidades.

C (“cê”)

Já citada anteriormente, essa é uma das linguagens mais antigas ainda popular. Surgida nos anos 70 é a linguagem mais popular no índice TIOBE. Duas coisas tornam C marcante: sua simplicidade conceitual e sua capacidade de gerar programas eficientes.

C é uma linguagem simples. Não no sentido de facilidade de uso (como vamos ver adiante), mas no sentido em que existem muito poucos elementos linguísticos na linguagem — mas é possível se fazer tudo com esses poucos elementos. Essa simplicidade traz algumas vantagens. Por exemplo, com poucos elementos, existem menos interações possíveis entre elementos diferentes — portanto, menos chances de alguma interação inesperada entre elementos dar errado. Outra vantagem é que, por existirem menos elementos na linguagem, o programador precisa aprender menos coisas para conseguir programar na linguagem de maneira eficiente.

Relacionada a isso está a eficiência dos programas escritos em C. C é uma linguagem que produz programas tão eficientes que ela é usada como base de comparações de desempenho entre outras linguagens. Pouquíssimas linguagens têm um desempenho comparável ao de C. E ela atinge esse nível de eficiência (TODO)