Alocação de Registradores de Varredura Linear: Lidando com Lacunas de Tempo de Vida

2025-08-26
Alocação de Registradores de Varredura Linear: Lidando com Lacunas de Tempo de Vida

Esta publicação detalha melhorias no algoritmo de alocação de registradores de varredura linear para lidar com lacunas de tempo de vida. O autor explica como essas lacunas surgem da redução do grafo de fluxo de controle a uma sequência linear de instruções, criando descontinuidades nos tempos de vida dos registradores virtuais. A solução envolve modificar a estrutura de dados de intervalo para suportar vários intervalos disjuntos, permitindo a identificação e exploração dessas lacunas. O algoritmo de varredura linear é então adaptado para considerar essas lacunas durante a atribuição de registradores, melhorando a utilização dos registradores. Isso aprimora a capacidade do compilador de alavancar os recursos de registradores, aumentando o desempenho do código.

Leia mais

Usando snprintf com Segurança: Evitando Overflow de Buffer

2025-08-19
Usando snprintf com Segurança: Evitando Overflow de Buffer

Este artigo destaca um recurso pouco conhecido da função `snprintf`: sua capacidade de determinar o tamanho do buffer necessário antes da formatação, evitando assim estouros de buffer. Ao chamar `snprintf` duas vezes - uma vez com `NULL` e 0 para obter o tamanho, e novamente com um buffer alocado corretamente - a necessidade de cálculos manuais de tamanho de buffer é eliminada. O autor também recomenda uma biblioteca leve somente de cabeçalho para facilitar o uso.

Leia mais
Desenvolvimento overflow de buffer

Um Compilador Python de 300 Linhas: Conversão de Closure Explicada

2025-08-11
Um Compilador Python de 300 Linhas: Conversão de Closure Explicada

Ao estudar o tutorial Ghuloum, o autor reimplementou um compilador originalmente escrito em C, resultando em uma concisa versão Python de 300 linhas (incluindo testes). Este compilador realiza conversão de closure, lidando com vinculação de variáveis, rastreamento de variáveis livres e gerenciamento de objetos de código. O artigo detalha a implementação, cobrindo expressões lambda e let, chamadas de funções e fornecendo casos de teste e exemplos de código assembly. O resultado é um compilador surpreendentemente compacto capaz de lidar com closures e chamadas de funções indiretas, mostrando soluções elegantes para problemas complexos.

Leia mais
Desenvolvimento conversão de closure

Design de IR de Compilador: Decisões Locais e Otimização

2025-06-17
Design de IR de Compilador: Decisões Locais e Otimização

Este artigo explora o design de representação intermediária (IR) de compiladores, focando em tomar decisões usando apenas informações locais. O autor compara grafos de fluxo de controle (CFGs), IRs baseados em registradores e a forma de Atribuição Única Estática (SSA), introduzindo designs mais avançados como Informação Única Estática (SSI) e Mar de Nós (SoN). SSA simplifica a análise atribuindo cada variável apenas uma vez, enquanto SSI permite adicionar informações mais granulares à mesma variável em diferentes ramos do programa. SoN representa todas as instruções como nós de grafo, representando explicitamente dependências de dados e controle para otimização mais flexível. Esses designs visam tornar os otimizadores de compiladores mais eficientes, gerando, em última análise, código mais otimizado.

Leia mais

Construindo um mecanismo de busca para blog do zero com Word2Vec

2025-05-20
Construindo um mecanismo de busca para blog do zero com Word2Vec

Os autores construíram um mecanismo de busca para blog do zero usando Python e embeddings Word2Vec. Posts e consultas de busca são incorporados em um espaço vetorial tridimensional, e a similaridade de cosseno é usada para classificar os resultados. Para torná-lo amigável à web, o modelo Word2Vec é dividido em um índice e vetores, com solicitações HTTP Range usadas para baixar apenas os dados necessários, reduzindo significativamente a carga da web. Uma métrica de avaliação é projetada para avaliar a precisão do mecanismo de busca, e melhorias futuras, como o uso de TF-IDF para reduzir ruído, são discutidas.

Leia mais
Desenvolvimento

Artigos e posts de blog que mudaram minha forma de pensar sobre linguagens de programação

2025-05-14
Artigos e posts de blog que mudaram minha forma de pensar sobre linguagens de programação

Este post de blog lista diversos artigos e posts que impactaram profundamente a compreensão do autor sobre linguagens de programação e compiladores. Tópicos abordados incluem coleta de lixo, otimização de código, alocação de registradores, mecanismos de expressão regular, aprendizado de máquina, forma SSA e design de compiladores. O autor destaca as abordagens perspicazes apresentadas, como o uso do Z3 como mecanismo de prova, a utilização de fuzzing para detecção de bugs e técnicas de análise de expressões eficientes. A coleção demonstra o mergulho profundo do autor nas intrincadas particularidades do design e implementação de linguagens de programação.

