https://denolib.gitbook.io/guide/codebase-basics/infrastructure
-
Внешний интерфейс TypeScript Здесь реализованы общедоступные интерфейсы, API и большинство важных функциональных возможностей, которые напрямую не требуют системных вызовов. Сгенерированный автоматически документ API TypeScript доступен в данный момент по адресу https://deno.land/typedoc (который может быть изменен в будущем). TypeScript / JavaScript рассматривается как «непривилегированная сторона», которая по умолчанию не имеет доступа к файловой системе или сети (поскольку они работают в V8, которая является средой «песочницы»). Это возможно только благодаря передаче сообщений в бэкэнд Rust, который является «привилегированным». Поэтому многие API-интерфейсы Deno (особенно вызовы файловой системы) реализованы на стороне TypeScript как чисто создающие буферы для данных, отправляющие их в бэкэнд Rust через средние привязки libdeno и ожидающие (синхронно или асинхронно) отправки результата назад.
-
C ++ libdeno Middle-end libdeno - это тонкий слой между интерфейсом TypeScript и бэкэндом Rust, служащий для взаимодействия с V8 и предоставления только необходимых привязок. Это реализовано с C / C ++. libdeno предоставляет API-интерфейсы передачи сообщений Send и Receive сторонам TypeScript и Rust. Он также используется для запуска платформ / изоляторов V8 и создания / загрузки снимка V8 (большой двоичный объект данных, который представляет информацию о сериализированной куче. Подробности см. В https://v8.dev/blog/custom-startup-snapshots). Стоит отметить, что снимок для Deno также содержит полный компилятор TypeScript. Это позволяет значительно сократить время запуска компилятора.
-
Rust Backend В настоящее время серверная часть, или «привилегированная сторона», которая имеет доступ к файловой системе, сети и среде, реализована в Rust. Для тех, кто не знаком с этим языком, Rust - это язык системного программирования, разработанный Mozilla, с акцентом на безопасность памяти и параллелизма. Он также используется в таких проектах, как Servo. Бэкэнд Rust перенесен из Go, который послужил для создания оригинального прототипа Deno, представленного в июне 2018 года. Причины перехода связаны с опасениями по поводу двойного GC. Подробнее читайте в этой теме.
V8 V8 - это движок JavaScript / WebAssembly от Google. Написанный на C ++, он также используется в частности в Google Chrome и Node.js. V8 не поддерживает TypeScript. Вместо этого весь код TypeScript, который вы запускаете в Deno, компилируется в JavaScript с помощью компилятора снимков TS, а сгенерированные файлы хранятся в папке .deno. Если пользователь не обновит код, после начальной компиляции будут запускаться только кэшированные файлы JS.
FlatBuffers Flatbuffers - это эффективная кроссплатформенная библиотека сериализации, разработанная Google. Flatbuffers позволяет передавать сообщения и получать к ним доступ на разных языках без необходимости разбора и распаковки. В случае Deno FlatBuffers используется для обеспечения внутрипроцессного обмена сообщениями между привилегированной и непривилегированной сторонами. Многие общедоступные API-интерфейсы Deno внутренне создают буферы, которые содержат сериализованные данные на внешнем интерфейсе TypeScript, и делают эти буфера доступными для Rust, чтобы конец Rust мог обработать запрос. После завершения или планирования запросов конец Rust аналогичным образом создает буферы для сериализованных результатов и отправляет их обратно в TypeScript, который десериализует их, используя файлы, сгенерированные компилятором FlatBuffers. По сравнению с Node, который создает много привязок V8 для каждого привилегированного вызова, Deno с FlatBuffers нужно только выставлять методы отправки и получения сообщений на TypeScript и Rust. Это значительно упрощает добавление нового вызова и исключает прямое взаимодействие с V8. Flatbuffers введен для замены протокольных буферов в прототипе Go, чтобы избежать накладных расходов. Смотрите эту ветку для получения дополнительной информации.
Tokio Tokio - это асинхронная среда исполнения для Rust. Он используется для создания и обработки событий. Это позволяет Deno порождать задачи во внутреннем пуле потоков и получать уведомления для обработки вывода после завершения задачи. Tokio опирается на Rust Future, конструкцию, похожую на обещания JavaScript.