Asignación de registros de escaneo lineal: Manejo de huecos de tiempo de vida

2025-08-26
Asignación de registros de escaneo lineal: Manejo de huecos de tiempo de vida

Esta publicación detalla mejoras en el algoritmo de asignación de registros de escaneo lineal para manejar huecos de tiempo de vida. El autor explica cómo surgen los huecos de tiempo de vida al reducir el grafo de flujo de control a una secuencia lineal de instrucciones, creando discontinuidades en los tiempos de vida de los registros virtuales. La solución implica modificar la estructura de datos de intervalo para admitir múltiples rangos disjuntos, permitiendo la identificación y explotación de estos huecos. El algoritmo de escaneo lineal se adapta entonces para considerar estos huecos durante la asignación de registros, mejorando la utilización de los registros. Esto mejora la capacidad del compilador para aprovechar los recursos de los registros, aumentando en última instancia el rendimiento del código.

Leer más

Uso Seguro de snprintf: Evitando desbordamiento de búfer

2025-08-19
Uso Seguro de snprintf: Evitando desbordamiento de búfer

Este artículo destaca una característica poco conocida de la función `snprintf`: su capacidad para determinar el tamaño del búfer necesario antes del formateo, evitando así los desbordamientos de búfer. Al llamar a `snprintf` dos veces —una vez con `NULL` y 0 para obtener el tamaño, y otra vez con un búfer correctamente asignado— se elimina la necesidad de cálculos manuales del tamaño del búfer. El autor también recomienda una biblioteca ligera solo de encabezado para facilitar su uso.

Leer más

Un compilador Python de 300 líneas: Conversión de cierres explicada

2025-08-11
Un compilador Python de 300 líneas: Conversión de cierres explicada

Mientras trabajaba en el tutorial de Ghuloum, el autor reimplementó un compilador originalmente escrito en C, logrando una concisa versión en Python de 300 líneas (incluyendo pruebas). Este compilador realiza la conversión de cierres, manejando la vinculación de variables, el seguimiento de variables libres y la gestión de objetos de código. El artículo detalla la implementación, cubriendo las expresiones lambda y let, las llamadas a funciones y proporcionando casos de prueba y ejemplos de código ensamblador. El resultado es un compilador sorprendentemente compacto capaz de manejar cierres y llamadas a funciones indirectas, mostrando soluciones elegantes para problemas complejos.

Leer más

Diseño de IR de Compilador: Decisiones Locales y Optimización

2025-06-17
Diseño de IR de Compilador: Decisiones Locales y Optimización

Esta publicación explora el diseño de la representación intermedia (IR) del compilador, centrándose en la toma de decisiones utilizando solo información local. El autor compara los grafos de flujo de control (CFG), los IR basados en registros y el formulario de asignación única estática (SSA), introduciendo diseños más avanzados como la información única estática (SSI) y el mar de nodos (SoN). SSA simplifica el análisis asignando cada variable solo una vez, mientras que SSI permite agregar información más granular a la misma variable en diferentes ramas del programa. SoN representa todas las instrucciones como nodos de grafo, representando explícitamente las dependencias de datos y control para una optimización más flexible. Estos diseños apuntan a hacer que los optimizadores de compiladores sean más eficientes, generando en última instancia un código más optimizado.

Leer más

Construyendo un motor de búsqueda para blogs desde cero con Word2Vec

2025-05-20
Construyendo un motor de búsqueda para blogs desde cero con Word2Vec

Los autores construyeron un motor de búsqueda para blogs desde cero usando Python e incrustaciones Word2Vec. Las publicaciones y las consultas de búsqueda se incrustan en un espacio vectorial tridimensional, y la similitud del coseno se utiliza para clasificar los resultados. Para hacerlo amigable para la web, el modelo Word2Vec se divide en un índice y vectores, con solicitudes HTTP Range utilizadas para descargar solo los datos necesarios, reduciendo significativamente la carga web. Se diseña una métrica de evaluación para evaluar la precisión del motor de búsqueda, y se discuten mejoras futuras, como el uso de TF-IDF para reducir el ruido.

Leer más
Desarrollo

Artículos y publicaciones de blog que cambiaron mi forma de pensar sobre los lenguajes de programación

2025-05-14
Artículos y publicaciones de blog que cambiaron mi forma de pensar sobre los lenguajes de programación

Esta entrada de blog enumera varios artículos y publicaciones de blog que influyeron profundamente en la comprensión del autor sobre los lenguajes de programación y los compiladores. Los temas tratados incluyen la recolección de basura, la optimización del código, la asignación de registros, los motores de expresiones regulares, el aprendizaje automático, la forma SSA y el diseño de compiladores. El autor destaca los enfoques perspicaces presentados, como el uso de Z3 como motor de prueba, el aprovechamiento de la prueba difusa para la detección de errores y las técnicas eficientes de análisis de expresiones. La colección muestra la inmersión profunda del autor en las intrincadas particularidades del diseño e implementación de los lenguajes de programación.

