Comments 15
Спасибо. Как могла бы выглядеть среда выполнения JavaScript без цикла событий?
Точно так же как с циклом, только без цикла. Ничего принципиально не мешает реализовать его внутри самого приложения, если он нужен.
А рендеринг и другие заприложенские вещи кто будет делать?
Во-первых, про рендеринг в условии не было. В node.js нет рендеринга, например. Во-вторых, приложение может само делать рендеринг в своём цикле.
Ну, хорошо
Обычный промис с setTimeout или fetch вы как на чистом js реализуете?
Или сам setTimeout
Обе эти вещи тоже отсутствуют в спецификации ECMAScript
Ну и обе эти вещи (да и рендеринг тоже) зависят от системных вызовов, так что задача сводится к созданию биндингов к интерфейсам операционной системы и всех интересующих обёрток над этими биндингами
Почему сразу "на чистом 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.
Возможно ли в теории реализовать многопоточность если разработчики движка и среды выполнения этого захотят?
Почему бы и нет. https://github.com/koculu/Topaz
И не теоретически, а в спецификации давно все описано для реализации многопоточности. SharedArrayBuffer и Atomics, а там и мютексы и симафоры
В чем разница между движками и средами выполнения JavaScript?