Журнал LinuxFormat - перейти на главную

LXF157:Что за шту­ка

Материал из Linuxformat
Перейти к: навигация, поиск


Что за штука…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 func­tions].

В

Вот как? Да это уж са­мо по се­бе зву­чит за­мы­сло­ва­то!

О

По­жа­луй, на­столь­ко за­мы­сло­ва­то, что нам здесь и мес­та для разъ­яснений не хва­тит, но в тер­ми­нах про­грам­ми­ро­вания все до­воль­но по­нят­но. А глав­ное, они яв­ля­ют­ся важней­шей ча­стью со­вре­мен­но­го 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; вы­бор за ва­ми!

Персональные инструменты
купить
подписаться
Яндекс.Метрика