Entendiendo el Compilador de Go: El Linker

En el post anterior
, vimos cómo el compilador transforma SSA optimizado en bytes de código máquina y los empaqueta en archivos objeto. Cada archivo .o contiene el código compilado de un paquete—con …
¡Bienvenido! Este es un blog sobre cómo funcionan las cosas por dentro. Si alguna vez te has preguntado qué sucede cuando tu código se ejecuta, cómo las bases de datos ejecutan consultas, o qué hacen los compiladores con tu código fuente, estás en el lugar correcto.
Escribo análisis profundos sobre los internals del software—cubriendo lenguajes de programación, compiladores, bases de datos, sistemas de archivos y más—pero con un giro: mi objetivo es hacer que los comportamientos internos complicados parezcan simples. Estas no son referencias exhaustivas; son descripciones accesibles que te dan la comprensión suficiente para apreciar la ingeniería inteligente detrás de las herramientas que usas todos los días.
Qué esperar: Los artículos aquí exploran temas como las fases del compilador de Go (lexer, parser, SSA), el modelo de objetos y la recolección de basura de Python, la ejecución de consultas en bases de datos, estructuras de sistemas de archivos y comportamientos en tiempo de ejecución como la asignación de memoria y las goroutines. Cada artículo toma un ejemplo concreto (como un programa “hello world”) y recorre lo que sucede internamente.
Cadencia de publicación: Publico un nuevo artículo cada semana, profundizando en un aspecto diferente de los internals del software con cada artículo.
Ya seas estudiante, becario o desarrollador experimentado curioso sobre los internals en los que normalmente no necesitas pensar, espero que estos artículos te den esos momentos “¡ajá!” que hacen que la programación sea aún más fascinante.

En el post anterior
, vimos cómo el compilador transforma SSA optimizado en bytes de código máquina y los empaqueta en archivos objeto. Cada archivo .o contiene el código compilado de un paquete—con …

Cuando creas un índice en PostgreSQL, podrías pensar que solo hay un tipo de estructura de índice funcionando entre bastidores. Pero PostgreSQL en realidad proporciona seis tipos diferentes de índices …

En el artículo anterior , exploramos cómo el compiler transforma IR en SSA—una representación donde cada variable se asigna exactamente una vez. Vimos cómo el compiler construye SSA usando Values y …

En el artículo anterior , exploramos cómo el planificador de PostgreSQL elige la estrategia óptima de ejecución. El planificador produce un árbol de plan abstracto—nodos como “Sequential …

En el artículo anterior , exploramos el IR—el formato de trabajo del compilador donde ocurren la desvirtualización, el inlining y el análisis de escape. El IR optimiza tu código a alto nivel, tomando …

En el artículo anterior , exploramos cómo el rewriter de PostgreSQL transforma las consultas—expandiendo vistas, aplicando políticas de seguridad y ejecutando reglas personalizadas. Al final de esa …

En los artículos anteriores , hemos explorado cómo el compilador de Go procesa tu código: el scanner lo divide en tokens, el parser construye un Abstract Syntax Tree, el comprobador de tipos lo valida …

En el artículo anterior , exploramos cómo PostgreSQL transforma texto SQL en un Query Tree validado mediante análisis sintáctico y semántico. Al final de ese viaje, PostgreSQL sabe que tus tablas …

En el artículo anterior , exploramos cómo el comprobador de tipos del compilador de Go analiza tu código. Vimos cómo resuelve identificadores, verifica la compatibilidad de tipos y asegura que tu …

En el artículo anterior , exploramos cómo PostgreSQL establece conexiones y se comunica usando su wire protocol. Una vez que tu conexión está establecida y el proceso backend está listo, finalmente …