Introducción de tipos de datos algebraicos para C99
(github.com/Hirrolot)Datatype99
Una biblioteca que ofrece tipos de datos algebraicos seguros e intuitivos, con pattern matching exhaustivo y funciones de introspección en tiempo de compilación. Está implementada en C99 puro, por lo que no requiere herramientas externas.
Características principales
- Seguridad de tipos: detecta en tiempo de compilación variantes con tipos inapropiados, pattern matching incompleto y acceso inválido a campos.
- Portabilidad: solo se necesita un compilador C99 conforme al estándar. No requiere biblioteca estándar, funciones específicas del compilador o la plataforma, ni VLA.
- Previsibilidad: tiene una semántica formal de generación de código definida, lo que garantiza que el layout de datos generado sea siempre el mismo.
- Errores fáciles de entender: es robusta frente a código incorrecto.
- Probada en producción: se usa en OpenIPC para desarrollar software de streaming en tiempo real para cámaras IP. Incluye una implementación de RTSP 1.0 y cerca de 50 mil líneas de código privado.
Instalación
- Datatype99 está compuesta por un solo archivo de cabecera,
datatype99.h, y una dependencia: Metalang99. - Si usas CMake, se recomienda obtenerla mediante
FetchContent. - Si hace falta, se pueden usar cabeceras precompiladas. Esto puede reducir el tiempo de compilación.
Uso
- Datatype99 es azúcar sintáctica simple para uniones etiquetadas. Es más segura y concisa.
- Ejemplo de árbol binario:
- Si se implementa directamente en C, hay que usar structs, uniones y enums.
- Con Datatype99, puede definirse fácilmente con una llamada al macro
datatype. - También es sencillo calcular la suma del árbol usando pattern matching.
- Seguridad en tiempo de compilación: si se accede al binding de una variante incorrecta, ocurre un error de compilación.
- Flexibilidad: los bindings son de tipo puntero, por lo que pueden modificarse, y se pueden desreferenciar para obtener valores.
- Las funciones constructoras de variantes se generan automáticamente.
- Breve explicación sobre pattern matching:
- El caso base se maneja con
otherwise. - Para ignorar bindings se usa
_. - En
ofeifLetno se permite usarbreak/continueen el nivel superior. Deben usarse etiquetasgoto.
- El caso base se maneja con
Sintaxis y semántica
- Se proporciona una definición de la gramática EBNF y una explicación de la semántica.
- En la cabecera de la biblioteca se recomienda usar la versión postfix de los macros.
Tipo unitario
- Se ofrece mediante
UnitT99yunit_v99.
Opinión de GN⁺
- Datatype99 parece ofrecer una gran ventaja al permitir usar tipos de datos algebraicos en C de forma segura y sencilla. También parece fácil de integrar en bases de código C existentes.
- Sin embargo, si se usa en C++, podría solaparse con funciones propias del lenguaje como templates o
constexpr. Frente a C, sus ventajas podrían reducirse. - Garantizar seguridad en tiempo de compilación es una gran fortaleza, pero parece difícil de aprovechar en casos donde los tipos de datos cambian dinámicamente. Es una limitación del tipado estático.
- En proyectos pequeños quizá se pueda implementar a mano, pero cuando la base de código crece, usar una biblioteca como Datatype99 probablemente ayude en productividad y estabilidad.
- Bibliotecas con funciones similares incluyen LibADT, Kitsune y P99.
Aún no hay comentarios.