Uma maneira mais fácil de eliminar bugs de linguagens de programação

O D2X é uma infraestrutura de depuração de linguagem específica de domínio que funciona com a maioria dos depuradores padrão sem nenhuma modificação e é facilmente extensível para capturar todas as informações específicas de domínio com as quais o usuário final se preocupa.

Créditos:Imagem: Alex Shipps/MIT CSAIL via Midjourney


#Programação 

Desenvolvido no MIT, o D2X é uma nova ferramenta que facilita a depuração de qualquer linguagem de programação específica de domínio.

Em algum momento de 2019, o estudante de doutorado do MIT Ajay Brahmakshatriya formulou uma meta simples, embora ainda bastante desafiadora. Ele queria possibilitar que pessoas com experiência em um domínio específico – como modelagem climática, bioinformática ou arquitetura – escrevessem suas próprias linguagens de programação, as chamadas linguagens específicas de domínio (ou DSLs), mesmo que tivessem pouco conhecimento. ou nenhuma experiência na criação de linguagens de programação. Membro do grupo de pesquisa liderado pelo professor do MIT Saman Amarasinghe no Instituto de Ciência da Computação e Laboratório de Inteligência Artificial (CSAIL), Brahmakshatriya queria que essas linguagens viessem com todas as funções auxiliares que as pessoas precisariam para utilizá-las confortavelmente, incluindo ferramentas para depuração. Esse processo para se livrar de erros em um software é essencial, ele e Amarasinghe concordaram, já que chamaram a falta de suporte de depuração de “o calcanhar de Aquiles para DSLs”.

Foram alguns anos produtivos para os dois. Em 2021, Brahmakshatriya e Amarasinghe apresentaram o BuildIt, um pacote de software que simplifica muito a tarefa de criar DSLs. E no mês passado, em uma conferência internacional em Montreal co-patrocinada pela Association for Computing Machinery, a dupla apresentou o D2X, uma ferramenta que facilita a adição de depuração a qualquer DSL e demonstrou funcionar particularmente bem com o BuildIt. Seu artigo sobre o trabalho até ganhou um dos dois Distinguished Paper Awards concedidos na conferência.

A principal razão para produzir uma linguagem em um domínio especializado, explica Brahmakshatriya, “é promover a facilidade de uso”. Uma DSL de processamento de imagem, por exemplo, poderia ter uma função que diz “desfocar a imagem inteira”. Emitir o mesmo comando em uma linguagem de uso geral exigiria muito mais linhas de código, observa Brahmakshatriya. “Isso é parte do motivo para usar uma DSL. O outro é o desempenho.” Como as operações são específicas desse domínio, elas podem ser otimizadas com mais facilidade – executadas na ordem correta e, portanto, concluídas com mais eficiência e rapidez.

Brahmakshatriya descreve o BuildIt como “uma DSL para criar DSLs”. Ele facilita um procedimento de várias etapas para pegar uma linguagem de programação multifuncional existente e reduzi-la até que ela se torne especializada da maneira certa. “Suponha que você tenha um problema e queira escrever um programa para resolvê-lo”, diz ele. “Você pode escrever um programa para resolvê-lo em sua totalidade ou pode escrever um programa menor para resolver apenas a subclasse do problema em que está interessado. Quanto mais especializado você torna o programa, mais rápido ele é executado.” O BuildIt foi projetado para construir DSLs com esses princípios orientadores em mente.

Halide – uma linguagem de processamento de imagem inventada em 2012, anos antes do BuildIt – é uma das primeiras DSLs a sair do grupo de Amarasinghe. Seu desenvolvimento foi liderado pelo então estudante de pós-graduação Jonathan-Ragan Kelley e Andrew Adams, um pós-doutorando do CSAIL na época. “O Halide é muito popular agora e é usado em muitos aplicativos da Adobe, incluindo o Photoshop, mas ainda não possui um depurador”, diz Amarasinghe. A razão para isso, acrescenta, “é que os depuradores são muito complicados. É muito difícil escrevê-los, e é por isso que a maioria das pequenas DSLs não tem suporte para depuração.”

