ECMA-262에는 이벤트 루프라는 말이 한 번도 안 나와요. 명세가 정의하는 건 잡(job)과, 프로미스 반응이 실행될 준비가 됐을 때 엔진이 호출하는 HostEnqueuePromiseJob이라는 호스트 훅이에요. 그 잡을 실제로 언제 돌리고 그 사이에 뭘 돌릴지는 호스트가 정해요.
그래서 setTimeout은 언어 명세에 아예 없고, 타이머 콜백이 .then 콜백보다 먼저냐는 논쟁도 ECMA-262만 읽어서는 결론이 안 나요. 다음 타이머 태스크 전에 프로미스 잡을 전부 비운다는, 다들 믿고 쓰는 순서는 HTML 이벤트 루프와 Node에서 오는 거지 코어 명세에서 오는 게 아니에요.
그래도 쓸모 있는 구분이에요. 한 턴 안에서 프로미스 반응은 큐에 들어간 순서대로 돌고, 이미 resolve된 값에 await를 걸어도 잡 하나를 기다리기 때문에 그 뒤 코드가 동기적으로 실행되는 일은 없어요. Dart도 같은 두 단계 구조라서 scheduleMicrotask로 넣은 작업이 대기 중인 이벤트보다 먼저 돌아요.
호스트들은 꼭 그럴 필요가 없는 부분까지 서로 맞춰 줘요. 다만 명세가 그린 적도 없는 그림으로 시작하는 설명이 좀 줄었으면 좋겠어요.

