Show HN: Gene – 범용 "Gene" 데이터 타입을 중심으로 구축된 Lisp 스타일 언어
요약
Gene는 Lisp 스타일의 구문을 가진 범용적이고 동형성(homoiconic)을 갖춘 프로그래밍 언어입니다. Nim으로 작성된 바이트코드 VM을 기반으로 하며, 독특한 'Gene' 데이터 타입을 통해 타입, 속성, 자식 요소를 하나의 구조로 통합합니다.
핵심 포인트
- Lisp 스타일의 동형성(homoiconic) 언어 설계
- Nim 기반의 바이트코드 가상 머신(VM) 구현
- 타입, 속성, 자식을 통합한 독특한 Gene 데이터 구조
- 액터 모델 기반의 동시성 및 비동기 I/O 지원
Gene 프로그래밍 언어 (Gene Programming Language)
Gene은 Lisp 스타일의 표면 구문 (surface syntax)을 가진 범용적이고 동형성 (homoiconic)을 가진 언어입니다.
이 저장소는 Nim으로 작성된 바이트코드 가상 머신 (VM) 구현체를 호스팅합니다.
저장소 레이아웃 (Repository Layout)
src/gene.nim— VM 실행 파일의 엔트리 포인트 (entry point)src/gene/— 핵심 컴파일러 (compiler), VM, GIR, 그리고 커맨드 모듈bin/—nimble build의 빌드 결과물 (bin/gene)build/— 컴파일러에 의해 생성된 캐시된 Gene IR (*.gir)tests/— VM을 위한 Nim 기반 유닛 테스트 (unit tests) 및 통합 테스트 (integration tests)testsuite/— 기대값 하네스 (expectation harness)를 포함한 블랙박스 (black-box) Gene 프로그램examples/— 샘플 Gene 소스 파일
VM 상태 (VM Status)
공개된 기능 상태 매트릭스 (feature status matrix)와 안정적 핵심 경계 (stable-core boundary)에 대해서는 docs/feature-status.md를 참조하세요.
- 현재 사용 가능 (Available today)
- 바이트코드 컴파일러 (Bytecode compiler) + computed-goto 디스패치 (dispatch)를 사용하는 스택 기반 VM (stack-based VM)
- 참조 인터프리터 (reference interpreter)와 호환되는 S-표현식 (S-expression) 파서
- 미평가 인자 (unevaluated argument) 지원을 포함한 매크로 시스템 (Macro system)
- 기본 클래스 시스템 (
class,new, 중첩 클래스) 및 네임스페이스 (namespaces) - 이벤트 루프 (event loop) 통합을 통한 비동기 I/O (
async,await) gene/actor/*를 통한 액터 우선 동시성 (Actor-first concurrency)- 커맨드라인 툴체인 (
run,eval,repl,parse,compile) io네임스페이스를 통한 파일 I/O 헬퍼 (io/read,io/write, 비동기 변형)
- 진행 중 / 알려진 제한 사항 (In progress / known limitations)
- 인자 바인더 (argument binders)를 넘어서는 패턴 매칭 (Pattern matching)은 아직 실험적임
- 많은 클래스 기능 (생성자, 메서드 디스패치, 상속)에 더 많은 범위 지원이 필요함
- 모듈/임포트 (Module/import) 시스템 및 패키지 관리 (package management)가 완성되지 않음
- ...
주요 기능 (Major Features)
Gene 데이터 구조 — Gene의 핵심 (The Gene Data Structure — The Heart of Gene)
Gene 데이터 구조는 이 언어의 독특하고 중심적인 요소입니다. JSON이나 S-표현식 (S-expressions)과 달리, Gene은 세 가지 구조적 구성 요소를 하나의 통합된 타입으로 결합합니다:
(type ^prop1 value1 ^prop2 value2 child1 child2 child3)
| 구성 요소 | 설명 | 예시 |
|---|---|---|
| Type (타입) | 첫 번째 요소로, 이것이 어떤 종류의 데이터인지 식별합니다. <br>타입은 어떤 Gene 데이터든 될 수 있습니다. | if, fn, <br>(fn f [a b] (+ a b)) |
| ... |
이 통합된 구조는 다음을 가능하게 합니다:
- 동형성 (Homoiconicity): 코드와 데이터가 동일한 표현 형식을 공유합니다.
- 매크로 (Macros): 평가(evaluation) 전 데이터로서 코드를 변환합니다.
- 자기 기술적 데이터 (Self-describing data): 타입 정보가 항상 존재합니다.
- 유연한 DSL (Flexible DSLs): 도메인 특화 언어 (Domain-Specific Languages)를 자연스럽게 구축할 수 있습니다.
예시 - 코드로서의 데이터 (Data as Code):
# 이것은 데이터입니다:
(Person ^name "Alice" ^age 30)
...
기타 주요 특징
| 특징 | 설명 |
|---|---|
| Lisp 스타일 구문 (Lisp-like Syntax) | S-표현식 (S-expression) 기반이지만, Gene 고유의 타입/속성(props)/자식(children) 구조를 가집니다 |
| ... |
빌드하기 (Building)
# 저장소 클론
git clone https://github.com/gene-language/gene
cd gene
...
WASM 빌드 (Emscripten)
nimble wasm
다음 파일들이 생성됩니다:
web/gene_wasm.jsweb/gene_wasm.wasm
WASM 모드는 gene_eval(code: cstring): cstring을 내보내며(export), 시간/랜덤/파일 효과를 위해 호스트 ABI 래퍼(wrapper)를 사용합니다.
현재 WASM의 제한 사항은 안정적인 코드에서 다음과 같은 경우에 GENE.WASM.UNSUPPORTED라는 명시적인 런타임 에러를 발생시키는 것입니다:
- actor/native worker 기반 동시성 (concurrency)
- 동적 네이티브 확장 로딩 (dynamic native extension loading)
- 프로세스/쉘 실행 (process/shell execution)
- 파일 기반 모듈 로딩 및 디렉토리/파일 시스템 삭제 작업
자세한 내용은 docs/wasm.md를 참조하세요.
로컬 LLM 런타임 (llama.cpp)
Gene은 llama.cpp를 통해 로컬 GGUF 모델을 호출할 수 있는 genex/llm 네임스페이스를 제공합니다. 런타임은 선택 사항입니다. -d:GENE_LLM_MOCK 옵션으로 컴파일하여 내장된 모의(mock) 백엔드를 그대로 사용할 수 있습니다. 하지만 실제 추론(inference)을 원하신다면:
- 서브모듈 및 종속성을 가져옵니다:
git submodule update --init --recursive tools/llama.cpp - 네이티브 라이브러리를 빌드합니다 (
build/llama/내부에서 CMake를 실행하고 shim을libgene_llm.a로 컴파일합니다):
이 스크립트는tools/build_llama_runtime.sh # GPU 변형을 위해 GENE_LLAMA_METAL=1 또는 GENE_LLAMA_CUDA=1 설정build/llama/libllama.a와build/llama/libgene_llm.a를 그대로 남겨두어 Nim 빌드/링커(linker)가 자동으로 이를 가져올 수 있게 합니다. - 평소처럼 Gene을 다시 빌드합니다 (
nimble build,nimble speedy등). 라이브러리가 존재하면 추가 플래그는 필요하지 않습니다.
사용 팁:
examples/llm/mock_completion.gene은GENE_LLM_MODEL=/path/to/model.gguf를 찾으며, 환경 변수가 없을 경우tests/fixtures/llm/mock-model.gguf(작은 플레이스홀더)로 대체됩니다.- 네이티브 shim을 다시 빌드하지 않고 모의(mock) 백엔드를 강제하려면,
nimble build -d:GENE_LLM_MOCK으로 컴파일하세요.
커맨드 라인 도구 (Command-Line Tool)
모든 명령은 bin/gene <command> [options]를 통해 전달됩니다:
run <file>—.gene프로그램을 파싱(parse), 컴파일 (GIR 캐싱 포함), 그리고 실행합니다.--no-gir-cache가 제공되지 않는 한build/에 있는 캐시된 IR을 준수합니다.
eval <code>— 인라인 Gene 코드를 평가하거나stdin에서 읽습니다.- 디버그 출력 (
--debug), 명령어 트레이싱(instruction tracing), CSV/Gene 포맷팅을 지원합니다.
- 디버그 출력 (
repl— 다중 라인 입력과 유용한 프롬프트를 지원하는 대화형 REPL입니다.parse <file | code>— Gene 소스를 파싱하고 AST 표현을 출력합니다.compile— 바이트코드(bytecode) 또는 디스크의.gir로 컴파일합니다 (-f pretty|compact|bytecode|gir,-o,--emit-debug).
전체 명령 목록과 예시는 bin/gene help를 실행하세요.
예시 (Examples)
# Hello World
(print "Hello, World!")
...
추가 프로그램과 CLI 시연은 examples/를 참조하세요.
테스트 (Testing)
# 큐레이션된 Nim 테스트 스위트를 실행합니다 (gene.nimble 참조)
nimble test
...
Nim 테스트는 컴파일러/VM 내부를 실행하며, 셸(shell) 스위트는 실제 Gene 코드를 엔드 투 엔드(end-to-end)로 실행합니다.
문서 (Documentation)
docs/README.md에 있는 문서 인덱스(documentation index)는 현재의 아키텍처 노트(architecture notes), 설계 논의(design discussions), 그리고 구현 일지(implementation diaries)를 나열합니다. 주요 내용은 다음과 같습니다:
docs/feature-status.md— 공개 기능 상태 매트릭스(feature-status matrix) 및 안정적 코어 경계(stable-core boundary)docs/architecture.md— VM 및 컴파일러(compiler) 설계 개요docs/gir.md— Gene 중간 표현(Intermediate Representation) 형식docs/performance.md— 벤치마크(benchmark) 데이터 및 최적화 로드맵(optimisation roadmap)
성능 (Performance)
최신 fib(24) 벤치마크(2025년 측정치)에 따르면, 최적화된 VM은 macOS ARM64 환경에서 약 **초당 3.8M 함수 호출(function calls/sec)**을 기록합니다. 방법론, 과거 비교 데이터 및 프로파일링(profiling) 통찰에 대해서는 docs/performance.md를 참조하십시오.
라이선스 (License)
AI 자동 생성 콘텐츠
본 콘텐츠는 HN Code Generation의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기