Tiny: 인라인 Go 확장을 지원하는 동시성 동적 언어
Tiny는 Go로 구축된 고성능 동시성 프로그래밍 언어 및 런타임 시스템입니다. 동적 코딩의 민첩성과 멀티스레드 런타임 엔진을 결합하며, 소스 파일을 .tbc 명령어로 컴파일하는 스택 기반 바이트코드 가상 머신을 활용합니다.
멀티 티어 실행 및 JIT 컴파일
Tiny는 일반 로직을 위한 효율적인 인터프리터와 성능이 중요한 경로를 위한 Just-In-Time (JIT) 컴파일러로 구성된 멀티 티어 실행 모델을 채택합니다. JIT 엔진은 빈번하게 실행되는(hot) 바이트코드 경로를 네이티브 WebAssembly로 변환하여 네이티브에 가까운 속도를 구현합니다.
리전 아웃라이닝 (Region Outlining)
컴파일러는 함수 본문 및 최상위 코드 내의 핫 루프(hot loops)를 자동으로 식별하여 이를 특화된 JIT 리전으로 아웃라이닝합니다. 이를 통해 개발자가 수동으로 로직을 함수로 캡슐화할 필요 없이 스크립트와 벤치마크를 네이티브 속도로 실행할 수 있습니다.
패킹된 객체 배열 (Packed Object Arrays)
VM과 네이티브 간의 상호 운용성 오버헤드를 줄이기 위해, JIT는 동일한 형태를 가진 객체를 포함하는 배열에 대해 호스트 메모리 미러링을 구현합니다. 필드-컬럼 포인터 테이블을 사용함으로써 런타임은 선형 메모리에서 객체 속성에 직접 접근할 수 있습니다. 이러한 패킹된 배열은 동적 성장과 Wasm 측면의 최적화를 지원합니다.
JIT 최적화 권장 사항
개발자는 다음과 같은 특정 코딩 패턴을 따라 JIT 성능을 극대화할 수 있습니다:
- 타입 힌트 사용: 명시적인 힌트(예:
: number)를 제공하면 JIT가 특화된 머신 코드를 생성하는 데 도움이 됩니다. - 클로저 캡처 피하기: 가변적인 외부 변수를 캡처하는 함수는 JIT 대신 인터프리터에 의해 처리됩니다.
- 동기 방식 유지:
async함수는 현재 JIT 컴파일 대상에서 제외됩니다. - 문자열 연산: 문자열 결합(join) 연산은 JIT 가속이 지원되지만, 대규모 빌드에는 표준 라이브러리의
stringBuilder를 사용하는 것이 권장됩니다.
언어 사양
Tiny는 빠른 프로토타이핑과 견고한 애플리케이션 개발을 위해 설계되었으며, 동적 타이핑과 구조적 검증을 결합합니다.
동적 타이핑 및 구조적 인터페이스
Tiny는 기본적으로 동적 타이핑을 지원하지만, 변수, 매개변수 및 반환 타입에 대해 제네릭과 유니온을 포함한 선택적 정적 타입 힌트를 지원합니다. Tiny는 객체가 런타임에 인터페이스에 따라 검증되는 구조적 타이핑(shape-based validation)을 사용합니다. JIT 엔진은 객체 형태(shape)를 추적하고 선형 메모리 필드 오프셋을 활용하여 이러한 검증을 최적화합니다.
고급 구문 기능
- 구조 분해 할당 (Destructuring Assignment): 중첩된 패턴, 속성 이름 변경, 기본값을 지원하는 객체 및 배열 구조 분해를 지원합니다.
- 클래스 구성 (Class Composition):
embed키워드를 통해 클래스가 다른 클래스 인스턴스에 동작을 위임할 수 있게 하여, 깊은 상속보다는 구성을 선호합니다. - 패턴 매칭 (Pattern Matching):
match블록은 리터럴 값, 변수, 열거형(enum), 유니온 패턴 및 가드(guard)를 지원하며, enum 변형에서 데이터를 추출하는 주요 메커니즘으로 사용됩니다. - 범위 기반 정리 (Scoped Cleanups):
defer문은 조기 반환이나 오류 발생 여부와 관계없이, 함수 호출이 즉시 주변 범위가 exit할 때 실행되도록 보장합니다.
동시성 및 스레딩
Tiny는 이벤트 루프 모델과 달리 OS 레벨의 멀티스레딩을 사용하여 병렬 실행을 구현합니다. spawn 키워드는 격리된 VM 상태 공간에서 새로운 실행 루틴을나 시작하며, 이를 통해 모든 사용 가능한 CPU 코어에서 작업이 동시에 실행될 수 있습니다.
공유 상태는 뮤텍스(mutex)와 네이티브 lock 블록을 통해 관리됩니다. 컴파일러는 데드락을 방지하기 위해 실행이 해당 블록을 벗어날 때 뮤텍스이 자동으로 해제되도록 보장합니다.
WebAssembly를 통한 인라인 Go 확장
Tiny는 native fn 블록을 사용하여 소스 파일 내에서 직접 Go 코드를 작성할 수 있게 합니다. 이 블록들은 TinyGo를 통해 WebAssembly로 컴파일되며 런타임에 로드되어, Tiny 스크립트 내에서 특정 Go 패키지를 사용할 수 있게 합니다.
표준 라이브러리 및 도구
Tiny는 다양한 용도에 맞는 포prehensive한 표준 라이브러리를 제공합니다:
validate: 객체, 배열, 유니온의 스키마 검증을 위한 체이닝 가능한 API.http: 경로 기반 멀티플렉싱을 지원하는 동시성 웹 서버 및 클라이언트.ui: HTML/CSS/JS를 사용하는 WebView 기반 데스크톱 컨테이너로, Tiny 함수와 직접적인 바인딩을 지원합니다.desktop: 키보드, 마우스, 클립보드 상호 작용을 위한 OS 자동화 도구.time,url, 및array: 타이밍, URL 인코딩, 및 네이티브 배열 조작을 위한 유틸리티.
CLI 및 생태계
Tiny CLI는 다음과 같은 주요 명령어를 제공합니다:
tiny run <file>: 바이트코드 캐시를 사용하여 중복 컴파일을 피하고 스크립트를 실행합니다.tiny pack <file> -o <binary>: 바이트코드와 VM 런타임을 하나의 단독 실행 가능한 네이티브 바이너리로 번들링합니다 (약 13MB).tiny dist <file> -o <dir>: 플러그인과 에셋을 포함하여 애플리케이션을 패키징합니다.tiny lsp: 에디터 통합(예: VS Code)을 위한 언어 서버를 시작합니다 (타입 좁히기, 세맨틱 복구, 리팩토링 안전성 등의 기능을 제공합니다).
커뮤니티 관점
이 프로젝트는 상당한 기술적 폭을 보여주지만, 일부 사용자들은 Go 또는 Python을 직접 사용하는 것보다 Tiny의 구체적인 사용 사례에 대해 의문을 제기합니다. 한 사용자는 Tiny가 임시(ad-hoc) 설정 관리 시스템을 위한 고수준 스크립팅 언어로 특히 효과적일 수 있다고 제안했습니다.
"i'm wondering if it can beat just installing go though. I think it'd be interesting to build a adhoc config mgmt system w/ this and use it as a high level scripting language."