Как стать автором
Обновить

Комментарии 15

Спасибо. Как могла бы выглядеть среда выполнения JavaScript без цикла событий?

Точно так же как с циклом, только без цикла. Ничего принципиально не мешает реализовать его внутри самого приложения, если он нужен.

А рендеринг и другие заприложенские вещи кто будет делать?

Во-первых, про рендеринг в условии не было. В node.js нет рендеринга, например. Во-вторых, приложение может само делать рендеринг в своём цикле.

Ну, хорошо

Обычный промис с setTimeout или fetch вы как на чистом js реализуете?

Или сам setTimeout

Обе эти вещи тоже отсутствуют в спецификации ECMAScript

Ну и обе эти вещи (да и рендеринг тоже) зависят от системных вызовов, так что задача сводится к созданию биндингов к интерфейсам операционной системы и всех интересующих обёрток над этими биндингами

Но, кажется, сам по себе промис определен именно в спецификации языка. Т.е. среда выполнения обязана предоставить микротаски для колбэков then (обычные таски, которые "макро", на голом js создать не из чего, а вот зарезолвленный промис - вполне).

А никаких микро-макро-тасков в спецификации тоже не видно, вместо них какие-то Jobs (возможно ли их реализовать поверх упомянутых мной биндингов — не проверял, но на первый взгляд почему бы и нет)

Почему сразу "на чистом js"? У нас же среда выполнения.

Он не реализуется на чистом js, говорю как человек, которому это понадобилось делать :-)

Просто реализуете в нативе функцию SetTimeout, которая обеспечивает нужный функционал, и скармливаете её js-движку.

// Rendering - 2d - Cairo под Linux есть, под другие есть своё
// 3d тоже можно завести
// Можно ассемблер исполнять из JS через API хоста на машине
// Ограничений нет, только трудности кросплатформенной разработки, чтобы API везде одинаково себя вели для JS
// В теории даже движки можно выбирать на лету (хочу исполнять этот код в JSC/V8/SM/QuickJS/etc.)

// Loop - JS обёртка над epoll/kevents (пока есть задачи в нём мы не завершим исполнение [необработанные ошибки завершат исполнение программы])
const loop = new Loop();
// Timer - kevents + kevents.EVFILT_TIMER / epoll + file descriptor из timerfd_settime
// работает как setInterval, для setTimeout нужно будет в обёртке до вызова callback закрыть таймер
const timer = new Timer(loop, 1000, on_timer);
while (loop.poll() > 0) runMicroTasks();
timer.close();

https://v8.dev/docs/d8 - просто исполнение кода в command line.

Возможно ли в теории реализовать многопоточность если разработчики движка и среды выполнения этого захотят?

И не теоретически, а в спецификации давно все описано для реализации многопоточности. SharedArrayBuffer и Atomics, а там и мютексы и симафоры

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории