async/await лишь удобная обертка над промисами. Подробней о
async/await можете почитать
тут.
1000 выводится раньше потому, что функция, благодаря использованию ключевого слова
await, дожидается ответа от
Promise возвращаемого функцией
sleep и только после этого продолжает выполнение.
В
V8 async/await так же как и
Promise реализованы на
JavaScript. С реализацией можно ознакомиться
тут.
Как можно видеть реализована она на генераторах.
Аналог вашего примера без использования
async/await:
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
(() => {
setTimeout(() => console.log('1000'), 1000);
sleep(5000).then(() => {
console.log('5');
});
})();
Так же
async function всегда возвращает
Promise, даже если вы ничего не возвращаете.