Eles propõem um compilador para Python que usa a técnica Copy-and-Patch

Logotipo Python

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.