Translate

viernes, 6 de marzo de 2026

Unison: Un lenguaje donde el código se identifica por su contenido


"Unison es un lenguaje de programación amigable: estático, funcional y muy divertido." Así se describe en su página web, pero además tiene características más importantes... 

La mayoría de los lenguajes de programación identifican el código mediante nombres. Si escribimos una función llamada sum, el compilador o el intérprete utiliza ese nombre para referenciarla.

Sin embargo, Unison propone una idea completamente distinta: en lugar de identificar el código por su nombre, lo identifica por el hash de su contenido.

Este enfoque se llama content-addressed code, y tiene implicancias muy interesantes en la forma de almacenar, compartir y versionar programas.

En Unison, cuando escribimos una función, el sistema calcula automáticamente un hash basado en su implementación.

Por ejemplo, si escribimos:

square x = x * x


Internamente Unison genera un identificador único basado en el contenido del código, algo similar a:

#8a7f9d2c


Ese hash representa exactamente esa implementación de la función.


Esto significa que:

  • Si el código no cambia, el hash es el mismo.
  • Si el código cambia, el hash cambia.
  • Dos funciones con el mismo código tendrán el mismo hash.


Este concepto recuerda a cómo funcionan sistemas como Git, donde los archivos también se identifican mediante hashes.

En Unison, los nombres son solo alias para referirse a una función cuyo identificador real es el hash.


Por ejemplo:

square x = x * x


El nombre square es solo una referencia amigable.

La verdadera identidad del código es el hash que Unison calcula.


Esto permite que el sistema tenga una propiedad interesante: las referencias al código nunca se rompen.

Si una función depende de otra, realmente depende del hash de esa implementación específica, no de un nombre que podría cambiar.

Este modelo cambia varios aspectos del desarrollo de software.

Cuando una función depende de otra, depende de esa implementación exacta.

Si alguien modifica la función original, no rompe el código existente.

Esto elimina un problema muy común en los sistemas de paquetes: las actualizaciones que rompen compatibilidad.

Cada cambio en el código produce un nuevo hash. Esto significa que el sistema de versiones está integrado en el lenguaje, sin necesidad de depender únicamente de herramientas externas.

Como el código se identifica por hash, es posible compartir funciones entre proyectos o repositorios sin ambigüedades.

Si dos desarrolladores tienen el mismo hash, significa que tienen exactamente el mismo código.

Otra diferencia importante es que Unison no trabaja únicamente con archivos .unison.

El código se almacena en una base de datos de código, donde cada definición queda registrada junto a su hash.


Esto permite:

  • buscar definiciones por dependencias
  • navegar versiones del código
  • reutilizar implementaciones existentes


Una función sencilla en Unison puede verse así:

add x y = x + y


Y otra función que la utilice:

double x = add x x


Internamente, double no depende del nombre add, sino del hash de esa implementación de add.

Si add cambia, la función double seguirá apuntando a la versión original.

Unison propone una idea bastante radical: el código no se identifica por nombres, sino por su contenido.


Este enfoque permite:

  • dependencias completamente seguras
  • versionado automático
  • código distribuido sin ambigüedades


Aunque todavía es un lenguaje experimental, introduce conceptos muy interesantes sobre cómo podrían evolucionar los sistemas de desarrollo de software.


Dejo link: https://www.unison-lang.org/