C no es un lenguaje de bajo nivel: las CPU ya no son PDP-11 rápidos

Este artículo, publicado en ACM Queue por David Chisnall (Universidad de Cambridge), sostiene que C dejó de ser un lenguaje de bajo nivel hace décadas y que las vulnerabilidades Spectre y Meltdown son consecuencia directa de los esfuerzos de la industria por mantener esa ilusión. La definición de Al

Por qué Clang triplicó el rendimiento de un validador UTF-8 y GCC no

El autor, Nemanja Trifunović, mantiene desde 2006 una biblioteca C++ de código abierto para manejar cadenas UTF-8 y recientemente reoptimizó su función validate_next, que decodifica un code point UTF-8 a partir de un iterador de bytes. La versión original determina la longitud de la secuencia según

Escribir un programa en C válido sin función main(): tutorial paso a paso

Este tutorial técnico de iximiuz Labs muestra cómo construir un ejecutable en C que prescinde de la función main() y, opcionalmente, de toda la biblioteca estándar, recurriendo directamente a las llamadas al sistema del kernel de Linux. El recorrido parte de un programa «Hola, mundo» convencional co

Análisis de escape en Go: cómo decide el compilador entre pila y montón

El análisis de escape es una optimización del compilador de Go que decide, valor por valor, si una variable puede vivir en la pila o debe trasladarse al montón. La pila es una región por gorutina donde las asignaciones son muy baratas y se liberan al retornar la función; el montón es una memoria com

Tu código es rápido… solo si el compilador te deja

El programador Christof Kaser presenta `sort.h`, una implementación de Quicksort sin ramas basada en el principio de que los compiladores modernos —especialmente Clang— traducen bucles con operadores condicionales en instrucciones branchless rápidas, siempre que el código fuente esté escrito con el

Optimización de push_back en SmallVector de LLVM: ruta rápida sin frame

LLVM, el compilador de Clang, ha introducido una optimización en SmallVector::push_back para tipos aproximadamente copiables triviales, su operación más caliente. Antes, la ruta rápida del push_back reservaba capacidad, almacenaba el elemento y luego llamaba a grow_pod, lo que obligaba a guardar thi

React publica un puerto experimental de React Compiler a Rust

El equipo de React ha publicado, en una pull request del repositorio oficial, un puerto experimental y en curso de React Compiler a Rust. Se trata de un trabajo aún sin versiones compiladas distribuibles, compartido en fase temprana con socios antes de pasar por las pruebas internas en Meta, con el

Cuánto ayudan los niveles de microarquitectura amd64 en Go

Recompilar código Go con niveles de microarquitectura más altos puede recortar hasta un 43% el tiempo de ejecución en operaciones intensivas, sin tocar una sola línea de código fuente, según un análisis publicado por el investigador Daniel Lemire, profesor de la Universidad de Quebec y reconocido ex

Robar ideas a la biología para acelerar la compilación de Haskell

GHC, el compilador de Haskell, incluye una extensión llamada ApplicativeDo que traduce bloques do-notation en operaciones aplicativas (<*>) cuando no existen dependencias entre instrucciones, habilitando paralelismo automático. Sin embargo, el algoritmo que produce la planificación óptima de esas op

De Lisp a Magia: La Evolución de un Recolector de Basura

Este artículo, escrito por Matheus Afonso Martins Moreira, narra la evolución de un recolector de basura llamado 'Baby's Second Garbage Collector', originalmente concebido como una solución simple y precisa en el lenguaje dinámico 'lone lisp'. La historia se presenta de forma alegórica, utilizando m

Llamadas de función en Rust: ¿realmente cuestan tanto?

Este artículo aborda una preocupación común en programación, especialmente en Rust: el costo de la indirección, es decir, la sobrecarga de las llamadas a funciones. La advertencia habitual es "cada llamada de función adicional añade sobrecarga, inlínala". Sin embargo, en el contexto del código asínc

Go: Optimiza el rendimiento con la pila

Este artículo del blog de Go explica cómo los desarrolladores están optimizando el rendimiento de Go al realizar más asignaciones de memoria en la pila (stack) en lugar del montón (heap). Las asignaciones en el montón son costosas, requieren código adicional y generan carga para el recolector de bas