Volver al inicio

HydraScript: lenguaje con tipado estático y CGI para Docker

HydraScript — un lenguaje de programación con sintaxis JavaScript y tipado estático, desarrollado como un proyecto de código abierto. El artículo discute las características del lenguaje, sistema de análisis estático y uso práctico para guiones CGI con despliegue en Docker.

Creando servicios web con HydraScript: desde el parseo JSON hasta Docker
Advertisement 728x90

# HydraScript: De proyecto universitario a herramienta CGI con tipado estático para análisis JSON

Un desarrollador en C# creó HydraScript, un lenguaje de programación que combina la sintaxis de JavaScript con tipado estático. El proyecto evolucionó de una tesis estudiantil a una herramienta de código abierto que soporta scripting CGI para desplegar servicios web en Docker.

De proyecto estudiantil a potencia de código abierto

HydraScript comenzó como una tesis titulada "Subconjunto extendido de JavaScript" en el departamento IU-9 de la Universidad Estatal Técnica de Bauman en Moscú. Tras cuatro años de desarrollo a tiempo parcial, se convirtió en un proyecto de código abierto completo con GitHub Actions CI/CD, versionado semántico y lanzamientos automatizados. Los binarios del intérprete se compilan para Windows (x64), macOS (arm64) y Linux (x64) usando Native AOT, eliminando dependencias en tiempo de ejecución.

Objetivos principales del proyecto:

Google AdInline article slot
  • Implementación parcial de JavaScript con objetos y tipado estático estructural—no se necesitan palabras clave como constructor, class o interface.
  • Ingeniería inversa pública de técnicas modernas de análisis estático.
  • Desmitificar la tecnología de compiladores mediante código abierto.
  • Recopilar implementaciones claras de desafíos estándar de compiladores.

Análisis estático: La función estrella

El sistema de tipos de HydraScript detecta problemas en tiempo de compilación que otros lenguajes solo identifican en tiempo de ejecución.

Detección de acceso a variables no inicializadas

El intérprete rastrea el orden de inicialización para evitar fallos en tiempo de ejecución. Aquí hay código problemático en TypeScript/JavaScript:

let x = f()
function f() {
    console.log(x) // Error: x referenciada antes de asignación
    return 5
}

HydraScript lo marca en tiempo de compilación.

Google AdInline article slot

Valores predeterminados inteligentes

A diferencia de C#, donde las variables locales no inicializadas causan errores de compilación, HydraScript asigna valores predeterminados automáticamente según el tipo inferido:

let x: number
>>> x // 0

let xArr: number[]
>>> xArr // []

let s: string
>>> ~s // 0 (longitud de cadena)

Espacios de nombres separados para símbolos

El lenguaje usa tres tipos de símbolos: VariableSymbol, TypeSymbol y FunctionSymbol. Los nombres solo deben ser únicos dentro de su tipo, permitiendo un reutilización flexible:

type x = number
let x:x
function x(x:x) {
    >>>x
    x = x + 1
}
x(x)

Soporte CGI para desarrollo web

Para hacer HydraScript práctico en backend, ahora soporta scripting CGI. Esto requirió:

Google AdInline article slot
  • API de manipulación de cadenas
  • Salida a stdout
  • Lectura de variables de entorno
  • Soporte para comentarios shebang

Configuración de despliegue en Docker

Configuración de imagen Docker basada en Apache httpd con el intérprete de HydraScript:

FROM mcr.microsoft.com/dotnet/sdk:10.0-alpine as sdk-build
RUN dotnet tool update -g hydrascript
ENV PATH="/root/.dotnet/tools:${PATH}"

FROM httpd:2.4-alpine
COPY --from=sdk-build /root/.dotnet/tools/ /usr/bin
RUN apk add dotnet10-runtime

Script CGI de ejemplo: Análisis de cadenas de consulta a JSON

Este script convierte parámetros de URL en JSON estructurado, mostrando un uso real:

#!/usr/bin/hydrascript

type QueryStringParseResultItem = {
    name: string;
    value: string;
}

type QueryStringParseResult = {
    result: QueryStringParseResultItem[];
}

type QueryStringParser = {
    input: string;
}

function parse(parser: QueryStringParser): QueryStringParseResult {
    const qsLen = ~parser.input
    let i = 0
    let items: QueryStringParseResultItem[]

    let currentName: string, currentValue: string
    let isName = true
    while (i < qsLen) {
        const currentChar = parser.input[i]
        if (currentChar == "&" || i == qsLen - 1) {
            let addittion = i == qsLen - 1 && currentChar != "&" ? currentChar : ""
            items = items ++ [{name: currentName; value: currentValue + addittion;}] 
            currentName = ""
            currentValue = ""
            isName = true
        } else if (currentChar == "=") {
            isName = false
        } else {
            if (isName) {
                currentName = currentName + currentChar
            } else {
                currentValue = currentValue + currentChar
            }
        }
        i = i + 1
    }

    return {
        result: items;
    }
}

let parser: QueryStringParser = {
    input: $QUERY_STRING;
}

>>> "Content-Type: application/json\n\n"
>>>  parser.parse()

Para a=1&b=bla&c=false, genera:

{
  "result": [
    {"name": "a", "value": "1"},
    {"name": "b", "value": "bla"},
    {"name": "c", "value": "false"}
  ]
}

Lecciones clave

• HydraScript combina sintaxis de JavaScript con tipado estático—sin clases ni constructores.

• Su análisis estático previene errores comunes como acceso a variables no inicializadas.

• El scripting CGI permite desarrollo web con despliegue fácil en Docker.

• Totalmente de código abierto con CI/CD, versionado semántico y compilaciones multiplataforma.

— Editorial Team

Advertisement 728x90

Leer después