Essa não é uma situação desejável, de acordo com Brahmakshatriya, que insiste que cada DSL deve ter seu próprio depurador. “Você não pode usar diretamente os depuradores existentes para seu novo idioma porque eles não entendem o domínio.” Além disso, é impossível escrever um programa que esteja completamente correto na primeira vez, diz ele. “Você sempre começa com algo que contém erros, embora eles geralmente não apareçam até muito mais tarde no ciclo de desenvolvimento. Se um bug surgir nesse ponto, quando você tiver 5.000 linhas de código, pode ser muito difícil encontrá-lo.” Conseqüentemente, uma vez que um programa é “código completo” – considerado pronto para teste por seus desenvolvedores – os engenheiros de software podem ter que dedicar mais da metade de seu tempo à árdua tarefa de depuração.

Mas a ajuda está a caminho na forma de D2X (pronuncia-se “desintoxicação” porque se relaciona com a noção de livrar seu programa de venenos ou defeitos). O D2X não é um programa em si, mas é classificado como uma biblioteca – um pedaço de código de computador que pode ser reutilizado por outros programas. Ele é projetado para funcionar com depuradores existentes (como GDB ou LLDB), servindo como uma ponte entre essas ferramentas e um determinado DSL. Um depurador precisa de informações sobre o programa, ou linguagem de programação, que deve ser limpo. “Cada depurador requer essas informações em seu formato específico, que pode ser um documento de 400 páginas”, diz Amarasinghe. “Se você usa D2X, não precisa se preocupar com isso. Já está resolvido para você.

Com o D2X servindo como interface, Brahmakshatriya diz, “seu programa pode ser depurado usando depuradores populares sem nenhuma modificação nos próprios depuradores”. Para ele, essa é a principal vantagem de combinar o D2X com o BuildIt: “Se você escrever uma DSL usando o BuildIt, não precisará fazer nenhum trabalho extra. Você obtém um depurador de graça, sem escrever uma única linha extra de código.”

“O D2X aborda uma contradição inerente ao software de alto desempenho”, comenta Adrian Sampson, professor associado de ciência da computação na Cornell University. “Por um lado, as linguagens específicas de domínio são nossa única esperança de melhorias sérias na eficiência da computação na era moderna. No entanto, criar um novo depurador para uma nova linguagem a partir do zero é difícil, e a ausência de um depurador é uma razão racional para que um programador possa rejeitar uma linguagem “melhor” em favor de uma “pior”. O melhor do D2X é que ele diminui a barreira para a construção de um depurador útil para uma DSL.”

Mas isso não é o fim da história, no que diz respeito ao Brahmakshatriya. Outro recurso que ele gostaria de mesclar com o BuildIt, além da depuração, é a edição, que facilita a escrita de um programa. Os editores, por exemplo, podem destacar certas palavras-chave em um documento, o que pode melhorar sua legibilidade. Eles podem executar outras funções, como preenchimento automático, que preenche automaticamente o texto após a inserção de uma pequena parte.

Brahmakshatriya gostaria de incluir criadores de perfis junto com depuradores e editores como parte da plataforma BuildIt. “Profilers são como depuradores, mas em vez de ajudar você a encontrar bugs, eles permitem que você avalie os problemas de desempenho em seu programa”, diz ele. “Se o programa estiver rodando mais devagar do que o esperado, você pode usar um criador de perfil para entender qual parte do programa está atrapalhando.” Outros recursos úteis podem ser adicionados no futuro, diz ele.

Todos esses esforços, afirma Amarasinghe, tornarão a perspectiva de criação de linguagens especializadas muito mais atraente. “A meu ver, há um grande número de pessoas que oferecem suporte a linguagens tradicionais – milhares de programadores criando ferramentas para C, C++ ou Java”, diz ele. “Por outro lado, se estou construindo uma DSL simples, não tenho milhares de programadores para fornecer todo esse suporte.” Mas agora, com BuildIt e D2X, ele acrescenta, “os pequenos podem obter todas as coisas que os outros obtêm, incluindo depuradores e, eventualmente, editores e criadores de perfis – os mesmos benefícios que vêm com as linguagens tradicionais. E você pode conseguir isso sem ter equipes de engenheiros escrevendo todo tipo de código complicado.”

Este trabalho foi apoiado pelo Application Driving Architectures Research Center, a Agência de Projetos Avançados de Defesa dos EUA (DARPA), um Centro de Programa de Microeletrônica da Universidade Conjunta co-patrocinado pela Semiconductor Research Corporation e DARPA; a National Science Foundation (NSF); e um prêmio Intel/NSF.


Publicado em 10/04/2023 15h18

Artigo original: