WebAssembly: Tipos nominales, una nueva distinción

Fuentes: wingolog

Este artículo de wingolog.org explora un tema fascinante y relativamente reciente en WebAssembly (Wasm): la introducción de tipos nominales. Tradicionalmente, Wasm utilizaba una igualdad de tipos estructural, donde dos tipos con la misma definición (por ejemplo, dos structs con un i32) se consideraban equivalentes. Esto, aunque conveniente, puede ser problemático cuando se necesita una distinción más precisa entre tipos, especialmente al compartir módulos entre diferentes entornos o para garantizar la seguridad de las capacidades.

Para abordar este problema, Wasm introdujo los 'recursive type groups' (rec groups). Estos grupos permiten agrupar tipos para que sean estructuralmente distintos, incluso si sus definiciones son similares. Esto facilita la auto-referencia en tipos (un struct que contiene una referencia a sí mismo) y proporciona una forma de simular tipos nominales, aunque con limitaciones. Los 'rec groups' actúan como unidades de equivalencia estructural, impidiendo que tipos dentro de grupos diferentes se consideren iguales.

Sin embargo, la verdadera solución para tipos nominales llegó con la reciente incorporación al estándar de la propuesta de 'nominal typing'. Esta propuesta, aunque con una sintaxis peculiar que utiliza tag y param en lugar de field para definir los campos de un tipo, permite declarar tipos con identidades únicas. La construcción de valores de tipos nominales implica el uso de throw y try_table, lo que resulta en una implementación algo inusual. El acceso a los campos de estos tipos también se realiza a través de mecanismos de manejo de excepciones, lo que añade complejidad.

Para permitir la interoperabilidad entre módulos que utilizan tipos nominales, se ha introducido una propuesta de 'type imports', que permite exportar e importar definiciones de tipos tag de forma explícita. Esto facilita la composición de módulos de manera segura y predecible, evitando los problemas de equivalencia estructural no deseada.

El artículo concluye con una nota humorística, señalando que las funcionalidades para tipos nominales ya existen dentro de la propuesta de manejo de excepciones, y critica la lentitud en la adopción de 'type imports'. El autor está trabajando en integrar estas nuevas características en sus proyectos, Hoot y Wastrel.