
Go 언어의 영역 확장, TinyGo라는 프로젝트
Go 언어 좋아하시는 분들 많으시죠? 간결한 문법, 강력한 동시성 지원, 빠른 컴파일 속도까지. 서버 사이드 개발에서는 이미 확고한 입지를 가지고 있는데요. 그런데 Go로 아두이노 같은 마이크로컨트롤러를 프로그래밍하거나, 웹 브라우저에서 돌아가는 WebAssembly 모듈을 만들 수 있다면 어떨까요? TinyGo가 바로 그걸 가능하게 해주는 프로젝트예요.
TinyGo는 Go 언어의 대안 컴파일러예요. 이게 뭐냐면, 같은 Go 코드를 작성하되 기존 Go 컴파일러 대신 TinyGo 컴파일러로 빌드하면, 아주 작은 바이너리가 만들어지는 거예요. 기존 Go 컴파일러가 만드는 실행 파일은 가장 단순한 "Hello World"조차 수 메가바이트인데, TinyGo는 이걸 수십 킬로바이트 수준으로 줄여줘요. 메모리가 겨우 몇십 KB밖에 없는 마이크로컨트롤러에서도 Go 코드를 돌릴 수 있게 되는 거죠.
임베디드 개발, 그동안 뭐가 불편했는지
임베디드 시스템 개발이라고 하면 보통 C나 C++을 떠올리시죠. 하드웨어에 가장 가까운 언어들이고, 수십 년간 쌓인 생태계가 있으니까요. 하지만 솔직히 C/C++로 개발하는 건 꽤 힘든 일이에요. 메모리를 직접 관리해야 하고, 포인터 에러 하나에 디버깅으로 하루를 날리기도 하고, 빌드 시스템 설정하는 것만으로도 진이 빠지거든요.
Rust가 이런 문제를 해결하겠다고 나섰고 실제로 임베디드 Rust 커뮤니티가 꽤 성장했는데, Rust는 러닝 커브가 높다는 문제가 있어요. 소유권(ownership)이나 라이프타임(lifetime) 같은 개념이 처음 배울 때 상당히 어렵거든요.
TinyGo는 이 사이의 빈틈을 노려요. Go의 쉬운 문법과 가비지 컬렉터의 편리함을 유지하면서, 바이너리 크기와 메모리 사용량을 극단적으로 줄여서 임베디드 환경에서도 돌아가게 만든 거예요.
어떤 하드웨어를 지원하나
TinyGo가 지원하는 보드 목록은 꽤 인상적이에요. Arduino Uno, Arduino Nano 33 같은 클래식한 아두이노 보드는 물론이고, BBC micro:bit, Adafruit Circuit Playground, Raspberry Pi Pico 같은 인기 있는 교육용/취미용 보드도 지원해요. ESP32 같은 WiFi 내장 마이크로컨트롤러도요.
사용법도 직관적이에요. tinygo flash -target=arduino-nano33 main.go 같은 명령어 하나로 Go 코드를 컴파일해서 보드에 바로 올릴 수 있어요. GPIO 핀 제어, I2C 통신, SPI 통신 같은 하드웨어 인터페이스도 Go 패키지 형태로 깔끔하게 제공되고요.
WebAssembly 지원, 이것도 꽤 쓸 만해요
임베디드만큼이나 주목할 부분이 WebAssembly(Wasm) 지원이에요. WebAssembly는 브라우저에서 네이티브에 가까운 성능으로 코드를 실행할 수 있게 해주는 기술인데요. 기존 Go 컴파일러도 Wasm 타겟을 지원하긴 하지만, 출력되는 Wasm 모듈 크기가 너무 커요. 간단한 함수 하나 넣어도 수 MB가 나오거든요.
TinyGo로 빌드하면 이 크기가 획기적으로 줄어들어요. 웹 프론트엔드에서 무거운 계산 로직을 Go로 작성하고 Wasm으로 빌드해서 쓴다거나, 서버리스 엣지 환경(Cloudflare Workers, Fastly Compute 같은 곳)에서 Go 기반 Wasm 모듈을 배포하는 시나리오에서 TinyGo가 실질적인 선택지가 되는 거예요.
WASI(WebAssembly System Interface) 지원도 있어서, 브라우저 밖에서도 Wasm 모듈을 활용할 수 있어요. 플러그인 시스템이나 샌드박스된 실행 환경을 만들 때도 유용하죠.
주의할 점도 있어요
TinyGo가 만능은 아니에요. 표준 Go의 모든 기능을 지원하지는 않거든요. reflect 패키지 지원이 제한적이고, 고루틴(goroutine)과 채널도 지원하지만 구현 방식이 표준 Go와 달라서 동작이 미묘하게 다를 수 있어요. cgo 지원도 제한적이고요. 그래서 기존에 Go로 작성된 라이브러리를 그대로 가져다 쓸 수 있을 거라고 기대하면 안 돼요. 호환되는 것도 많지만, 안 되는 것도 꽤 있어요.
또한 가비지 컬렉터가 있다 보니, 하드 리얼타임이 필요한 환경(예: 모터 제어나 안전 관련 시스템)에서는 GC 멈춤 때문에 문제가 될 수 있어요. 이런 곳에서는 여전히 C나 Rust가 더 적합해요.
업계 맥락: 언어의 영역 확장 전쟁
사실 "하나의 언어로 더 많은 영역을 커버하자"는 움직임은 업계 전반의 트렌드예요. Rust는 시스템 프로그래밍에서 시작해서 웹(Wasm), 임베디드, 심지어 리눅스 커널까지 영역을 넓히고 있고, TypeScript는 Deno와 Bun을 통해 서버 사이드로 확장하고 있죠. Python은 MicroPython으로 임베디드에 진출했고요.
TinyGo는 Go 진영의 영역 확장 무기인 셈이에요. Go 공식 팀이 만든 건 아니고 커뮤니티 프로젝트지만, LLVM 기반으로 탄탄하게 만들어져 있고, 꾸준히 발전하고 있어요.
한국 개발자에게 주는 시사점
Go를 이미 쓰고 계신 분이라면, 취미 프로젝트로 IoT 디바이스를 만들거나 Wasm 모듈을 빌드할 때 TinyGo를 한번 써보시는 걸 추천해요. 새로운 언어를 배울 필요 없이 익숙한 Go 문법으로 시작할 수 있다는 게 큰 장점이니까요. 특히 Raspberry Pi Pico 같은 저렴한 보드와 조합하면 아주 적은 비용으로 하드웨어 프로그래밍을 경험해볼 수 있어요.
WebAssembly 쪽도 관심 가져볼 만해요. 프론트엔드에서 무거운 데이터 처리가 필요하거나, 엣지 컴퓨팅 환경에서 Go 코드를 돌리고 싶다면 TinyGo가 현실적인 솔루션이 될 수 있거든요.
정리
Go의 심플함을 마이크로컨트롤러와 WebAssembly 세계로 가져온 TinyGo, 임베디드 개발의 진입 장벽을 낮춰주는 흥미로운 프로젝트예요. 혹시 Go로 하드웨어를 제어하거나 Wasm 모듈을 만들어보신 경험이 있으신가요? 아니면 임베디드 개발에서 여전히 C/Rust가 답이라고 생각하시나요?
🔗 출처: Hacker News
"비전공 직장인인데 반년 만에 수익 파이프라인을 여러 개 만들었습니다"
실제 수강생 후기- 비전공자도 6개월이면 첫 수익
- 20년 경력 개발자 직강
- 자동화 프로그램 + 소스코드 제공