← Últimos artigos
💻 computer science

A Concern-Centric Empirical Evaluation of Multi-Language Code Smells: An LLM-Assisted Study of JNI Software Evolution

Este artigo apresenta uma avaliação empírica centrada em preocupações de códigos JNI usando análise assistida por LLM de 8.207 commits em 15 projetos de código aberto, revelando que as definições existentes de smells cobrem apenas 36,5% das preocupações de manutenção dos desenvolvedores e propondo três novas definições de smells para abordar as lacunas identificadas.

Autores originais: Md Shahrukh Ansari, Salman Abdul Moiz

Publicado 2026-09-07
📖 5 min de leitura🧠 Leitura aprofundada

Autores originais: Md Shahrukh Ansari, Salman Abdul Moiz

Artigo original sob licença CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/). Esta é uma explicação gerada por IA do artigo abaixo. Não foi escrita nem endossada pelos autores. Para precisão técnica, consulte o artigo original. Ler aviso legal completo

O software moderno muitas vezes parece uma máquina bem lubrificada, mas, por baixo da interface elegante, é frequentemente construído a partir de muitas partes diferentes que falam linguagens distintas. Para tornar um programa rápido, eficiente ou capaz de se comunicar com hardware especializado, os desenvolvedores costumam combinar código escrito em uma linguagem com código escrito em outra. Uma forma comum de fazer isso é através de uma ponte chamada Java Native Interface, que permite que um programa escrito em Java alcance e utilize ferramentas poderosas escritas em C ou C++. Embora essa mistura de linguagens confira grande poder ao software, ela também cria um tipo único de desordem. Assim como um tradutor pode ter dificuldade em manter consistentes dois dialetos diferentes, o software pode desenvolver falhas ocultas onde as duas linguagens falham em concordar sobre como compartilhar dados, gerenciar memória ou lidar com erros. Essas falhas, conhecidas na indústria como "code smells" (maus cheiros de código), não são bugs que derrubam o programa imediatamente, mas sim escolhas de design que tornam o software difícil de consertar, atualizar ou compreender ao longo do tempo. Durante anos, especialistas tentaram catalogar esses cheiros, criando listas do que constitui um mau design entre linguagens. Mas uma questão crítica permanecia sem resposta: essas listas realmente correspondem aos problemas reais que os desenvolvedores enfrentam todos os dias quando tentam manter esses sistemas complexos funcionando?

Uma equipe de pesquisadores partiu para responder a essa pergunta observando diretamente a história de como o software muda ao longo do tempo, em vez de apenas encarar o código em si. Eles focaram em quinze projetos de código aberto populares que dependem fortemente dessa ponte entre Java e C. Em vez de adivinhar o que poderia estar errado, eles examinaram milhares de atualizações, ou "commits", que os desenvolvedores fizeram nesses projetos ao longo dos anos. Eles procuravam por momentos em que um desenvolvedor teve que parar para corrigir um problema específico de manutenção relacionado à conexão entre as duas linguagens. Para lidar com o enorme volume de dados, utilizaram uma ferramenta de inteligência artificial avançada para ler as mudanças no código e as notas que os desenvolvedores escreveram sobre elas. A IA atuou como um assistente altamente qualificado, examinando as modificações para identificar o problema específico que um desenvolved um estava tentando resolver, como corrigir um vazamento de memória, assegurar uma transferência de dados ou reorganizar a forma como duas partes do sistema se comunicam. Os pesquisadores então verificaram manualmente uma amostra dessas descobertas para garantir que a IA estava correta, confirmando que o método era confiável.

O estudo revelou um quadro claro do que os desenvolvedores realmente enfrentam. Eles identificaram onze famílias distintas de problemas que ocorrem repetidamente. Os problemas mais comuns envolveram manter a fronteira entre as duas linguagens segura e garantir que os recursos, como memória ou manipuladores de arquivos, fossem devidamente limpos após o uso. Essas duas categorias, sozinhas, representaram quase sessenta por cento de todo o trabalho de manutenção encontrado pelos pesquisadores. Isso sugere que o trabalho diário mais urgente para esses desenvolvedores é simplesmente evitar que a conexão entre as linguagens quebre ou apresente vazamentos. No entanto, quando os pesquisadores compararam esses problemas do mundo real com as listas existentes de conhecidos "code smells", descobriram uma lacuna significativa. Os catálogos atuais, que foram criados em grande parte por especialistas baseados em princípios teóricos de design, cobriam apenas cerca de trinta e seis por cento dos problemas reais que os desenvolvedores estavam corrigindo. Em outras palavras, as listas existentes ignoravam a maior parte do trabalho que os desenvolvedores realizavam para manter seu software saudável.

Os pesquisadores perceberam que os problemas ausentes não eram erros aleatórios, mas padrões recorrentes que mereciam seus próprios nomes. Eles descobriram que os desenvolvedores frequentemente precisavam fazer mudanças coordenadas tanto no código Java quanto no código C sempre que um único detalhe mudava, uma situação que tornava as atualizações lentas e propensas a erros. Eles também viram casos em que o software expunha detalhes internos ocultos através da barreira de linguagem, enfraquecendo a segurança e a organização do sistema. Por fim, notaram que as responsabilidades eram frequentemente atribuídas à linguagem errada, forçando um lado do sistema a constantemente pedir ao outro lado para realizar seu trabalho, o que criava uma complexidade desnecessária. Com base nessas observações repetidas, a equipe propôs três novas definições de code smells que abordam especificamente essas questões entre linguagens. Eles as nomearam como Cross-Language Shotgun Surgery (Cirurgia de Metralhadora entre Linguagens), descrevendo a necessidade de alterar muitos arquivos de uma só vez; Cross-Language Abstraction Leakage (Vazamento de Abstração entre Linguagens), onde detalhes ocultos são acidentalmente expostos; e Wrong Responsibility Allocation (Alocação de Responsabilidade Errada), onde tarefas são atribuídas à camada de linguagem incorreta.

Este trabalho desloca o foco do que os especialistas pensam que deve ser um problema para o que os desenvolvedores estão realmente corrigindo. Ao ouvir a própria história do software, os pesquisadores mostraram que a compreensão atual sobre falhas de design multilingue é incompleta. As listas existentes são boas em capturar erros simples e locais, mas perdem os desafios arquiteturais mais profundos que surgem quando dois mundos diferentes de código tentam trabalhar juntos. As novas definições fornecem um vocabulário para essas lutas ocultas, oferecendo uma maneira para os desenvolvedores detectarem e corrigirem esses tipos específicos de desordem antes que se tornem ingovernáveis. O estudo conclui que, para compreender verdadeiramente a qualidade do software, devemos olhar não apenas para o código estático, mas para a longa e complexa história de como esse código é mantido vivo e em evolução.

Afogado em artigos na sua área?

Receba digests diários dos artigos mais recentes que correspondam às suas palavras-chave de pesquisa — com resumos técnicos, no seu idioma.

Experimentar Digest →