Go 코드를 바로 실행하고 추적하는 gomacro, 제네릭은 아직 실험적이에요

Go는 보통 코드를 작성한 뒤 컴파일해서 실행해요. gomacro를 쓰면 터미널에서 표현식과 함수부터 확인하고, 실행 중인 코드를 한 단계씩 추적할 수 있어요. REPL, 소스 디버거, 스크립팅 라이브러리를 한 프로젝트에 묶었다는 점이 눈에 띄어요. 1
핵심 요약
| 구분 | gomacro가 제공하는 기능 | 확인할 점 |
| 대화형 실행 | Go 표현식과 문장, 함수를 입력하면 바로 평가해요 | 일반적인 REPL 사용에는 Go 툴체인이 필요 없어요 |
| 편집 기능 | 라인 편집과 탭 자동 완성을 제공해요 | 키 조작은 Emacs 방식과 비슷해요 |
| 디버깅 | 실행을 멈추고 `step`, `next`, `inspect`, `print` 명령을 쓸 수 있어요 | 해석 중인 문장만 단계별로 추적할 수 있어요 |
| 임베딩 | Go 프로그램에 `Eval()`과 스크립팅 기능을 넣을 수 있어요 | MPL 2.0 조건을 적용 방식에 맞게 확인해야 해요 |
| 제네릭과 매크로 | 자체 제네릭 문법과 Lisp 계열 매크로를 제공해요 | 제네릭 구현은 실험적이며 공식 Go 제네릭과 범위가 달라요 |
1. 컴파일 중심인 Go에 대화형 작업대를 더해요
gomacro는 순수 Go로 만든 인터프리터예요. 명령줄에서 `gomacro`를 실행한 뒤 Go 코드를 입력하면 결과와 타입을 바로 보여줘요. 탭 키로 이름을 자동 완성할 수 있고, 같은 키를 다시 누르면 후보를 차례로 확인할 수 있어요. 간단한 API 동작이나 계산식을 검토할 때 별도 실행 파일을 매번 만들지 않아도 돼요. 2
Go 소스 파일을 스크립트처럼 실행하는 기능도 있어요. 모든 지원 플랫폼에서는 `gomacro FILENAME.go` 형식을 쓸 수 있어요. Linux와 macOS, BSD 같은 유닉스 계열에서는 파일 첫 줄에 `#!/usr/bin/env gomacro`를 넣고 실행 권한을 줘서 직접 실행할 수도 있어요.
실행 중인 코드를 REPL에서 들여다볼 수 있어요
독립 실행 도구로만 쓰는 프로젝트는 아니에요. `fast.New()`로 인터프리터를 만들고 `Eval()`을 호출하면 기존 Go 프로그램 안에 코드 평가 기능을 넣을 수 있어요. 애플리케이션의 함수와 변수, 상수, 타입을 인터프리터에 노출하는 구성도 지원해요. 운영 서비스에서 임의 코드를 받는 용도라면 권한과 입력 범위를 별도로 제한해야 해요. 인터프리터가 파일과 네트워크에 접근할 수 있는 코드까지 실행할 수 있기 때문이에요.
통합 디버거는 해석 중인 코드에서 `step`, `next`, `finish`, `continue`를 제공해요. `env`로 지역 변수와 전역 변수를 보고, `inspect`나 `print`로 표현식을 평가할 수 있어요. 컴파일된 패키지 내부까지 단계별로 들어가는 디버거는 아니에요. 해석되는 문장을 탐색하고 REPL 안에서 값을 바꾸는 작업에 더 가까워요. 2
서드파티 패키지는 운영체제에 따라 절차가 달라요
표준 라이브러리만 쓰는 일반적인 REPL 실행에는 런타임 Go 툴체인이 필요하지 않아요. 서드파티 패키지를 실행 중에 가져올 때는 예외가 생겨요. Linux와 macOS, BSD에서는 패키지를 내려받아 컴파일한 뒤 플러그인으로 불러올 수 있어요. 이때 가져온 라이브러리는 인터프리터가 아니라 컴파일된 속도로 실행돼요.
Windows와 Android 같은 환경에서는 패키지를 가져온 뒤 gomacro를 다시 컴파일해야 할 수 있어요. 프로젝트 문서도 이 과정을 번거로운 제약으로 적고 있어요. 설치에는 Go 1.18 이상이 필요하며 `go install github.com/cosmos72/gomacro@latest` 명령을 사용해요.
제네릭 지원을 공식 Go 문법과 같다고 보면 안 돼요
gomacro의 제네릭은 프로젝트가 자체적으로 실험해 온 두 가지 구현을 말해요. 기본으로 켜진 CTI 방식은 `#[T]` 같은 고유 문법을 쓰고, 제약을 인터페이스 형태로 표현해요. 현재는 제네릭 타입과 함수만 지원해요. 타입 인수 추론과 제네릭 메서드는 아직 구현되지 않았고, 타입이 계약을 실제로 만족하는지도 완전히 검사하지 않아요.
패키지를 가져올 때 해당 패키지의 제네릭 선언을 읽어 오지 못하는 제한도 있어요. 최신 Go 코드 전체를 그대로 해석하는 대체 런타임으로 보기에는 빈틈이 남아 있어요. 제네릭 문법 실험이나 제한된 대화형 작업에 맞는지 먼저 확인하는 편이 안전해요.
gomacro가 제공하는 매크로는 C 전처리기 치환과 달라요. Go 함수가 컴파일 전에 추상 구문 트리를 입력받고 다시 코드로 내보내는 방식이에요. 반복되는 코드를 만드는 도구로 쓸 수 있지만, 매크로 함수는 일반 함수처럼 파일이나 네트워크에도 접근할 수 있어요. 외부에서 받은 매크로를 그대로 실행하면 안 되는 이유예요.
왜 중요한가요
Go 개발자는 작은 실험에도 `main` 함수와 실행 단계를 준비하는 일이 많아요. gomacro는 값 확인, 라이브러리 탐색, 스크립트 실행, 해석 코드 디버깅을 한 REPL에서 이어 갈 수 있게 해요. 특히 수치 계산이나 라이브러리 API를 여러 번 호출하며 결과를 비교할 때 작업 단계를 줄일 수 있어요. 2
도입 판단에서는 지원 범위를 먼저 봐야 해요. 공식 Go 제네릭을 완전히 해석하지 못하고, 서드파티 패키지 로딩 방식도 운영체제마다 달라요. 디버거는 컴파일된 코드 안으로 들어가지 못해요. MPL 2.0 라이선스도 프로그램에 임베드하기 전에 배포 방식과 함께 검토해야 해요.
짧은 실험과 내부 개발 도구에는 잘 맞을 수 있어요. 반면 신뢰하지 않는 사용자가 코드를 입력하는 공개 서비스라면 별도 샌드박스 없이 `Eval()`을 노출하지 않는 편이 좋아요. 파일과 네트워크 접근, CPU와 메모리 사용량, 실행 시간을 프로세스 경계에서 제한해야 해요.
참고 자료
'IT & AI' 카테고리의 다른 글
| Claude Code의 긴 설명을 로컬 LLM으로 줄이는 Vomit (0) | 2026.08.23 |
|---|---|
| 코딩 에이전트가 성능 최적화 비용을 낮추고 있어요 (0) | 2026.08.23 |
| AI가 쓴 글이 읽히지 않는 이유, 업무 문서의 신뢰 비용 (0) | 2026.08.22 |
| AI 코딩 공장이 빨라질수록 인간의 판단은 어디에 남아야 할까요 (0) | 2026.08.22 |
| 47일 TLS 인증서 시대, 갱신보다 배포 자동화가 먼저예요 (0) | 2026.08.22 |