홈으로 돌아가기

HydraScript: Docker용 정적 타이핑과 CGI를 갖춘 언어

HydraScript — JavaScript 구문을 사용하고 정적 타이핑을 지원하는 프로그래밍 언어로, 오픈 소스 프로젝트로 개발되었습니다. 이 글에서는 언어의 기능, 정적 분석 시스템, Docker 배포와 함께하는 CGI 스크립팅의 실용적인 사용에 대해 논의합니다.

HydraScript으로 웹 서비스 만들기: JSON 파싱부터 Docker까지
Advertisement 728x90

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)용 인터프리터 바이너리를 빌드하며 런타임 종속성을 없앴습니다.

주요 프로젝트 목표:

Google AdInline article slot
  • 객체와 구조적 정적 타이핑을 지원하는 부분 JavaScript 구현—constructor, class, interface 키워드 불필요.
  • 현대 정적 분석 기법의 공개 리버스 엔지니어링.
  • 오픈소스 코드로 컴파일러 기술의 신비를 풀어냄.
  • 표준 컴파일러 과제의 명확한 구현 수집.

정적 분석: 핵심 기능

HydraScript의 타입 시스템은 다른 언어에서 런타임에만 잡히는 문제를 컴파일 타임에 미리 잡아냅니다.

초기화되지 않은 변수 접근 방지

인터프리터는 초기화 순서를 추적해 런타임 크래시를 막습니다. 문제가 있는 TypeScript/JavaScript 코드 예시:

let x = f()
function f() {
    console.log(x) // Error: x referenced before assignment
    return 5
}

HydraScript은 컴파일 타임에 이를 플래그합니다.

Google AdInline article slot

스마트 기본값 할당

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 스크립팅을 지원합니다. 이를 위해 다음이 필요했습니다:

Google AdInline article slot
  • 문자열 조작 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

Advertisement 728x90

다음 읽기