HydraScript: 대학 프로젝트에서 정적 타이핑 JSON 파싱 CGI 도구로
C# 개발자가 만든 HydraScript은 JavaScript 문법에 정적 타이핑을 결합한 프로그래밍 언어입니다. 이 프로젝트는 학생 논문에서 시작해 Docker로 웹 서비스를 배포할 수 있는 오픈소스 CGI 스크립팅 도구로 진화했습니다.
학생 프로젝트에서 오픈소스 강자로
HydraScript은 바우만 모스크바 국립공대 IU-9 학과에서 "확장된 JavaScript 부분집합"이라는 제목의 논문 프로젝트로 시작했습니다. 4년간의 아르바이트 개발 끝에 GitHub Actions CI/CD, 의미적 버전 관리, 자동 릴리스를 갖춘 완성도 높은 오픈소스 프로젝트로 성장했습니다. Native AOT를 사용해 Windows (x64), macOS (arm64), Linux (x64)용 인터프리터 바이너리를 빌드하며 런타임 종속성을 없앴습니다.
주요 프로젝트 목표:
- 객체와 구조적 정적 타이핑을 지원하는 부분 JavaScript 구현—
constructor,class,interface키워드 불필요. - 현대 정적 분석 기법의 공개 리버스 엔지니어링.
- 오픈소스 코드로 컴파일러 기술의 신비를 풀어냄.
- 표준 컴파일러 과제의 명확한 구현 수집.
정적 분석: 핵심 기능
HydraScript의 타입 시스템은 다른 언어에서 런타임에만 잡히는 문제를 컴파일 타임에 미리 잡아냅니다.
초기화되지 않은 변수 접근 방지
인터프리터는 초기화 순서를 추적해 런타임 크래시를 막습니다. 문제가 있는 TypeScript/JavaScript 코드 예시:
let x = f()
function f() {
console.log(x) // Error: x referenced before assignment
return 5
}
HydraScript은 컴파일 타임에 이를 플래그합니다.
스마트 기본값 할당
C#처럼 초기화되지 않은 지역변수로 컴파일 에러를 내는 대신, 추론된 타입에 따라 기본값을 자동 할당합니다:
let x: number
>>> x // 0
let xArr: number[]
>>> xArr // []
let s: string
>>> ~s // 0 (string length)
심볼별 별도 네임스페이스
언어는 VariableSymbol, TypeSymbol, FunctionSymbol 세 가지 심볼 타입을 사용합니다. 이름은 타입 내에서만 유일하면 되므로 유연한 재사용이 가능합니다:
type x = number
let x:x
function x(x:x) {
>>>x
x = x + 1
}
x(x)
웹 개발을 위한 CGI 지원
백엔드 실무에 활용할 수 있도록 CGI 스크립팅을 지원합니다. 이를 위해 다음이 필요했습니다:
- 문자열 조작 API
- Stdout 출력
- 환경 변수 읽기
- Shebang 주석 지원
Docker 배포 설정
Apache httpd 기반 HydraScript 인터프리터 Docker 이미지 설정:
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
샘플 CGI 스크립트: 쿼리스트링을 JSON으로 파싱
URL 파라미터를 구조화된 JSON으로 변환하는 스크립트로 실전 활용 예시:
#!/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()
a=1&b=bla&c=false 입력 시 출력:
{
"result": [
{"name": "a", "value": "1"},
{"name": "b", "value": "bla"},
{"name": "c", "value": "false"}
]
}
주요 요약
• HydraScript은 JavaScript 문법에 정적 타이핑을 더해 클래스나 생성자 없이 사용 가능.
• 정적 분석으로 초기화되지 않은 변수 접근 등 흔한 버그를 방지.
• CGI 스크립팅으로 Docker 배포가 간편한 웹 개발 지원.
• CI/CD, 의미적 버전 관리, 크로스플랫폼 빌드를 갖춘 완전 오픈소스.
— Editorial Team
아직 댓글이 없습니다.