Большинство серверных программ — это программы для Linux. Они состоят из файловой системы, некоторых исполняемых файлов, может быть, определенных общих библиотек, и, возможно, они взаимодействуют с системным программным обеспечением, таким как systemd или nsswitch.
Docker популяризировал использование контейнеров Linux; виртуализация на уровне ОС, которая обеспечивает прекрасный механизм для распространения серверного программного обеспечения. Каждый образ контейнера представляет собой свободный от зависимостей готовый к запуску пакет программного обеспечения.
Поскольку серверное программное обеспечение часто зависит от множества системных ресурсов и конфигурации, его развертывание было сложной задачей в прошлом. Контейнеры Linux решили эту проблему.
Аналогичную герметичную среду можно найти в JavaScript браузера, хотя и на более высоком уровне абстракции. Zack Bloom из Cloudflare еще в 2018 году мотивировал нас задуматься, сможет ли JavaScript сам по себе обеспечить новый тип самодостаточного серверного контейнера.
Чем больше мы уберем ненужных абстракций, тем ближе подойдем к концепции "Сеть — это компьютер". Cloudflare Workers — это, по сути, имплементация данной концепции в сети Cloudflare. Deno Deploy — новая реализация этой идеи (в сети GCP).
В этой заметке я расскажу о том, что думаю о JavaScript-контейнерах, и предположу, как эта технология будет развиваться в ближайшие пару лет.
Универсальный скриптовый язык
Технологии трудно предсказать, но, безусловно, Всемирная паутина будет существовать и через 10 лет. С каждым днем у людей становится все больше и больше инфраструктуры, связанной с веб-приложениями — веб пожирает мир. Если вы верите, что Всемирная паутина будет существовать через 10 лет, то, без сомнения, стандарты, на основе которых она существует — HTTP, HTML, CSS, JavaScript — тоже будут присутствовать. Поэтому я уверен, что JavaScript продолжит развиваться и совершенствоваться.
Веб — это фундаментальный носитель человеческой информации. JavaScript отличается от других языков программирования тем, что он глубоко связан с данной инфраструктурой.
Скриптовые языки имеют большое значение для решения многих проблем на стороне сервера. Большая часть создаваемого кода не привязана к вычислениям, скорее он зависит от производительности: скорости написания и денежных затрат разработчиков. Скриптовые языки позволяют писать бизнес-логику быстрее и дешевле. Они (Python, Ruby, Lua, Shell, Perl, Smalltalk, JavaScript) довольно похожи. Есть различия в синтаксисе и API, но противопоставлять друг другу практически нечего. Любой, кто работал с Rust или C, понимает, что такое скриптовые языки.
Подведем итог: скриптовые языки полезны, но все практически одинаковы, из них JavaScript гораздо более широко используется и перспективен. Поэтому имеет смысл рассматривать JavaScript как универсальный скриптовый язык.
Shell : Executables :: JavaScript : WebAssembly
Появился новый контейнер более высокого уровня для серверного программного обеспечения: собственно JavaScript-песочница.
Этот контейнер не предназначен для решения такого же широкого круга проблем, как контейнеры Linux. Он появился благодаря своей простоте. Это сводит к минимуму шаблонную бизнес-логику веб-сервисов. В нем используются общие концепты с браузером и таким образом, сокращается их количество, которое необходимо знать программисту. (Пример: при написании веб-сервиса, скорее всего, любая конфигурация systemd является просто ненужным шаблоном).
Каждый веб-инженер уже знаком с JavaScript API браузера. Поскольку абстракция JS-контейнера построена на тех же API браузера, общий объем опыта, необходимый специалисту, уменьшается. Благодаря универсальности Javascript сложность снижается.
Shell — это интерпретируемый скриптовый язык, используемый для вызова программ Unix. Он может выполнять условия, циклы, имеет переменные... но, к сожалению, довольно ограничен и сложен для программирования. Реальная функциональность передана исполняемым файлам (executables).
В этом формирующемся слое абстракции сервера JavaScript занимает место Shell. Он гораздо лучше подходит для написания скриптов, чем Bash или Zsh. Вместо того, чтобы вызывать исполняемые файлы Linux, как это делает shell, песочница JavaScript может вызвать Wasm. Если вам приходится выполнять тяжелые вычисления, например, изменять размер изображения, вероятно, имеет смысл использовать Wasm, а не писать его на JS. Точно так же, как вы не будете писать код изменения размера изображения в bash, а создадите imagemagick.
North Star (ключевой ориентир для развития)
Будущее скриптовых языков — это браузерный JavaScript. Фундаментальной ошибкой Node.js стало отклонение от браузера, поскольку новые API были стандартизированы, изобретая слишком много. В 2010 году у нас не было ES-модулей, но как только они были стандартизированы, их следовало привнести в Node. То же самое можно сказать о промисах, async/await, fetch, потоках и многом другом. Устаревшие нестандартные биты, такие как CommonJS require, package.json, node_modules
, NPM, глобальный объект process
, в конечном итоге будут либо стандартизированы и добавлены в браузер, либо вытеснены веб-ориентированными заменами.
Этот контейнер более высокого уровня еще предстоит стандартизировать. Мы не совсем понимаем, как все это будет происходить. На данный момент Cloudflare Workers и Deno Deploy используют API FetchEvent:
addEventListener("fetch", (event) => {
event.respondWith(new Response("Hello world"));
});
Вероятно, можно найти лучший интерфейс.
Заключение
JavaScript — это универсальный скриптовый язык. Благодаря его универсальности появляется новая контейнерная абстракция, упрощающая работу серверов.
Я не утверждаю, что контейнеры Linux уйдут в прошлое. Этот уровень абстракции всегда будет полезен. Просто он достаточно низкоуровневый для большей части "бизнес-логики", которую пишут люди. Когда вы создаете веб-сайт, такие вещи, как конфигурация systemd, являются шаблонными.
Пожалуй, большинство "веб-сервисов" можно упростить, если мыслить в терминах контейнеров JavaScript, а не контейнеров Linux.
Приглашаем всех желающих на открытое занятие по теме «Объекты в JavaScript», на котором будут рассмотрены особенности современной реализации объектов в JavaScript-движках, такие как свойства, прототипное наследование и т.д. И, в частности, будут рассмотрены также некоторые аспекты производительности данных решений. Регистрация — по ссылке.
Комментарии (2)
qbz
31.05.2022 00:14"Устаревшие нестандартные биты"
Ребят, а зачем выкладывать результат гугл-транслэйта?
pfffffffffffff
Ничего не понятно, но очень интересно