7가지 언어의 async/await, 같은 코드도 다르게 실행된다
Key Point
async/await는 모든 현대 언어가 쓰는 표준이지만, 언어마다 근본적인 설계 선택이 다르면 같은 코드도 전혀 다르게 동작한다는 점을 이해하면 언어 간 마이그레이션이나 라이브러리 통합 시 발생하는 미묘한 버그를 예방할 수 있다.
핵심 요약
- 브라운 대학교 연구팀이 Python, Rust, C#, JavaScript, Swift 등 7개 언어의 async/await 구현을 비교 분석한 논문을 발표했다.
- 동일한 로그 작성 프로그램을 7개 언어에서 실행하면 4가지 다른 결과가 나오는데, 3가지 변형 프로그램에서는 두 언어도 같은 출력을 내지 않는다.
- 연구팀은 async 함수의 '열성/게으름(Eager/Lazy)' 평가, await의 일시 중단 보장, 태스크 생명주기 등 9가지 설계 차원을 식별했다.
- 각 언어가 이 9가지 차원에서 서로 다른 선택을 하기 때문에 작은 프로그램의 동작도 복잡하게 달라진다.
- 연구팀은 이 설계 공간을 형식 의미론으로 모델화해 정확히 어떻게 실행 결과가 발생하는지 설명할 수 있게 했다.