Comparação de Design de Linguagens em Ambientes de Geração de Código por LLMs: Custo de Abstração e Explicitude do Go

Linguagens Modernas
Linguagens modernas são aquelas que oferecem, em comparação com as linguagens de gerações anteriores, maior produtividade, estabilidade, segurança e manutenibilidade. Essas linguagens incorporam ativamente técnicas e conceitos recentes e proporcionam aos desenvolvedores ferramentas de desenvolvimento mais eficientes e seguras. Entre as linguagens modernas representativas estão Java, Rust, Python e TypeScript, entre outras, e elas apresentam as seguintes características.
1. Design Orientado a Objetos ( OOP )
As linguagens modernas são, em sua maioria, projetadas com base em conceitos de orientação a objetos. A orientação a objetos suporta princípios como encapsulamento, herança e polimorfismo e, ao dividir sistemas complexos em objetos de pequena unidade para gerenciá-los, torna a estrutura do programa clara e flexível. Isso é especialmente eficaz em grandes projetos de software, pois permite controlar os custos e o esforço de desenvolvimento e reduz os problemas que podem surgir durante a manutenção.
2. Açúcar Sintático e Expressões
As linguagens modernas oferecem diversos açúcares sintáticos e uma gramática baseada em expressões, com o objetivo de aumentar a legibilidade do código e a produtividade do desenvolvimento. Recursos como o operador ternário, expressões lambda e pattern matching reduzem o código repetitivo (boilerplate), tornam o código previsível e aumentam a produtividade do desenvolvedor.
3. Sistema de Módulos
As linguagens modernas, por meio de sistemas de módulos, permitem separar um programa em múltiplas unidades para gerenciá-lo. Isso facilita a reutilização de código e o gerenciamento de dependências e torna a manutenção mais simples mesmo quando o tamanho do projeto cresce. Exemplos representativos incluem Maven/Gradle em Java, Cargo em Rust e npm/yarn em TypeScript.
4. Linguagem Intermediária e Máquinas Virtuais
As linguagens modernas adotam linguagens intermediárias e máquinas virtuais para alcançar independência de plataforma, otimização de desempenho e segurança. Exemplos representativos incluem JVM, LLVM, WASM e GraalVM.
Desenvolvimento na Era da IA e as Limitações das Linguagens Modernas
As linguagens modernas surgiram sob a premissa de que pessoas escrevem a maior parte do código. Naturalmente, o objetivo dessas linguagens é reduzir o trabalho repetitivo, aumentar a produtividade e, por meio de estruturas que permitem a colaboração entre desenvolvedores, implementar com eficácia software de grande porte. No entanto, na era da IA, essa premissa vem gradualmente desmoronando. Ferramentas baseadas em IA, como Copilot e Cody, automatizam grande parte da escrita de código, e a quantidade de código que um único desenvolvedor pode produzir vem aumentando de forma expressiva. Com isso, características das linguagens modernas que antes eram percebidas como vantagens estão se transformando, aos poucos, em desvantagens ultrapassadas.
Design Orientado a Objetos
A IA consegue analisar de forma rápida e precisa uma estrutura em que todas as informações estão explicitadas em uma única função ou módulo. Em contrapartida, à medida que o contexto aumenta, o número de trechos a inferir cresce, e por isso a produtividade e a precisão da IA diminuem. Código escrito em OOP tende a distribuir a lógica entre vários objetos, em vez de gerenciá-la em um único local, o que, como consequência, exige mais contexto da IA. Observe o código abaixo.
1public class AnimalHandler {
2 public void handle(Animal animal) {
3 animal.speak();
4 }
5}
6
7public class Main {
8 public static void main(String[] args) {
9 AnimalHandler handler = new AnimalHandler();
10
11 Animal a1 = new Dog();
12 Animal a2 = new Cat();
13 Animal a3 = new Horse();
14
15 handler.handle(a1);
16 handler.handle(a2);
17 handler.handle(a3);
18 }
19}
No código acima, para saber efetivamente qual comportamento o método speak() executará, a IA precisa repetir o seguinte raciocínio:
- Qual é a classe concreta da qual animal é instância?
- Onde está definido o método speak() sobrescrito nessa classe?
- Onde estão as definições das classes Dog e Cat e qual é o comportamento interno delas?
- Existe a possibilidade de as classes Dog e Cat serem sobrescritas em outras classes?
Essas informações não estão reunidas em um único arquivo ou função, sendo necessário seguir as relações entre os arquivos de classe e a estrutura de herança para compreendê-las. Além disso, elementos determinados em tempo de execução, como reflexão ou carregamento dinâmico, funcionam como caixas-pretas do ponto de vista da IA e, na prática, tornam a análise impossível.
Açúcar Sintático e Expressões
A IA prefere comportamentos explícitos a comportamentos implícitos e, em vez de recorrer a estruturas complexas, prefere combinar estruturas simples para chegar a uma única resposta correta. Em contraste, o açúcar sintático permite diversas formas de expressão, mas seu comportamento interno é, em muitos casos, idêntico ou semelhante. A IA precisa aprender individualmente o significado dessas múltiplas expressões e pode ter dificuldade para determinar a prioridade sobre qual sintaxe recomendar em cada situação específica.
Linguagem Intermediária e Máquinas Virtuais
A IA aprende, em sua maioria, a partir do código-fonte. Já a linguagem intermediária (bytecode) remove, durante o processo de compilação, significados como nomes de variáveis, e precisa ser reinterpretada pela máquina virtual em tempo de execução. Essa é uma tarefa extremamente difícil de compreender ou converter para a IA. Por exemplo, para a IA, a conversão de TypeScript para Go é possível, mas converter o bytecode da V8 engine para bytecode da JVM ou para código de máquina é praticamente impossível.
A Verdadeira Linguagem Moderna para a Era da IA
Com base no que foi exposto, percebe-se que as características das linguagens modernas são, na realidade, elementos ultrapassados e inadequados para a era da IA. Então, qual linguagem poderia ser a mais adequada como linguagem moderna para a era da IA? Essa resposta pode ser inferida a partir dos elementos que as linguagens modernas anteriores rejeitaram. Uma linguagem moderna para a era da IA deve:
- Possuir uma sintaxe explícita e um fluxo natural.
- Afastar-se do OOP excessivo e apresentar uma estrutura plana e simples.
- Em vez de açúcar sintático desnecessário ou padrões implícitos, construir múltiplas funcionalidades com um conjunto limitado de palavras-chave básicas.
- Adotar um sistema de build simples e previsível, e não um sistema de build complexo.
A linguagem que mais se alinha a esses critérios é o Golang. A linguagem Go foi projetada para implementar a maior parte das funcionalidades práticas apenas com um pequeno número de palavras-chave centrais e uma combinação simples de sintaxe, eliminando rigorosamente abstrações desnecessárias e comportamentos implícitos. Isso é vantajoso tanto para os desenvolvedores quanto para a IA na interpretação e geração de código.
Assim, as características da linguagem Go, que busca uma estrutura previsível e plana, um fluxo explícito e uma sintaxe consistente, adequam-se melhor a ambientes de desenvolvimento em que a IA participa ativamente, diferentemente das linguagens modernas existentes, projetadas com foco no ser humano. A filosofia de design conservadora do Go, que outrora foi considerada ultrapassada, torna-se, na verdade, a escolha mais avançada para a era da IA.