Evolução das Linguagens de Programação Por Ronaldo Melo Ferraz http://logbr.reflectivesurface.com/2003/03/26/evolucao-das-linguagens-de-programacao/ Linguagens de programação, pela sua própria natureza, são criadas e mudam muito rapidamente. Cada nicho, necessidade e mercado criam oportunidades para o desenvolvimento de novas formas. Um documento escrito no começo de 1995 listava a existência de 2350 diferentes linguagens. Mesmo com essa abundância de linguagens, a sobreposição dos conceitos comuns é muito grande. Se observamos a criação de linguagens nos últimos dez anos, é fácil perceber que há pouquíssima evolução em termos de estruturas e conceitos. Perl, Python, PHP, Java, C, C++, C# e Delphi apresentam diferenças mínimas entre si. E, na maioria das vezes, essas diferenças não passam de um “açúcar sintático” que simplesmente mudam a maneira de escrever determinadas construções, sem alterar a semântica das mesmas. Pelas listas mencionadas anteriormente, pode-se também perceber que muitas linguagens não passam de pequenas ligeiras variações de uma linguagem base. Para esclarecer, a palavra evolução aqui está sendo usada para denotar reais mudanças de conceitos em oposição às mudanças que ocorrem devido à escolha de características para uma linguagem em função de necessidades e/ou gostos pessoais. Embora as linguagens citas acima sejam todas imperativas, o mesmo padrão é repetido em outras classes de linguagens. Por exemplo, a maioria das linguagens funcionais não ultrapassam muito dos paradigmas vistos em LISP. Para compensar essa homogeneidade, o foco de desenvolvimento parece ter mudado atualmente para a criação de metodologias que empregam melhor as linguagens já existentes. Extreme Programming e UML são exemplos dessa tendência. São técnicas que se encaixam em praticamente qualquer tipo de linguagem de programação, mas não alteram fundamentalmente as mesmas. Um outro foco é a criação de grandes bibliotecas que cercam, muitas vezes de maneira inferior, as limitações de algumas linguagens. Uma exceção ao padrão acima é a lenta adoção de conceitos com programação orientada a aspectos, design por contrato e genéricos. Embora esses conceitos não seja novos, a implementação dos mesmos ainda é relativamente rara. Certas linguagens — como Smalltalk, por exemplo — apresentam alguns desses conceitos de maneira natural, mas a vasta maioria das outras linguagens permanece estacionada em locais próximos às suas origens. Um exemplo é o Delphi, uma variante do Object Pascal, usada na ferramenta homônima da Borland. Depois de tornar-se uma linguagem orientada a objetos — o que aconteceu por volta de 1989 — pouca coisa nova foi acrescentada à mesma. Outras linguagens, como Beta, estão realmente procurando criar novos paradigmas, mas em geral permanecem no domínio acadêmico e têm pouco foco comercial. É interessante notar que algumas das linguagens mais usadas no mundo saíram de sua infância procedural há relativamente pouco tempo. PHP é um exemplo desse tipo de linguagem. Outras, embora já tendo nascido orientadas a objetos, não acrescentaram nenhuma novidade ao conceito. Neste caso, Python e Java seria exemplos típicos. Isso quer dizer que muitas linguagens estão repetindo um ciclo evolutivo que já é antigo. Apesar de todos esses fatos, um questionamento pode ser feito: até que ponto a evolução das linguagens é necessária para determinados tipos de tarefa? Smalltalk, por exemplo, permanece significativamente inalterada por décadas e mesmo assim se mostra incrivelmente capaz de se adaptar às novas realidades da programação. De maneira similar, LISP é capaz de dobrar-se às mais diversas tarefas sem mudanças significativas no núcleo da linguagem. É um fato interessante notar que ambas a linguagens são consideradas como segredos bem-guardados por algumas empresas que se utilizam da produtividamente das mesmas para manter vantagens competitivas. Estaria o futuro da programação em um forte retorno comercial dessas linguagens? Smalltalk e LISP possuem uma característica em comum que pode explicar o fato de ambas permanecerem atuais: a simplicidade. Smalltalk conta com apenas cinco palavras-chave e umas poucas regras sintáticas para expressar suas construções. Ainda assim, o número de linhas requerido para implementar uma determinada tarefa em Smalltalk é patentemente menor do que na maioria das outras linguagens imperativas. LISP segue o mesmo padrão. As expressões que constituem o cerne da linguagem permitem uma flexibilidade enorme na programação e são capazes de representar praticamente qualquer construção requerida. Essa flexibilidade confere a LISP a mesma capacidade de implementar uma tarefa em menor quantidade de linhas e tempo mostrada por Smalltalk. O fato de ambas usam o conceito de uma imagem que contém o ambiente de desenvolvimento dinamicamente também contribui enormemente para a eficiência das mesmas Embora restrita, uma a evolução tendência das atual linguagens pode ter permaneça um impacto aparentemente positivo no desenvolvimento e aperfeiçoamento dos conceitos de programação. Essa tendência é a adoção em maior escala de máquina virtuais. A era da ineficiência ficou para trás e as novas máquina virtuais, que combinam compilação e interpretação para aproveitar eficientemente os recursos da máquina, apresentam excelente desempenho e fornecem um bom campo para a experimentação e uso de conceitos que não ficam restritos aos tradicionais ambientes profundamente ligados às suas origens de baixo nível. É notório também o fato de que tanto Smalltalk quanto LISP são normalmente implementadas usando máquina virtuais. Algumas linguagens modernas têm procurado ganhar a mesma flexibilidade introduzindo novas palavras-chave às custas de uma aumento na complexidade geral das mesmas. Um outro conceito que também vem ganhando força nos últimos anos é o de tipos dinâmicos, determinados em tempo de execução, versus o conceito de tipos estáticos, determinados em tempo de compilação. Muitas das linguagens atuais (PHP, Python, Perl) optaram por tipos dinâmicos para ganhar flexibidade e produtividade. É curioso que Java e C#, linguagens criadas apenas com preocupações mercadológicas, usem tipos estáticos e apresentem vários recursos para “violar” esses conceitos em virtude de falhas óbvias (boxing é um desses recursos, que procura remediar o fato de que nem todos os valores nessas linguagens são objetos). Mais uma vez podemos observar que tanto Smalltalk quanto LISP estavam à frente de seu tempo nesse aspecto. Assim, qual será o caminho evolucionário que as nova linguagens seguirão? Obviamente, as necessidades atuais em termos de programação não permanecerão constantes. Será que os modelos procedurais e/ou orientados a objeto, tais como existem hoje serão capazes de atender a essas necessidades? Será que linguagens como Smalltalk e LISP, que provaram-se resistentes à passagem do tempo, serão capazes de se manter atuais sem mudanças significativas em sua sintaxe e semântica? Quais serão os grandes temas futuros das linguagens de programação? Essas são perguntas que não sei nem por onde começar a responder, mas que acredito serem cruciais para o futuro do desenvolvimento de aplicações.