Poder e flexibilidade
Por Rodrigo StraussEra uma vez
Programei durante muito tempo em Visual Basic 3/4/5/6. Quase uma década para dizer a verdade. Depois de todo esse tempo, finalmente chegou aquele fatídico dia em que eu achei que o Visual Basic não me era mais suficiente. Eu já tinha lido o clássico livro do Appleman sobre Win32 API e Visual Basic, mas usar API no VB não é nada confortável. Recorrer ao "Api Text Viewer" o tempo todo para gerar os famosos Declares das funções já estava ficando cansativo. Isso tudo na mesma época em que eu peguei emprestado dois livros de programação Win32 (esse e esse, eu estava em boas mãos) voltados para linguagem C. Era tudo que eu precisava para começar a estudar Visual C++.
Programar em C me deu uma visão muito mais ampla das possibilidades de desenvolvimento de software. Usando C na plataforma Windows você tem acesso completo ao sistema, consegue fazer qualquer coisa. Afinal, o próprio Windows é feito em C (assim como o Linux e a grande maioria dos sistemas operacionais). Desse dia em diante tudo mudou. Comecei a me sentir poderoso, afinal, eu programava na mesma linguagem que os caras que fizeram o Windows. Do que me servia aquele desprezível Visual Basic (leia até o final antes de me odiar)? Afinal, além de 99,99% dos aplicativos comerciais serem feitos em C/C++ (Office, CorelDRAW, Photoshop, o próprio VB, o que você pensar é feito em C ou C++), VB não tem pré processador, não tem herança múltipla, inline assembly, STL, ATL, WTL, templates, metaprogramação, não faz drivers etc, etc. Eu não precisava mais do VB, eu tinha uma linguagem flexível e poderosa onde eu conseguia fazer qualquer coisa. Mas o poder e a flexibilidade sempre têm um preço: tempo.
Existe uma linguagem certa para cada tarefa
Nenhuma linguagem de programação é simplesmente melhor ou pior. As linguagens podem ser melhores ou piores para uma determinada tarefa, mas não existe nenhuma linguagem perfeita. Acha realmente que sua linguagem é a melhor do mundo? Então quer dizer que você conhece todas as linguagens e consegue explicar porque a sua é melhor que todas elas?
Em Assembly você consegue fazer qualquer coisa, mas pode demorar muuuuito tempo. Produtividade também é um recurso importante de uma linguagem, principalmente nos dias de hoje. A Microsoft fala insistentemente que uma das grandes vantagens do .NET é o aumento na produtividade do programador. Quanto menos tempo o programador precisar se envolver com detalhes de baixo nível, mais tempo ele terá para focar-se no problema que está resolvendo. Ao invés dele se preocupar se a função coloca o retorno no registrador EAX ou no EBX, ele usará esse tempo para criar mais uma tabela no SQL Server ou fazer mais uma reunião... :-)
De alguns anos para cá, a área de desenvolvimento de software tem passado por uma grande evolução. Desde os anos do GW-BASIC (minha primeira linguagem) até o C# e as managed runtimes, muita coisa mudou. Eu sei que ainda existem pessoas que continuam usando ferramentas de 10 anos atrás, como Clipper, mas isso já é outra história. A realidade é que hoje existem milhares de opções para desenvolver um software. Java, PowerBuilder, C++, PHP, Visual Basic, Delphi, Perl, Ruby, .NET, isso sem falar nas bibliotecas de cada linguagem. A quantidade é imensa.
Considerando a ordem cronológica da evolução das linguagens mais utilizadas, teremos resumidamente: Assembly, C, C++, VB/Delphi, Java/C#. A idéia que nos vem a cabeça vendo essa evolução é de que, a medida que o tempo passa, escrever software comum vem ficando cada vez mais fácil, cada vez mais rápido. Já pensou desenvolver aquele sisteminha de cadastro de clientes que você fez em Visual Basic usando Assembly? Isso levaria o triplo do tempo e tornaria a manutenção do programa bem mais difícil.
Agora vamos vamos mudar o foco: digamos que você é um programador da HP, e seu gerente acha que a BIOS (que está longe de ser um programinha) do seu fornecedor não resolve todos os seus problemas. Assim, você foi o felizardo escolhido para desenvolver a nova BIOS dos micros HP, onde a inicialização do micro será bem mais rápida e será exibido um logotipo da HP de altíssima resolução toda vez que o computador for inicializado. BIOS quer dizer Basic Input and Output System, que é basicamente o software que controla o seu computador ANTES que o sistema operacional seja carregado.
Aí você pensa: “Isso vai ser fácil. Eu gravo o logotipo da HP em um GIF e uso GDI+ para mostrar isso”. Como assim GDI+? Durante a inicialização do computador, não existe Windows, não existe sistema operacional. Nada de GDI, nada de runtime, nada de API. Nessa fase, é só você e o processador, mais ninguém. E quando você chega nesse ponto, só existe um meio: Assembly. Onde está seu .NET agora?
Tem para todos os gostos
Você já ouviu falar da linguagem OCaml? Provavelmente não. Existe um campeonato internacional de programação, o ICFP Programming Contest, que todo ano propõe um problema, que pode ser resolvido usando qualquer linguagem de programação. Todos os anos, entre os vencedores, estão as equipes que usaram C e OCaml . É perfeitamente compreensível que a linguagem C esteja entre os vencedores, já que é a linguagem mais usada. Mas eu nunca conheci uma empresa que desenvolvesse alguma coisa usando OCaml. Sinceramente eu nem sei como pronunciar isso, e nunca tinho ouvido falar nessa linguagem até ver uma página desse concurso que diz que OCaml é uma das melhores linguagens para desenvolvimento e prototipagem rápida.
Linguagens novas nascem a cada ano. Se você montar uma lista com todas as linguagens de programação que existem , acho que você vai receber um e-mail do seu chefe sobre gasto excessivo de folhas de sulfite. Existem centenas delas, algumas mais antigas, algumas mais novas, mas elas nunca param de nascer.
Você acha que a linguagem C deveria ser orientada a objeto? Crie o C++. Acha que o conceito de ponteiro é muito complicado para um programador mundano? Cansado de se preocupar com o gerenciamento de memória? Invente o Java. Sua linguagem tem garbage collector , mas não suporta overload (sobrecarga) de operadores nem ponteiros de função (delegates)? Crie o C#. Acha que o C++ deveria ter garbage collector? Crie a linguagem D. Você também acha que essa história de tirar herança múltipla na linguagem D foi uma péssima idéia? Crie sua própria linguagem.
Gosto não se discute
Uma coisa muito interessante que acontece quando uma pessoa vê uma linguagem pela primeira vez, é o amor ou ódio à primeira vista quanto à sintaxe. Eu sou um programador C++. Então eu acho muito melhor a sintaxe do PHP do que a do Ruby já que o PHP é muito mais parecido com C++. Dizem que Ruby, Tcl e Lua são linguagens de script muito interessantes, mas a sintaxe simplesmente não me agrada. Essas novas linguagens são ótimas, principalmente para manipulação de listas e outras coisas do dia a dia. Ao invés de serem genéricas, como o C, elas foram criadas para resolver um problema específico e têm um escopo mais reduzido. Se uma linguagem for criada especialmente para manipular XML, muito provavelmente ela será melhor nessa tarefa do que as outras.
Acho a proposta dessas linguagens muito boa, mas uma coisa me deixa incomodado: a falta do colchete e outras características que eu estou acostumado. Isso tem explicação? Vamos ver alguns exemplos de códigos retirados de uma página com exemplos em diversas linguagens:
Ruby (cálculo do PI)k, a, b, a1, b1 = 2, 4, 1, 12, 4 while TRUE # Next approximation p, q, k = k*k, 2*k+1, k+1 a, b, a1, b1 = a1, b1, p*a+q*a1, p*b+q*b1 # Print common digits d = a / b d1 = a1 / b1 while d == d1 print d $stdout.flush a, a1 = 10*(a%b), 10*(a1%b1) d, d1 = a/b, a1/b1 end end
def quicksort(arr):
if len(arr) <= 1: return arr
m = arr[0]
return quicksort(filter(lambda i,j=m: i<j, arr)) + \
filter(lambda i,j=m: i==j, arr) + \
quicksort(filter(lambda i,j=m: i>j, arr))
print quicksort([5,99,2,45,12,234,29,0])
(defun fact (n)
(loop for i from 2 to n
for fact = 1 then (* fact i)
finally (return fact)))
(format t "Factorial of 6 is: ~A~%" (fact 6))
IDENTIFICATION DIVISION. PROGRAM-ID. HelloWorld. AUTHOR. Joselito, o sem noção. ENVIRONMENT DIVISION. CONFIGURATION SECTION. INPUT-OUTPUT SECTION. DATA DIVISION. FILE SECTION. WORKING-STORAGE SECTION. LINKAGE SECTION. PROCEDURE DIVISION. DISPLAY "Hello World". STOP RUN
Eu consigo entender os algoritmos, e vejo características bem interessantes nas linguagens. A atribuição de variáveis do Ruby é bem interessante. A forma de definir uma lista inline na chamada da função quicksort no Python também é muito boa. Bom, acho que se eu programasse em Lisp a tecla de parênteses do meu teclado iria ficar apagada em uma semana, e o programa em Cobol eu prefiro não comentar. Mas alguma coisa está errada, alguma coisa me dá agonia: onde estão os colchetes??? Por que a palavra "def" ou "defun" para definir uma função??? Socorro!!! São coisas simples que, aparentemente não seriam um problema para estudar a linguagem. Mas são. Você já deixou de ir a um lugar simplesmente por que não foi com a cara dele? É exatamente a mesma coisa, só que no caso de linguagens é um pouco pior.
Mas existe uma coisa que ajuda a tirar a má impressão sobre a sintaxe de uma linguagem: a necessidade. Eu não gosto de programar em T-SQL, mas eu tenho que fazer isso de vez em quando. A sintaxe do T-SQL está bem longe do que eu acho ideal, mas eu não tenho outra opção. Hoje em dia eu ainda não gostou muito defazer isso, mas não tenho mais o mesmo estranhamento quanto a sintaxe. E mesmo se eu ainda tivesse, acho que isso não é uma desculpa suficiente boa para dispensar um projeto...
Futebol, política, religião e... linguagem de programação
Linguagem de programação é um assunto tão delicado quanto o seu time do coração ou sua religião. Cada pessoa tem um argumento que segundo ela, é infalível para defender os recursos e as limitações da sua linguagem. Não importa, a linguagem que você gosta e está acostumado é sempre a melhor para resolver seus problemas, mas não necessariamente os problemas dos outros. Lembre-se: por mais que você tenha trabalhado em 100 empresas nos últimos 10 anos, você nunca conhece o suficiente e nunca conhece o mercado inteiro.
Existem empresas que fazem software para resolver os mais diversos problemas, e para cada um deles existe uma linguagem ou uma ferramenta que é mais adequada. E se o problema dessa empresa não é resolvido por nenhuma linguagem ou ferramente existente, com certeza essa empresa tem recursos para criar alguma coisa que resolva esse problema (VBScript rodando em Z80?).
Redenção
A medida que o tempo passava, percebi que algumas coisas que existem no VB não são encontradas em C/C++. É muito mais simples manipular strings no VB, já que no C não existe string no sentido literal da palavra. É mais fácil desenvolver em VB. É muito mais fácil fazer com que uma pessoa se interesse por programação mostrando como ela faz aparecer um MessageBox ao clicar em um botão. Muito mais fácil do que tentar explicar o que é um ponteiro e para que ele serve.
O VB6 tem um recurso maravilhoso que não existe em nenhuma outra linguagem ou ferramenta que eu conheça: seu programa é interpretado durante o debug e compilado para distribuição. Isso facilita muito as coisas. Você pode mudar o ponteiro de função (arrastando a famosa seta amarela) para o início da função e reescrever seu código sem reiniciar o programa. Quando você quer fazer um programinha para resolver um problema pequeno (Como formatar um arquivo texto), é muito mais fácil ir modificando o programa enquanto você faz o debug até que o resultado seja o que você quer. Nada de compilações demoradas, nada de salvar o script e rodar de novo, nada de reiniciar o seu programa. Isso é o que eu chamo de Live Programming, programe enquanto o seu código está rodando.
Sim, é claro que você consegue fazer Live Programming em C/C++ usando um debugger de gente grande (WinDbg, SoftIce): Aloque uma quantidade razoável de memória no seu programa, escreva código assembly nessa memória alocada e mova o ponteiro de instrução do processador (registrador IP) para essa memória. Facinho, né? Já fiz algo assim programando drivers, mas isso está longe de ser uma coisa comum.
End Sub
E não esqueça: nada é definitivo. Meu desprezo pelo VB não foi e suas escolhas também não serão. A sua linguagem preferida hoje, pode estar ultrapassada daqui uns anos e você será obrigado a mudar, ou escolher continuar vivendo no passado até o fim da sua vida. Além do fator "tecnologia expirada", sua linguagem será a preferida até que você tenha um problema que ela não resolva. Desse dia em diante, você corre o sério risco de, procurando uma linguagem que resolva o seu problema, encontrar uma linguagem que será sua nova preferida e definitiva.




