Tipos declarativos para el sistema de gestión de memoria de WASM

El sistema de gestión de memoria (GC) de WebAssembly introduce desafíos complejos para la gestión declarativa de tipos, especialmente con estructuras anidadas y grupos de tipos recursivos. El artículo técnico analiza cómo modelar estos tipos de manera coherente en el código fuente, superando las lim

Ante redefine la mutabilidad compartida segura en lenguajes funcionales

Ante, un lenguaje de programación funcional de bajo nivel basado en semántica de propiedad y préstamo, ha actualizado su sistema de verificación de préstamos para permitir una mutabilidad compartida más flexible y segura. A diferencia de Rust, Ante elimina la restricción clásica que impide mutar una

El sistema de tipos de Haskell: clases, kinks y tipos de orden superior

El sistema de tipos de Haskell introduce una capa de abstracción conocida como 'Kinds' (clases), que permite clasificar no solo los valores, sino también los constructores de tipos. Este mecanismo es fundamental para la expresividad del lenguaje, ya que permite codificar restricciones y comportamien

Guía técnica para manejar efectos de estado en programación funcional

La gestión de efectos de estado es un desafío fundamental en la programación funcional, donde las operaciones dependen de un contexto externo sin alterar el flujo de ejecución principal. Este documento técnico detalla estrategias para implementar manejadores de estado, permitiendo que efectos como '

Por qué Rust es ideal para el desarrollo con agentes de IA

El diseño de lenguajes de programación sigue siendo relevante en la era de los modelos de lenguaje grandes (LLM), aunque su rol ha evolucionado. Un experto en diseño de lenguajes argumenta que Rust es particularmente bien adaptado al desarrollo agéntico, no solo por su popularidad, sino por sus cara

Resolución de la propagación de alias en el sistema de tipos de Futhark

El equipo de desarrollo de Futhark ha resuelto las preguntas pendientes sobre la propagación de alias en su sistema de tipos, un componente crítico para garantizar la seguridad en actualizaciones in-place. El artículo detalla cómo se abordó el desafío de analizar alias en funciones de orden superior

Por qué los sistemas de efectos en Haskell no son necesarios

El artículo técnico examina la utilidad de los sistemas de efectos en Haskell, concluyendo que su implementación es innecesaria para la mayoría de las tareas cotidianas. El autor, tras reescribir una base de código de producción, analiza si los efectos son necesarios para el manejo de argumentos, la

Optimistic Lock Coupling: escalabilidad y seguridad en concurrencia

El crecimiento del número de núcleos de CPU exige que las estructuras de datos concurrentes mantengan una alta escalabilidad. El acoplamiento de bloqueo tradicional, aunque conceptualmente simple, genera cuellos de botella debido a la contención física en los nodos raíz, limitando el rendimiento en

Implementación de listas ordenadas en OCaml mediante GADTs

El artículo técnico explora la implementación de una estructura de datos que garantiza la ordenación de las listas en el lenguaje OCaml, respondiendo a una propuesta de Antonin Décimo para mejorar la seguridad de tipos. Aunque la librería 'nel' ya existía para gestionar errores no vacíos, la discusi

lang_narrow: un lenguaje con tipado por flujo y tipos union

lang_narrow es un lenguaje de programación experimental diseñado para demostrar la viabilidad del tipado por flujo (flow typing) mediante tipos union estructurales. A diferencia de los tipos algebraicos de datos (ADT) cerrados, este sistema permite restringir dinámicamente los tipos de los valores e

Limitaciones de Arc en Rust para el downcasting de tipos

El uso de Arc<JSON> en Rust permite optimizar el rendimiento de cachés compartidas entre hilos al evitar copias costosas de datos grandes. Sin embargo, esta solución introduce una limitación técnica significativa: la imposibilidad de realizar downcasting eficiente, es decir, extraer referencias a su

El patrón 'Parse, don't validate' en Rust y su aplicación práctica

