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)
다음 파일들이 생성됩니다:
web/gene_wasm.js
web/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
이 스크립트는 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으로 컴파일하세요.
모든 명령은 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 테스트는 컴파일러/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)
최신 fib(24) 벤치마크(2025년 측정치)에 따르면, 최적화된 VM은 macOS ARM64 환경에서 약 **초당 3.8M 함수 호출(function calls/sec)**을 기록합니다. 방법론, 과거 비교 데이터 및 프로파일링(profiling) 통찰에 대해서는 docs/performance.md를 참조하십시오.
라이선스 (License)
MIT License