# 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:
- Implementación parcial de JavaScript con objetos y tipado estático estructural—no se necesitan palabras clave como
constructor,classointerface. - 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.
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ó:
- 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
Aún no hay comentarios.