El patrón 'Parse, don't validate' (parsear, no validar) es un enfoque de diseño de software que utiliza el sistema de tipos para garantizar invariantes, eliminando la necesidad de validaciones explícitas en el código de cliente. Este artículo analiza la aplicación de este concepto en el lenguaje Rus

Convertir un enum en tipos individuales mejora la seguridad en Rust

Un desarrollador de Rust presenta una técnica para transformar un enum en tipos estructurados individuales, mejorando la seguridad y precisión en el manejo de rutas de archivo. El autor, quien trabaja en una librería de rutas, explica que, aunque el enum `std::path::Component` es útil para descompon

Futhark evita que su sistema de tipos gestione la alianza de variables

El sistema de tipos del lenguaje de programación Futhark enfrenta un desafío técnico significativo al intentar gestionar la alianza de variables (aliasing) en el contexto de actualizaciones in-place. Esta característica, diseñada para permitir operaciones de bajo coste sobre arrays, introduce una co

Diferencias entre tipos union y sum en lenguajes de programación

Los tipos union y sum son conceptos fundamentales en la teoría de tipos de programación, aunque a menudo se confunden. Mientras que los tipos product (o structs) representan la combinación de campos mediante un operador lógico AND, los tipos union representan la disyunción de opciones mediante un op

Por qué la inmutabilidad y la mutabilidad no son subtipos entre sí

La inmutabilidad y la mutabilidad no pueden ser subtipos o supertipos entre sí porque violan el Principio de Sustitución de Liskov (LSP). Según la definición formal, un tipo S es subtipo de T si cualquier valor de S puede usarse en cualquier contexto donde se espera un valor de T. Aunque un par muta

Sintaxis de declaración de tipos en lenguajes de programación

La sintaxis de declaración de tipos varía significativamente entre los lenguajes de programación modernos, reflejando influencias históricas y decisiones de diseño específicas. La mayoría de los lenguajes actuales, como Java, C# y D, han adoptado la sintaxis de C, aunque esta puede generar ambigüeda

Rust estabiliza el tipo never tras dos años de trabajo

El compilador de Rust ha estabilizado oficialmente el tipo never, denotado por el símbolo de exclamación (!), el 24 de agosto tras más de dos años de desarrollo. Esta característica, utilizada internamente por el compilador durante mucho tiempo, permite marcar funciones que nunca retornan y optimiza

Las bondades de Gleam: un recorrido por sus características más atractivas

Gleam, un lenguaje funcional que compila para BEAM (la máquina virtual de Erlang), incorpora una serie de pequeñas decisiones de diseño que simplifican el trabajo diario del desarrollador. Este artículo repasa cinco de sus características más llamativas, útiles tanto para quienes ya trabajan en la p

Rust activa por defecto en nightly su nuevo resolvedor de traits

El equipo de Rust ha activado por defecto en el canal nightly el nuevo resolvedor de traits (next-generation trait solver), un componente del compilador desarrollado durante casi cuatro años que cambia por completo la forma de demostrar where-clauses y normalizar tipos asociados. El cambio estará di

Una formulación alternativa del borrow checker de Rust basada en alias

Niko Matsakis presenta una propuesta experimental para reformular el borrow checker de Rust. El objetivo es superar algunas limitaciones del diseño actual (NLL) y, a la vez, mejorar su velocidad de cómputo. Matsakis ya cuenta con un prototipo implementado que supera la suite completa de pruebas de N

TSON: un sistema de esquemas inmutables con un JSON mejorado

TSON (Typed Schema Object Notation) es un sistema de esquemas con una particularidad central: las definiciones son inmutables y se identifican mediante hashes criptográficos. Cada documento declara el esquema que lo valida y ese esquema, a su vez, nombra a su meta-esquema; un único hash permite veri

Haskell en cinco puntos: elección incondicional mediante parametricidad

Justin Le publica la segunda entrega de su serie «Five-Point Haskell», centrada en el principio que bautiza como «elección incondicional». La idea aprovecha la parametricidad de Haskell: cuando una función tiene un tipo polimórfico como `forall a. a -> a`, el compilador deduce propiedades que toda i

