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:
- Čá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.
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:
- 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
Zatím žádné komentáře.