4. Session과 CodeFile: '달빛 약속' 실행의 두 축
'달빛 약속' 코드가 실행되는 모든 과정은 Session이라는 큰 틀 안에서 이루어집니다. 그리고 이 Session은 하나 이상의 CodeFile을 관리하며 코드 실행의 생명주기를 조율합니다. 이번 장에서는 이 두 가지 핵심 개념이 어떻게 '달빛 약속'의 실행 환경을 구성하고, 언어의 유연성과 확장성을 제공하는지 자세히 알아보겠습니다.
CodeFile: 소스코드 파일의 대리인
CodeFile은 우리가 작성하는 .yak
소스코드 파일 하나를 나타내는 클래스입니다. 파일 시스템에 존재하는 물리적인 파일이 '달빛 약속' 내부에서는 CodeFile 인스턴스로 변환되어 처리됩니다. CodeFile은 단순히 코드 내용을 담고 있는 것을 넘어, 해당 코드의 토큰화, 파싱, 그리고 실행 과정을 캡슐화하고 관리합니다.
주요 특징은 다음과 같습니다.
- 코드 내용 및 메타데이터: 파일의 실제 소스코드 내용(
text
)과 파일 이름(fileName
)을 가집니다. - 지연 평가 및 캐싱:
tokens
(토큰 목록)와ast
(추상 구문 트리)는 getter로 구현되어 있어, 처음 접근할 때 토큰화 및 파싱을 수행하고 그 결과를 캐싱합니다. 이는 불필요한 연산을 줄여 성능을 최적화합니다. - 실행 결과 캐싱:
run()
메소드를 통해 코드를 실행한 후, 최종 스코프(ranScope
)를 캐싱합니다. 동일한 CodeFile이 여러 번 실행되더라도 실제 코드를 다시 실행하지 않고 캐시된 스코프를 반환하여 효율성을 높입니다. - 세션 마운트:
mount(session: YaksokSession)
메소드를 통해 자신이 속할YaksokSession
인스턴스에 연결됩니다. 이를 통해 CodeFile은 세션의 설정이나 상태에 접근할 수 있게 됩니다.
CodeFile 클래스는 /core/type/code-file.ts
에 정의되어 있습니다.
YaksokSession: 실행 환경의 총괄 지휘자
YaksokSession은 '달빛 약속' 코드의 실행 생명주기를 총괄하는 핵심 클래스이자, '달빛 약속' 인터프리터의 공개 API(Public API)이자 퍼사드(Facade) 역할을 수행합니다. 모든 코드 실행은 이 세션을 통해 시작되고 관리됩니다.
YaksokSession의 주요 역할은 다음과 같습니다.
- CodeFile 모듈 관리:
addModule(moduleName, code)
메소드를 통해 CodeFile 인스턴스를 생성하고, 이를files
맵에 모듈 이름(moduleName
)을 키로 저장하여 관리합니다.runModule(moduleName)
을 호출하면 해당 모듈을 찾아 실행합니다. - 실행 환경 설정:
SessionConfig
를 통해stdout
(출력),stderr
(오류 출력),executionDelay
(실행 지연),flags
(기능 플래그),events
(이벤트 구독),signal
(실행 중단 시그널) 등 세션의 동작을 사용자화하는 다양한 설정을 관리합니다. - FFI(Foreign Function Interface) 확장:
extend(extension)
메소드를 통해 외부 함수(FFI) 런타임을 추가하고 관리할 수 있습니다. 이는 '달빛 약속'이 JavaScript/TypeScript 환경의 기능을 활용할 수 있도록 하는 중요한 확장 지점입니다. - 기본 컨텍스트(
baseContext
) 제공:setBaseContext
를 통해 모든 CodeFile이 공유할 수 있는 전역 스코프와 같은 기본 컨텍스트를 설정할 수 있습니다. 이는 파일 간의 변수 및 함수 공유를 가능하게 합니다. - 실행 흐름 제어:
runModule
메소드는 CodeFile.run()을 호출하여 실제 실행을 시작하고, 실행 중 발생하는 오류나AbortedSessionSignal
과 같은 특별한 시그널을 처리하여 프로그램의 흐름을 제어합니다.
YaksokSession 클래스는 /core/session/session.ts
에 정의되어 있으며, 관련 설정은 /core/session/session-config.ts
에서 확인할 수 있습니다.
왜 Session과 CodeFile이 중요한가요?
- 모듈 시스템: 여러
.yak
파일을 모듈처럼 관리하고, 파일 간에 함수나 변수를 공유하며 복잡한 애플리케이션을 구성할 수 있습니다. - 재사용성 및 효율성: CodeFile의 캐싱 메커니즘 덕분에 동일한 코드를 여러 번 실행하거나 참조할 때 불필요한 재연산을 피할 수 있습니다.
- 확장성: YaksokSession의 FFI 확장 기능을 통해 '달빛 약속'의 기능을 외부 JavaScript/TypeScript 코드로 쉽게 확장할 수 있습니다.
- 독립적인 실행 환경: 필요에 따라 새로운 YaksokSession을 생성하여 완전히 독립적인 실행 환경을 구축할 수 있어, 테스트나 특정 기능 격리에 유용합니다.