Zpět na domů

HydraScript: jazyk se statickou typizací a CGI pro Docker

HydraScript — programovací jazyk se syntaxis JavaScript a statickou typizací, vyvinutý jako open-source projekt. Článek popisuje vlastnosti jazyka, systém statické analýzy a praktické použití pro CGI-skriptování s nasazováním v Dockeru.

Vytváříme webové služby na HydraScript: od parsování JSON po Docker
Advertisement 728x90

HydraScript: od diplomového projektu k CGI nástroji pro parsování JSON

Vývojář v C# vytvořil programovací jazyk HydraScript, který kombinuje syntaxi JavaScriptu se statickým typováním. Projekt se vyvinul z akademické práce na open-source nástroj s podporou CGI skriptování, umožňující nasazení webových služeb v Docker.

Evoluce akademického projektu na open-source nástroj

Původně byl HydraScript koncipován jako diplomová práce "Rozšířená podmnožina JavaScriptu" na katedře IU-9 MGTU pojmenované po Baumana. Během čtyř let večerního vývoje se projekt transformoval na plnohodnotný open-source produkt s CI/CD na GitHub Actions, sémantickým verzováním a automatickými vydáními. Binární soubory interpretoru jsou sestaveny pro Windows (x64), macOS (arm64) a Linux (x64) v režimu Native AOT, což vylučuje závislosti na runtime.

Hlavní cíle projektu:

Google AdInline article slot
  • Částečná implementace JavaScriptu s objekty a strukturální statickou typizací bez klíčových slov constructor, class, interface.
  • Veřejný reverzní inženýring moderních metod statické analýzy.
  • Demystifikace kompilátorových technologií prostřednictvím otevřeného zdrojového kódu.
  • Sběr srozumitelných implementací standardních kompilátorových úloh.

Statická analýza jako klíčová výhoda

Systém typů HydraScript zajišťuje kontroly, které v jiných jazycích probíhají pouze během běhu.

Detekce přístupu k neinicializovaným proměnným

Interpretor analyzuje pořadí inicializace, čímž předchází chybám za běhu. Příklad problematického kódu v TypeScript/JavaScript:

let x = f()
function f() {
    console.log(x) // Chyba: přístup k x před přiřazením
    return 5
}

HydraScript tuto problém detekuje ve fázi kompilace.

Google AdInline article slot

Automatické výchozí hodnoty

Na rozdíl od C#, kde neinicializované lokální proměnné způsobují chybu kompilace, HydraScript přiřazuje výchozí hodnoty na základě odvozeného typu:

let x: number
>>> x // 0

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

let s: string
>>> ~s // 0 (délka řetězce)

Oddělené jmenné prostory pro symboly

Jazyk podporuje tři typy symbolů: VariableSymbol, TypeSymbol a FunctionSymbol. Jedinečnost identifikátorů je vyžadována pouze v rámci jednoho typu, což umožňuje používat stejné jméno pro různé entity:

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

CGI-integrace pro webový vývoj

Pro praktické použití HydraScript v backend vývoji byla přidána podpora CGI skriptování. Implementace vyžadovala:

Google AdInline article slot
  • API pro práci s řetězci
  • Výstup do stdout
  • Čtení proměnných prostředí
  • Podporu shebang-komentářů

Nasazení v Docker prostředí

Konfigurace Docker image založené na httpd (Apache 2) s nainstalovaným interpretorem 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

Příklad CGI skriptu pro parsování QueryString

Skript převádí parametry URL na strukturovaný JSON, demonstrující praktické použití jazyka:

#!/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()

Pro řetězec a=1&b=bla&c=false skript vrátí:

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

Co je důležité

• HydraScript implementuje hybridní přístup: syntax JavaScriptu se statickou typizací bez tříd a konstruktorů.

• Systém statické analýzy předchází běžným chybám, jako je přístup k neinicializovaným proměnným.

• Podpora CGI skriptování umožňuje používat jazyk pro webový vývoj s nasazením v Docker.

• Projekt se rozvíjí jako open-source s kompletním vývojovým cyklem: CI/CD, sémantické verzování, křížově platformní sestavení.

— Editorial Team

Advertisement 728x90

Číst dál