LXF157:Что за штука
|
|
|
Что за штука…Node.js?
Джонатан Робертс наблюдает, как ведет себя JavaScript вне среды обитания.
В
Значит, Node.js? А раз .js, то не обошлось без JavaScript? И, должно быть, не без web-браузеров, ведь JavaScript применяется там.
О
И да, и нет. Это действительно JavaScript, но к браузерам не имеет никакого отношения.
В
Совсем? Но разве JavaScript — это не язык программирования, благодаря которому мы открываем Google Maps, Aviary и Cloud9 IDE? Что же это, если не язык браузеров?
О
Вы правы, это язык Сети, но применение JavaScript не исчерпывается созданием программ, запускаемых в браузере. Это также великолепный язык программирования общего назначения. По сути, JavaScript – два в одном. Есть ядро языка, включающее синтаксис и основные способы работы с текстом, массивы, даты и регулярные выражения – но не охватывающее многие другие функции, в том числе ввод/вывод, работу с сетью, хранение или графику. Все это обеспечивается «средой хоста».
В
А хостом, разумеется, тут служит web-браузер?
О
Именно так, вот потому-то все и думают, что это язык исключительно для web-программирования: в другой среде он им просто никогда не попадался. Вы можете считать, что Node.js представляет собой альтернативную среду для применения JavaScript. Речь идет о библиотеках и функциях, предусмотренных для ситуаций, отличающихся от тех, что могут встретиться в web-браузере.
В
Хорошо, с этим ясно. Но какие именно задачи может решать JavaScript на Node.js?
О
Он призван облегчить создание web-приложений – а точнее, серверных приложений. И это очень изящно, поскольку означает, что разработчики смогут создать и клиентскую сторону (то, что работает в браузере), и серверную, используя один и тот же язык. Тут есть потенциал для упрощения процесса разработки.
В
Вроде и неплохо, но JavaScript — это же медленный, интерпретируемый язык? А web-серверы должны быть очень быстрыми, чтобы успевать реагировать на миллионы запросов.
О
JavaScript – интерпретируемый язык, это верно, но не обязательно медленный. По факту, результаты некоторых (первичных) тестов на производительность показывают, что Node.js, в некоторых случаях, даже быстрее Nginx, а это высоко оптимизированный сервер на C.
В
Хмм... что-то сомнительно. Не объясните ли вы, как такое возможно?
О
Конечно. Причин тому две. Во-первых, роль JavaScript в Интернет становится все важнее – тому же Gmail без него просто не жить. И из-за широкой его распространенности, дабы пользоваться Интернетом было максимально приятно, разработчики браузеров много трудились над созданием «движков», сильно ускоряющих выполнение кода JavaScript.
В
Ах, да, я что-то слышал об этом, когда Google запускал Chrome. Туда включили какой-то V8.
О
Да, верно. V8 – это разработанный Google движок для JavaScript, и одно время он считался самым быстрым из всех существующих. Он действительно вывел скорость JavaScript на новый уровень. И самое классное в V8 то, что это открытый код, поэтому любой мог его взять и использовать в разнообразных приложениях, вне web-браузера.
В
Стало быть, благодаря этому и появился Node.js?
О
Именно так. Одна из важнейших частей Node.js – скоростной движок для JavaScript. И это первая причина, по которой он запускает программы на JavaScript так быстро. Но одно это не позволило бы ему тягаться в скорости с приложением, написанным на компилируемом языке типа C.
В
И что же там еще накрутили, чтобы ускорить Node.js?
О
Дело в том, что современные компьютеры устроены таким образом, что процессоры и память у них мощные, а вот скорость записи, хоть с диска, хоть из Интернета, хромает. Причем настолько, что зачастую тормозит работу всего приложения. Значит, чтобы улучшить последнее, мало просто разработать более быстрые алгоритмы, необходимо также оптимизировать и функции ввода/вывода.
В
А такое вообще возможно в ПО? Конечно, мощность оборудования на это влияет, но улучшение самих программ ведь ничего не даст?
О
Действительно, Node.js не оптимизирует ввод/вывод как таковой, зато не позволяет ему блокировать работу остальной программы. Дэн Йорк [Dan York] привел блестящую аналогию (http://tinyurl.com/49wl5lk) для этой модели. Представьте, что вы пришли к доктору. Отстояв очередь в регистратуру, вы узнаете, что для посещения врача требуется заполнить несколько анкет. Дальше возможно два сценария, первый: вы делаете это прямо там, не отходя от окошка. И пока вы заполняете, вся остальная очередь стоит и ждет – а сотрудник бездельничает.
В
Кошмар какой! Да ни в одной приемной вы такого не увидите: будут либо километровые очереди, либо придется нанимать кучу регистраторов!
О
Вот именно, но сегодня большинство сетевых приложения работает, грубо говоря, по такой модели.
В
Хорошо, так чем в этой ситуации поможет Node.js?
О
Ну, представьте опять же вашего доктора. Регистратор дает вам папку, ручку и анкету и отпускает заполнять ее, где вам удобно. Пока вы это делаете, он обслуживает других клиентов. Вы закончили – и снова встаете в очередь к окошку. Node.js делает то же самое.
Все медленные, сложные задачи (наподобие чтения файла с диска) он перенаправляет куда-нибудь еще, позволяя основному процессу Node.js обрабатывать другие запросы. Когда же завершится тот самый медленный процесс, он повторно ставится в очередь обработки.
В
Звучит умно, но все же несколько запутано — переадресация, отслеживание всех этих задач...
О
Да, не все так просто. В большинстве операционных систем для такого рода задач есть своя встроенная поддержка, но пользоваться ею трудновато. А Node.js, на самом деле, все эти переадресации и отслеживания выполняет незаметно для глаза, представляя их в форме традиционных для Java «слушателей событий» [event listeners] и «функций обратного вызова» [callback functions].
В
Вот как? Да это уж само по себе звучит замысловато!
О
Пожалуй, настолько замысловато, что нам здесь и места для разъяснений не хватит, но в терминах программирования все довольно понятно. А главное, они являются важнейшей частью современного JavaScript в сети, так что большинство разработчиков уже будет иметь четкое представление, как с ними работать.
В
Ладно, поверю вам на слово. Итак, подводя черту... зачем же нужен Node.js?
О
Он облегчает работу сетевых приложений – таких как web-серверы, чаты, онлайн-игры – все, что подразумевает одновременное обслуживание многих пользователей...
В
...за счет того, что не дает вводу/выводу тормозить работу всего приложения?
О Да, именно так! И не забывайте, что коль скоро приложения Node.js написаны на JavaScript, такой подход к разработке будет естественным для всех, кому приходилось когда-либо создавать интерактивный сайт. Плюс, на JavaScript теперь может быть написано все приложение: как серверная, так и клиентская часть.
В
Хорошо, я понял. А не приведете ли примеры каких-нибудь «сетевых приложений», где Node.js уже используется?
О
Да их полно! Одна компания, под названием Voxer, разработала приложение, превращающее ваш смартфон в переносную рацию; другая создала игру Word2 – по сути Скрэбл, но на огромной общей доске; третья представила дизайнерам онлайн-инструмент для каркасного моделирования, Mockingbird. Если хотите узнать о Node.js побольше или увидеть другие примеры его применения, загляните на сайт http://nodejs.org.
В
Спасибо, непременно! И все же последний вопрос. Это самый Node.js, с его событиями и все такое, звучит здорово. Но многие разработчики не любят и не знают JavaScript. Им-то как быть?
О
Очевидно, использовать Node.js они не смогут, поскольку он ориентирован исключительно на JavaScript. Но есть же много других библиотек и систем, работающих по тому же принципу: нравится Python – берите Twisted; предпочитаете Ruby – можете попробовать EventMachine; а если вы поклонник C – есть libevent; выбор за вами!