1 puntos por GN⁺ 2024-05-10 | Aún no hay comentarios. | Compartir por WhatsApp

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 of e ifLet no se permite usar break/continue en el nivel superior. Deben usarse etiquetas goto.

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 UnitT99 y unit_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.

Aún no hay comentarios.