Tinygo 0.44 surprisingly good...
TinyGo 0.44, 일부 코드의 시작·실행 부담 줄이고 보드 지원 확장
TinyGo 0.44는 초기화 작업을 컴파일 시점으로 옮기고 일부 범위 검사와 문자열 비교 복사를 줄였습니다. ESP32-S3 멀티코어 지원도 추가됐지만, 일반 Go보다 빠르거나 Go 앱 대부분을 빌드한다는 근거는 이번 릴리스에 없습니다.
- 주제
본문
TinyGo 0.44는 일부 프로그램의 시작 작업과 실행 중 비용을 줄이는 컴파일러 변경, 보드 지원 확대를 담았습니다. 초기화 과정에서 맵 조회와 메모리 설정 같은 작업을 컴파일 때 처리하고, 실패할 수 없는 슬라이스 범위 검사를 생략하며 일부 문자열 비교에서 바이트 슬라이스 복사를 피합니다. 다만 릴리스 자료에는 바이너리 크기나 실행 시간의 수치, 일반 Go와 같은 조건에서 측정한 성능 비교가 없습니다.
성능 개선이 적용되는 범위
컴파일 시 초기화하는 작업이 늘면 해당 작업을 기기에서 반복하지 않아도 됩니다. 사용하지 않는 임시 파일을 위한 시작 작업도 줄였습니다. 개발자가 코드를 고치지 않고 0.44로 다시 빌드하면 개선된다고 TinyGo 팀은 설명하지만, 효과의 크기는 프로그램과 타깃에 따라 달라질 수 있습니다. 자료에는 구체적인 측정값이 없습니다.
릴리스에서 보드 관련 변화도 눈에 띕니다. RP2040과 RP2350에 더해 ESP32-S3의 두 코어에서 cores 스케줄러를 사용할 수 있고, 고루틴을 실행할 코어를 지정하는 기능이 추가됐습니다. ESP32-S3에는 USB-OTG 장치와 플래시 BlockDevice 지원도 들어갔습니다. Arduino Uno R4 Minima와 WiFi 등 새 보드 지원도 포함됐습니다.
Go 프로그램 전반과 호환되나
TinyGo의 표준 라이브러리 지원 문서는 패키지를 가져올 수 있는지와 테스트를 통과하는지를 따로 표시합니다. 문서에 따르면 패키지를 가져올 수 있어도 일부 함수나 타입을 쓸 때 컴파일 오류가 날 수 있습니다. 예를 들어 encoding/json은 가져올 수 있지만 테스트 통과 표시는 실패이며, plugin은 가져올 수 없는 패키지입니다. 테스트 결과는 linux/amd64 환경 기준입니다.
따라서 0.44의 최적화는 일부 작업의 개선을 보여주지만, Go 앱 전반의 빌드 호환성이나 일반 Go보다 빠른 실행을 입증하지는 않습니다. 릴리스 자료에는 같은 코드와 타깃, 설정으로 비교한 벤치마크가 없습니다. 빌드 도구 조건도 바뀌어 LLVM 23을 지원하는 한편 LLVM 15 미만 지원은 중단했습니다.
자료: TinyGo 블로그, TinyGo 공식 문서·GitHub 릴리스 / 정리·해설: Trawling
참고 자료
- Packages supported by TinyGo | TinyGo — https://tinygo.org/docs/reference/lang-support/stdlib/
- Release 0.44.0 · tinygo-org/tinygo · GitHub — https://github.com/tinygo-org/tinygo/releases/tag/v0.44.0