Dart 매크로와 데이터 직렬화에 대한 업데이트
Dart 매크로와 데이터 직렬화에 대한 업데이트
Dart 팀이 매크로(macros) 작업을 멈추기로 한 어려운 결정을 내렸어요. 지난 몇 년간 매크로를 프로토타이핑하는 데 많은 시간과 자원을 쏟았지만, 커뮤니티에 자신 있게 배포할 수준에는 미치지 못한다는 판단을 내렸죠. 이 글에서는 그 이유와 함께, 데이터 지원과 빌드 경험을 앞으로 어떻게 개선해 나갈 계획인지 설명하고 있어요.
본문
지난 몇 년 동안 우리는 매크로를 프로토타이핑하는 데 상당한 시간과 자원을 투자했어요. 그런데 아쉽게도 커다란 기술적 난관 하나를 해결할 때마다 또 다른 난관이 나타났어요. 이 시점에 와서는, 우리가 원하는 품질과 개발자 시간 성능을 갖춘 채로 배포할 만한 기능으로 매크로가 곧 수렴할 것 같지 않다고 보고 있어요.
기회 비용(opportunity cost)을 고려한 끝에 — 특히 그 대신 커뮤니티에 배포할 수 있는 기능들을 생각해 보면 — 우리는 매크로 작업을 중단하기로 어려운 결정을 내렸어요.
배경
우리는 Dart가 독특한 강점 조합을 지니고 있다고 믿어요: (1) 정적 언어 특유의 AOT(사전 컴파일) 컴파일과 성능, 그리고 (2) 동적 언어 특유의 빠른 개발 주기(예: stateful hot reload)가 그것이에요. Dart를 발전시켜 오면서 우리는 언어 변경 사항을 이 두 기준에 모두 대입해 신중하게 평가해 왔어요.
풍부한 내부 조사(introspection)에 기반한 강력한 메타프로그래밍은 이 맥락에서 늘 난제였어요. 런타임 내부 조사(예: reflection)는 더 작은 바이너리를 만들 수 있게 해 주는 tree-shaking 최적화를 수행하기 어렵게 만들어요. 정적 내부 조사(예: 매크로)는 여러 형태를 가질 수 있는데, 대부분의 언어는 프로그램의 문법에 대한 제한적인 정적 reflection을 제공하는 구문적(syntactic) 접근을 택해요. 우리는 그것만으로는 목표를 달성하기에 충분하지 않다고 판단했어요. 대신 컴파일 타임에 프로그램에 대한 깊은 의미론적(semantic) 내부 조사를 지원하는 매크로 시스템을 만들고자 했어요. 그런데 의미론적 내부 조사는 안타깝게도 큰 컴파일 타임 비용을 불러와서, stateful hot reload를 뜨겁게(빠르게) 유지하기가 어려워졌어요.
우리가 요구하는 개발자 시간 성능으로 매크로를 배포하려면 아직 너무 멀었다는 결론을 내렸어요. 현재 구현은 편집(예: 정적 분석과 코드 완성)과 증분 컴파일(hot reload의 첫 단계)을 모두 퇴행시켜요. 합리적인 시간 안에 이 문제들을 충분히 해결할 수 있다고 자신하기도 어려워요.
앞으로의 방향
우리는 배포에 더 자신 있는 다른 기능들에 집중하기로 결정했어요.
첫째로 투자할 영역은 Dart에서 데이터를 더 잘 지원하는 것이에요. 이것은 가장 많이 요청된 이슈로, Dart와 Flutter 이슈 트래커 전반에서 최상위에 올라 있는 요청이에요. 사실 매크로의 가장 큰 동기 중 하나가 더 나은 데이터 처리, 직렬화, 역직렬화를 제공하는 것이었어요. 더 나은 데이터를 계속 추구하되, 이번에는 더 맞춤화된(bespoke) 언어 기능으로 해결할 생각이에요.
또 하나 투자할 영역은 빌드 시간과 전반적인 코드 생성 경험을 개선하는 것이에요. 우리는 이미 build_runner 개선점을 찾아뒀어요. 그리고 매크로의 일부로 프로토타이핑했던 augmentations도 배포할 계획이에요. 이 언어 기능은 그 자체로 가치가 있으며 기존 코드 생성 흐름을 개선할 거라고 믿어요. 그래도 이 기능은 독립적으로 배포하는 것을 목표로 계속하고 있어요.
이 소식이 많은 분들에게 실망스럽게 들릴 거란 걸 잘 알고 있어요. 우리는 데이터 너머의 다양한 잠재적 사용 사례가 있기 때문에, 장기적으로는 일반적인 메타프로그래밍 탐구에 계속 관심을 갖고 있어요. 그럼에도 커뮤니티에 분명히 알려 드리고 싶은 건, 가까운 미래에 매크로를 배포하지 않을 거라는 점이에요.
매크로를 사용해 보고 피드백을 주고 PR로 직접 기여해 주신 모든 분들께 감사드려요. 그 기여와 열정은 우리가 다음에 할 작업의 밑거름이 될 거예요. 올해 우리가 제공할 개선 사항을 기대하고 있어요.