Leer más
Desarrollo

Construyendo manualmente una derivación Nix: Una inmersión profunda en la generación de hash

2025-04-09
Construyendo manualmente una derivación Nix: Una inmersión profunda en la generación de hash

Esta entrada de blog detalla el viaje del autor al construir manualmente una derivación Nix simple. Al diseccionar la entrada del blog de Farid paso a paso, el autor profundiza en el funcionamiento interno de las derivaciones Nix, específicamente en el proceso de generación de hash. El viaje implicó superar desafíos como comprender la representación ATerm, el hash SHA256 y la codificación base32 exclusiva de Nix. En última instancia, el autor generó con éxito el mismo valor hash que en la entrada del blog de Farid y construyó con éxito una derivación "hello world" simple.

Leer más

Aceleración 100x: Reciclaje de memoria y GPUs en Python

2025-03-25
Aceleración 100x: Reciclaje de memoria y GPUs en Python

Esta publicación detalla cómo el autor logró una aceleración de 100x de un programa Python mediante simples optimizaciones de código. El programa inicial utilizaba NumPy para computación paralela, pero era lento e intensivo en memoria debido a una mala gestión de la memoria. Al implementar un simple mecanismo de reciclaje de memoria para liberar variables intermedias no utilizadas, el autor redujo el tiempo de ejecución de 40 segundos a 10 segundos, disminuyendo significativamente el uso de memoria. Posteriormente, utilizando CuPy para trasladar el cálculo a la GPU, el tiempo de ejecución se redujo aún más a 1,5 segundos, demostrando una mejora de rendimiento dramática.

Leer más

Cinder JIT: Representacion eficiente de tipos usando conjuntos de bits y semirretículos

2025-03-11
Cinder JIT: Representacion eficiente de tipos usando conjuntos de bits y semirretículos

El compilador JIT Cinder emplea una representación de tipo inteligente, tratando los tipos como conjuntos (incluso retículos) y eligiendo una representación compacta de conjuntos de bits. Este artículo profundiza en cómo Cinder aprovecha los conjuntos de bits y las estructuras de semirretículo para el manejo eficiente de la información de tipo, cubriendo la representación de tipos básicos, las uniones de tipos y la especialización. Codificando la información de tipo en conjuntos de bits, Cinder representa eficazmente las uniones de tipo y permite distinciones de tipo más granulares. Además, Cinder introduce un mecanismo de especialización para rastrear el valor específico de los objetos individuales, mejorando aún más la eficiencia de optimización del compilador. El artículo también analiza el tipo Bottom y los detalles sobre la generación de la red de tipos.

Leer más
Desarrollo Conjuntos de bits

Una Inmersión Profunda en las Optimizaciones de Compilador de Asignación Única Estática (SSA)

2025-02-11
Una Inmersión Profunda en las Optimizaciones de Compilador de Asignación Única Estática (SSA)

Este artículo narra la evolución de décadas de las técnicas de optimización de compilador de Asignación Única Estática (SSA). Desde los artículos iniciales sobre movimiento de código y numeración de valor global, pasando por el trabajo seminal de Cytron sobre la minimización de instrucciones phi, hasta el enfoque de generación de una sola pasada de Brandis y Mössenböck y el Sea of Nodes IR de Click y Paleczny, el artículo rastrea varios artículos clave y discute sus fortalezas y debilidades. También aborda el trabajo de Appel sobre la relación entre la programación funcional y SSA, la eliminación iterativa de nodos phi de Aycock y Horspool y enfoques más recientes basados en interpretación abstracta. El artículo concluye con una lista de artículos y recursos adicionales, proporcionando una perspectiva más completa para los lectores interesados en aprender más sobre SSA.

Leer más

Inmersión Profunda en CPS: Un Viaje a la Compilación de Programación Funcional

2024-12-25
Inmersión Profunda en CPS: Un Viaje a la Compilación de Programación Funcional

Este artículo profundiza en el Estilo de Paso de Continuación (CPS) y su aplicación en la compilación de lenguajes de programación funcional. El autor construye un transformador CPS paso a paso para un lenguaje simple similar a Scheme, explicando estrategias de optimización y métodos de generación de código. El artículo detalla la transformación de enteros, variables, llamadas a funciones, operadores aritméticos, expresiones lambda y expresiones if en forma CPS. También analiza metacontinuaciones y técnicas de optimización como el plegado de constantes y la reducción beta. Finalmente, describe varios enfoques para generar código ejecutable a partir de CPS, incluyendo la generación de código C, el uso de trampolines y el empleo de una única instrucción switch grande.

Leer más