Convertir la estabilidad referencial en un tipo de TypeScript

En cualquier base de código mediana hecha con React o Preact, garantizar que una referencia no cambie entre renderizados exige recordar manualmente reglas que el sistema de tipos no expresa. El ingeniero de software Jovi De Croock propone elevar esa intención al propio tipo mediante un tipo genérico

Tipos de prueba en Dart: clases finales como testigos computacionales

Los tipos de prueba, también conocidos como tipos testigo o de evidencia, son un patrón de programación en el que la mera existencia de un valor garantiza que un determinado cómputo se ha ejecutado. En Dart 3.0, este patrón se materializa combinando cuatro mecanismos: el modificador final, que impid

Curiosidades del C pre-ANSI: lo que K&R no enseñaba en clase

Una investigación个人 sobre las peculiaridades del C de K&R (pre-ANSI) revela diferencias notables con el lenguaje estandarizado que se enseña hoy. El autor, tras leer la primera edición de "The C Programming Language", el documento de razonamiento de C89 y el código del compilador de Unix 7ª edición,

Cómo un segundo middleware colapsó los tipos de TypeScript en Inngest

Un ingeniero del equipo de Inngest descubrió un bug sutil en los tipos genéricos de TypeScript de la librería inngest-js: al encadenar dos middleware, el tipo devuelto por step.run se colapsaba a {} y las propiedades de los objetos dejaban de ser accesibles, aunque en tiempo de ejecución el código f

Validar no es parsear: tipos de marca en TypeScript al estilo Haskell

Este artículo recupera el principio "parse, don't validate" de Alexis King y lo aplica a TypeScript, un lenguaje cuyo sistema de tipos estructural no obliga a distinguir entre datos sin revisar y datos ya verificados. La idea central es que un validador devuelve true o false y olvida lo que comprobó

Nueve formas de simular herencia en Rust, el lenguaje sin clases

Rust carece de herencia de clases al estilo de los lenguajes orientados a objetos: no existen clases, declaraciones de subclases ni campos heredados de una clase padre. Sin embargo, las necesidades que la mayoría de los programadores resuelve con herencia —interfaces compartidas, comportamiento reut

Elixir v1.20 ya es un lenguaje de tipado gradual sin anotaciones

El equipo de Elixir ha publicado la versión 1.20 del lenguaje de programación, que incorpora un sistema de tipado gradual sin necesidad de añadir anotaciones de tipo. Se trata del primer hito de desarrollo del proyecto de tipos, iniciado en 2022, que convierte a Elixir en un lenguaje gradualmente ti

Phel 0.36.0 introduce variables como valores de primera clase

Phel 0.36.0 es una versión mayor del lenguaje de programación funcional que compila a PHP, introduciendo capacidades fundamentales que amplían significativamente su poder expresivo. Entre las adiciones más relevantes se encuentran lasfirst-classVars, que permiten tratar las variables como valores de

Rust: Dependencia en 'serde' frena desarrollo

El ecosistema de Rust enfrenta un problema fundamental relacionado con la forma en que se desarrollan sus bibliotecas (crates). El problema central radica en la dependencia de crates fundamentales como `serde` para la serialización de datos. `serde` define traits (interfaces) como `Serialize` que ca

Error en compilador Rust al emular tipos avanzados

Este artículo técnico explora una peculiaridad en el sistema de tipos de Rust y cómo un intento de emular tipos de orden superior (HKTs) llevó a un error de desbordamiento en la evaluación de requisitos de traits, causando que el compilador fallara. El autor, en su intento de crear un lenguaje de sc

Tipos y errores: un análisis de Map.take! en Elixir

Este artículo explora las limitaciones de los sistemas de tipos en lenguajes de programación dinámicos, utilizando como ejemplo la propuesta de una función `Map.take!/2` en Elixir. `Map.take/2` es una función existente en Elixir que extrae un subconjunto de claves de un mapa, ignorando las claves in