Python é uma linguagem de programação de alto nível.
Recentemente um dos principais Os desenvolvedores do CPython revelaram um novo compilador JIT para Python usando a técnica de cópia e patch, qual é uma técnica de compilação recente e inovadora que destaca-se pela rapidez, facilidade de manutenção e sua integração completa com o intérprete existente.
Copiar e corrigir é baseado no uso de uma biblioteca predefinida de fragmentos de código binário conhecidos como "modelos" para gerar código de máquina otimizado. Esses modelos são implementações pré-construídas de nós AST (Abstract Syntax Tree) ou opcodes de bytes que contêm valores ausentes, como literais imediatos, deslocamentos de variáveis de pilha e destinos de ramificação e chamada.
Ele permite gerar sistematicamente variantes de modelos binários em C++ de uma forma limpa e pura. Usa a infraestrutura do compilador Clang+LLVM para ocultar detalhes específicos da plataforma em um nível baixo.
Durante o tempo de execução, otimização e geração de código tornam-se tarefas mais simplesl Encontre uma tabela de dados que contenha o modelo apropriado, crie uma instância dela e coloque-a na posição desejada usando o processo Copy-and-Patch, ajustando quaisquer valores ausentes para serem corrigidos em tempo de execução.
Olhando de uma perspectiva mais simples, consiste em compilar (Copiar) o código-fonte existente e ajustar valores faltantes ou modificações específicas (Patch).
Copy-and-Patch facilita muito a conversão automática de um intérprete escrito na linguagem C em um compilador JIT, eliminando a necessidade de criar lógica de geração de código e representações de compilação separadamente. Ao usar um gerador de código comum, a correção de erros no interpretador resulta na resolução automática dos mesmos problemas no JIT.
A abordagem Copy-and-Patch depende da semelhança entre realocar o código na memória Quando o vinculador carrega arquivos de objeto e substitui instruções de máquina em vez de bytecode no JIT são tarefas semelhantes. Durante a execução do programa, lAs instruções de bytecode geradas pelo interpretador são listadas, e código de máquina pré-compilado é copiado para cada instrução em uma área de memória executável, então disto as instruções Eles são modificados dinamicamente para substituir os dados processados em tempo real. No caso do JIT, os templates predefinidos são copiados de funções já compiladas e substituídos pelos valores necessários, como argumentos e constantes).
A implementação de um JIT com a técnica Copy-and-Patch envolve compilar um arquivo objeto no formato ELF ouusando LLVM. Este arquivo objeto contém informações sobre as instruções do bytecode e detalhes sobre a substituição de dados necessária. Durante a execução, o JIT substitui as instruções de bytecode geradas pelo interpretador por representações de código de máquina, ajustando simultaneamente os dados necessários aos cálculos. Embora a implementação JIT exija LLVM como dependência durante a compilação, os componentes de tempo de execução não estão vinculados a dependências externas, reduzindo para aproximadamente 300 linhas de código C manuscrito e 3000 linhas de código C gerado.
Em termos de desempenho, o JIT proposto com a técnica Copy-and-Patch apresenta melhorias notáveis em comparação com abordagens tradicionais. Quando comparado com JITs convencionais (LLVM -O0), destaca-se pela geração de código 100 vezes mais rápida e um código resultante que É 15% mais eficiente. Na área de compilação WebAssembly (Liftoff), o novo JIT demonstra geração de código 5x mais rápida e o código resultante é executado 50% mais rápido.
Quando comparado a um JIT de otimização como o LuaJIT, que usa código assembly escrito manualmente, o JIT proposto teve desempenho superior em 13 dos 44 testes. Embora em média tenha ficado 35% atrás no desempenho, é fundamental destacar que esta diferença é compensada por uma simplificação significativa na manutenção e uma redução na complexidade de implementação. Este equilíbrio entre desempenho e eficiência no gerenciamento de código posiciona o JIT proposto como uma alternativa atraente no cenário de desempenho.
Finalistase se você estiver interessado em aprender mais sobre isso, você pode verificar os detalhes no link a seguir.