Недавно я начал изучать JavaScript. Я работал над созданием приложений с Node.js и Angular в течение нескольких месяцев.
Один из основных аспектов, который меня озадачил, заключался в том, как можно написать асинхронный код в JavaScript, в котором мне не нужно беспокоиться о вещах вроде thread синхронизация, условия гонки и т.д.
Итак, я нашел пару интересных статей ([1], [2]), в котором объясняется, как я могу гарантировать, что любая часть кода, который я пишу, всегда будет выполняться одним потоком в то время. Итог, весь мой асинхронный код просто планируется выполнить в какой-то момент в цикле событий. Это очень похоже на то, что планировщик ОС работал бы на машине с одним процессором, где каждый процесс планировал использовать процессор в течение ограниченного времени, давая нам поддельный смысл parallelism. И обратные вызовы будут выглядеть как прерывания.
В статьях не приводятся какие-либо конкретные ссылки, поэтому я подумал, что лучший источник того, как работает механизм выполнения JavaScript, безусловно, должен быть спецификацией языка, и поэтому я получил последнюю копию EcmaScript 5.1.
К моему большому удивлению, я обнаружил, что это поведение выполнения не указано там. Как так? Это похоже на фундаментальный выбор дизайна, сделанный во всех механизмах выполнения JavaScript в браузерах и в node. Интересно, что мне не удалось найти место, где это указано для любого конкретного движка. На самом деле, я не знаю, как люди узнают об этом, так это то, как все работает до такой степени, что это категорически подтверждается в книгах и блогах, подобных тем, которые были упомянуты выше.
Итак, у меня есть набор того, что я считаю интересными вопросами. Я был бы признателен за любые ответы, содержащие идеи, замечания или просто ссылки, указывающие мне в правильном направлении, чтобы понять следующее:
- Так как EcmaScript не указывает, что механизм выполнения JavaScript должен работать с циклом событий, каким образом реализация JavaScript может работать таким образом не только в браузерах, но и в node.js?
- Означает ли это, что я могу реализовать новый механизм JavaScript, совместимый с EcmaScript, который фактически предоставляет истинные возможности многопоточности с такими функциями, как блокировки синхронизации, условия и т.д.
- Эта модель выполнения с использованием цикла событий исключает возможность использования многоядерных процессоров, если я хочу выполнить интенсивную задачу, связанную с ЦП? Я имею в виду, я могу разделить задачу на куски (как объясняется в одной из статей), но это все равно выполняется серийно, а не параллельно. Итак, как механизм JavaScript мог использовать мультикоры для запуска моего кода?
- Знаете ли вы о других авторитетных источниках, где это поведение для какой-либо конкретной реализации механизма JavaScript формально указано?
- Каким образом код может быть переносимым между библиотеками и механизмами, если мы не можем принять несколько вещей о средах выполнения?
Похоже, слишком много вопросов, возможно, чтобы сделать этот пост слишком широким для ответа. Если он закрывается, я попытаюсь спросить их в разных потоках. Но все они вращаются вокруг того, что я хочу лучше понять, почему JavScript и Node были разработаны с циклом событий, и если это указано где-то (помимо исходного кода браузера), которое я мог бы прочитать и получить более глубокое понимание дизайна и решения, принятые здесь и, что более важно, точно знать, что является источником информации для людей, которые пишут книги и сообщения об этом.