Qué es Pkl, el nuevo lenguaje de programación para la configuración

Publicado el

Pkl

Pkl se presenta como una innovadora solución al panorama actual de la configuración de software, donde tradicionalmente se han utilizado lenguajes estáticos como JSON, YAML o listas de propiedades. Estos formatos, a pesar de ser ampliamente usados, muestran limitaciones significativas cuando se enfrentan a configuraciones complejas, tales como la repetición de código y la falta de herramientas de validación propias.

He leído la presentación en pkl-lang.org, donde indican que la visión detrás de Pkl es combinar lo mejor de ambos mundos: la simplicidad y legibilidad de los lenguajes estáticos con las capacidades expresivas de los lenguajes de programación generales. Esto se traduce en una herramienta poderosa para definir, validar y modularizar configuraciones de manera más eficiente y segura.

Ejemplos prácticos de uso de Pkl

Veamos para qué podemos usarlo:

Configuración de aplicaciones Web: Un caso de uso ilustrativo de Pkl es la configuración de una aplicación web. A través de Pkl, se puede definir un esquema de configuración detallado que incluya elementos como el hostname, el puerto, el entorno de despliegue y las credenciales de la base de datos. Esto no solo facilita la organización y mantenimiento de la configuración sino que también permite validar automáticamente los datos contra el esquema definido, evitando errores comunes en la configuración.

Generación de configuraciones dinámicas: Pkl destaca en escenarios donde se necesitan generar configuraciones dinámicas. Por ejemplo, al configurar múltiples bases de datos como contenedores secundarios en un entorno local, Pkl permite crear variaciones de la configuración base mediante bucles, generando así configuraciones específicas para cada instancia con mínima repetición de código.

Lectura de recursos externos: La capacidad de Pkl para leer valores de recursos externos, como variables de entorno, simplifica la gestión de secretos y configuraciones sensibles, permitiendo referenciar estos datos de manera segura sin incluirlos directamente en los archivos de configuración.

Validación avanzada: La validación es fundamental en Pkl, permitiendo definir restricciones específicas sobre los datos de configuración, como rangos de edades válidos o formatos de códigos postales. Esto asegura que la configuración no solo sea correcta sintácticamente sino también semánticamente, reduciendo la posibilidad de errores en tiempo de ejecución.

Integración y generación de códigoPkl facilita la integración con otros lenguajes de programación a través de enlaces de lenguaje, permitiendo generar esquemas de configuración como clases o estructuras en lenguajes como Swift, Go, Java y Kotlin. Esto abre la puerta a un flujo de trabajo más integrado y cohesivo entre la configuración y la lógica de aplicación.

Soporte: Finalmente, el soporte de IDE de primera clase para Pkl, incluyendo complementos para IntelliJ y VS Code, mejora significativamente la experiencia de desarrollo, ofreciendo características como autocompletado, navegación y validación en tiempo real. Esto hace que trabajar con Pkl sea no solo más productivo sino también más agradable para los desarrolladores.

Ejemplos de códigos

Los fragmentos de código presentados en el anuncio de Pkl muestran diferentes formas de utilizar este lenguaje de programación orientado a la configuración. A continuación, se detallan las tareas específicas que realizan estos ejemplos:

Definición de una Plantilla de Configuración (Application.pkl)

Este ejemplo define una plantilla de configuración para una aplicación web imaginaria. Utiliza una mezcla de tipos primitivos y clases para especificar la estructura esperada de la configuración:

  • Definición de variables simples: Define variables para el hostname, puerto, y entorno de la aplicación, utilizando tipos básicos como String y UInt16.
  • Definición de una clase: Define una clase Database para encapsular los detalles de configuración de una base de datos, incluyendo username, password, host, port, y dbName.
  • Uso de typealias: Define un alias de tipo Environment como una enumeración de cadenas ("dev", "qa", "prod"), restringiendo los valores válidos para el entorno de la aplicación.

Este código no produce datos directamente, sino que establece un esquema que se espera que cumplan los datos de configuración.

Definición de Datos de Configuración (localhost.pkl)

Este fragmento muestra cómo se pueden definir datos de configuración concretos que siguen la plantilla anterior:

  • Asignación de valores: Asigna valores específicos a las variables definidas en la plantilla, como el hostname, puerto, y entorno.
  • Uso de un bloque para configurar una clase: Utiliza un bloque para proporcionar valores a las propiedades de la instancia de Database, incluyendo una forma de leer valores de variables de entorno (en este caso, la contraseña de la base de datos).

Esta configuración es específica para un entorno de desarrollo local (localhost), ilustrando cómo Pkl permite definir configuraciones detalladas y seguras al permitir la inclusión de datos sensibles de manera segura mediante el uso de la función read.

Generación de Variaciones de Configuración (sidecars.pkl)

Este ejemplo demuestra cómo generar variaciones de una configuración base utilizando un bucle y la modificación de propiedades:

  • Importación y reutilización: Importa el módulo Application.pkl para reutilizar la definición de Database.
  • Definición oculta y generación de variaciones: Define una configuración base para una base de datos y luego genera variaciones de esta configuración para múltiples bases de datos sidecar, ajustando únicamente el puerto.

Este enfoque demuestra la capacidad de Pkl para abstraer configuraciones comunes y generar múltiples configuraciones derivadas con mínimas modificaciones, facilitando la gestión de configuraciones complejas y reduciendo la repetición de código.

Pkl se presenta así como una solución potente y versátil para los desafíos de la configuración en el desarrollo de software, proporcionando una herramienta capaz de adaptarse desde los casos de uso más simples hasta los más complejos con facilidad y eficacia. Parece muy enfocado en seguridad, escalabilidad y satisfacción del desarrollador, ahora solo falta que gane su espacio en el sector.