Rust lang 팀이 await 연산자 문법으로 후위 점 표기인 future.await를 선택한 배경과 트레이드오프, 대안 문법(점 키워드, 시길) 논의, 그리고 1.37에서 async/await 최소 기능 안정화 계획을 공유합니다.
2019년 5월 28일
이전 글에서 lang 팀이 5월 23일 회의에서 await 연산자의 문법에 대한 최종 결정을 내릴 것이라고 말했습니다. 그 회의는 지난 목요일이었고, 우리는 실제로 결론에 도달했습니다. 간단히 말해, 앞서 제가 개략적으로 제시했던 예비 제안으로 나아가기로 했습니다: 후위 점 표기법, future.await. 배경을 더 알고 싶다면 제 블로그의 이전 글에 더해, 4월에 정리된 트레이드오프에 관한 글을 읽어보세요.
이 제안과 전반적인 우리의 설계 프로세스에 관해 분명히 해두고 싶은 몇 가지가 있습니다.
우선, Rust 언어 설계에서 절대적인 원칙은 매우 많지 않습니다. 우리가 할 수 없는 (혹은 반드시 해야 하는) 일들이 몇 가지 있긴 합니다 — 예컨대 타입 시스템은 건전해야(sound) 합니다. 그러나 질문의 대다수는 _트레이드오프_의 문제입니다 — 서로 다른 제안들의 장단점을 저울질해 우리가 가장 바람직하다고 믿는 전진 경로를 찾는 것이죠. 종종 거의 모두에게 명백히 우월한 선택지가 있습니다. 하지만 때로는 모든 제안이 서로 다른 긍정적·부정적 속성을 갖고, 각각의 우리가 그 속성들을 평가하는 방식이 달라 상충하는 의견으로 이어지기도 합니다. 이번이 정확히 그런 경우였습니다.
이 논의들에서, 사람들이 크게 평가하는 비용이 절대적 기준으로 격상되는 모습을 보았습니다. 어떤 제안의 부정적 속성이 너무 나빠서 우리는 도저히 _그렇게 할 수 없다_고 단정하는 식입니다. 대부분의 경우, 이런 틀짓기는 도움이 되지 않습니다. 이것은 논의를 닫아버립니다. 왜냐하면 동의하지 않는 사람들에게는 이 문제가 실제라는 점을 인정하면서도, 비용의 균형을 다르게 잡아 여전히 그 선택이 더 낫다고 주장하기 어렵게 만들기 때문입니다. 우리는 이런 이분법적이고 흑백 논리를 피할 수 있어야 합니다.
그리고 이 생각에 하나를 덧붙이자면, 언어 팀의 각 구성원은 이러한 비용을 서로 다르게 평가합니다. 개인적으로, 우리 중 몇 명은 여기서 선택한 문법과 다른 선택을 했을 수도 있습니다. 제 경우도, 제가 비용을 평가하는 방식으로는 이것이 가장 선호하는 제안은 아닙니다. 그러나 우리는 모두 사용자가 필요로 하는 기능을 제공하며 앞으로 나아가고자 하는 열망과, 여러 제안이 실현 가능하다는 이해를 공유하고 있습니다. 이번 결정은 잘 정당화되었고, 언어 팀 구성원들 사이에서 서로 다른 비용에 대한 “합의된 가중치”를 반영합니다. 만약 당신이 이 비용들을 달리 가중하여 다른 선택을 했을 것이라면, 그럼에도 이러한 가치들을 포용하고 우리가 전진하고 있음에 기뻐해 주시기를 바랍니다.
지난 몇 주의 논의에서 불거진 몇 가지 대화에 대해 추가로 분명히 하고 싶은 점이 있습니다:
@await 같은 시길 문법을 아주 간략히만 다뤘습니다. 다시 한 번 이것이 비용을 저울질하는 문제임을 분명히 하고 싶습니다. 언어에 의미를 갖는 새로운 시길을 도입하는 데에는 실제 비용이 있습니다. 사용할 수 있는 시길은 한정되어 있고(비ASCII 시길은 입력 접근성 관점에서 실용적이지 않다고 봅니다), 새로운 시길이 추가될 때마다 사용자가 학습해야 할 표면적이 넓어지며, 너무 많은 시길 사용은 많은 사람들에게 미학적으로 불쾌하게 느껴집니다. 새로운 시길을 도입하는 비용과 이미 많은 의미를 짊어진 . 연산자를 재사용하는 비용을 비교했을 때, 우리는 .을 사용하는 편이 비용이 더 적다고 느꼈습니다. 일부 사용자는 동의하지 않을 수 있겠지만, 이것이 흑백의 문제가 아니라 각기 장단점을 지닌 선택지들의 비교라는 점을 이해해 주시길 바랍니다.저는 Rust 1.37 릴리스에서 async/await의 최소 기능 버전을 안정화하자고 제안하는 안정화 보고서를 적극적으로 작성하고 있습니다. 1.37은 8월 중순에 릴리스되며, 7월 4일에 브랜치를 분기합니다. 이는 이 기능의 최소 버전을 안정화하기 위해 구현, 문서, 설계가 모두 충분한 상태인지 확인할 시간이 약 한 달 남았다는 뜻입니다. 이것이 async/await 기능의 끝은 아닙니다 — 최소 기능에는 많은 확장이 빠지겠지만 — 고성능 네트워크 서비스를 위해 Rust를 사용하고자 하는 모든 이들에게 중요한 이정표가 될 것입니다.