Leia mais
Desenvolvimento

Construindo uma Derivação Nix Manualmente: Um Mergulho Profundo na Geração de Hash

2025-04-09
Construindo uma Derivação Nix Manualmente: Um Mergulho Profundo na Geração de Hash

Este post de blog detalha a jornada do autor na construção manual de uma derivação Nix simples. Ao dissecar o post do blog de Farid passo a passo, o autor mergulha no funcionamento interno das derivações Nix, especificamente no processo de geração de hash. A jornada envolveu superar desafios como entender a representação ATerm, hashing SHA256 e a codificação base32 exclusiva do Nix. Por fim, o autor gerou com sucesso o mesmo valor de hash que no post do blog de Farid e construiu com sucesso uma derivação "hello world" simples.

Leia mais
Desenvolvimento Derivação Geração de Hash

Aceleração de 100x: Coleta de Lixo e GPUs em Python

2025-03-25
Aceleração de 100x: Coleta de Lixo e GPUs em Python

Esta publicação descreve como o autor conseguiu uma aceleração de 100x em um programa Python por meio de otimizações de código simples. O programa inicial utilizava NumPy para computação paralela, mas era lento e consumia muita memória devido ao gerenciamento de memória inadequado. Ao implementar um mecanismo simples de coleta de lixo para liberar variáveis intermediárias não utilizadas, o autor reduziu o tempo de execução de 40 segundos para 10 segundos, diminuindo significativamente o uso de memória. Posteriormente, usando CuPy para transferir a computação para a GPU, o tempo de execução foi reduzido ainda mais para 1,5 segundos, demonstrando uma melhoria de desempenho dramática.

Leia mais
Desenvolvimento Otimização Python

Cinder JIT: Representação Eficiente de Tipos Usando Bitsets e Semirreticulados

2025-03-11
Cinder JIT: Representação Eficiente de Tipos Usando Bitsets e Semirreticulados

O compilador JIT Cinder emprega uma representação de tipo inteligente, tratando tipos como conjuntos (mesmo reticulados) e escolhendo uma representação compacta de bitset. Este artigo examina como o Cinder utiliza bitsets e estruturas de semirreticulado para tratamento eficiente de informações de tipo, cobrindo a representação de tipos básicos, uniões de tipos e especialização. Codificando informações de tipo em bitsets, o Cinder representa efetivamente uniões de tipos e permite distinções de tipos mais granulares. Além disso, o Cinder introduz um mecanismo de especialização para rastrear o valor específico de objetos individuais, melhorando ainda mais a eficiência de otimização do compilador. O artigo também discute o tipo Bottom e detalhes sobre a geração da rede de tipos.

Leia mais
Desenvolvimento Sistema de tipos Bitsets

Uma Imersão Profunda nas Otimizações de Compilador de Atribuição Única Estática (SSA)

2025-02-11
Uma Imersão Profunda nas Otimizações de Compilador de Atribuição Única Estática (SSA)

Este artigo narra a evolução de décadas das técnicas de otimização de compilador de Atribuição Única Estática (SSA). Dos artigos iniciais sobre movimento de código e numeração de valor global, passando pelo trabalho seminal de Cytron sobre a minimização de instruções phi, até a abordagem de geração de passagem única de Brandis e Mössenböck e o Sea of Nodes IR de Click e Paleczny, o artigo rastreia vários artigos importantes e discute seus pontos fortes e fracos. Também aborda o trabalho de Appel sobre a relação entre programação funcional e SSA, a remoção iterativa de nós phi de Aycock e Horspool e abordagens mais recentes baseadas em interpretação abstrata. O artigo conclui com uma lista de artigos e recursos adicionais, fornecendo uma perspectiva mais abrangente para os leitores interessados em aprender mais sobre SSA.

Leia mais

Mergulho Profundo em CPS: Uma Jornada na Compilação de Programação Funcional

2024-12-25
Mergulho Profundo em CPS: Uma Jornada na Compilação de Programação Funcional

Este artigo mergulha no Estilo de Passagem de Continuação (CPS) e sua aplicação na compilação de linguagens de programação funcional. O autor constrói um transformador CPS passo a passo para uma linguagem simples semelhante ao Scheme, explicando estratégias de otimização e métodos de geração de código. O artigo detalha a transformação de inteiros, variáveis, chamadas de função, operadores aritméticos, expressões lambda e expressões if em forma CPS. Ele também discute meta-continuações e técnicas de otimização, como dobramento de constantes e redução beta. Finalmente, descreve várias abordagens para gerar código executável a partir de CPS, incluindo a geração de código C, o uso de trampolim e o emprego de uma única instrução switch grande.

Leia mais
Desenvolvimento Programação Funcional