LINUX.ORG.RU

Книжка по глубокому жаваскрипту

 , , , ,


6

4

Посоветуйте книжку по глубинам жаваскрипта!

Т.е. не референс по апи (оно на сайте мазилы), а что-нибудь типа философии, организации/паттернов, деталей реализации виртуальной машины, итп. Н-р очень интересно, как работает сборка мусора, как писать нетормозящий жирный код, как симулировать многозадачность на браузерных реализациях, итп.

Если вы произносите JavaScript как CoffeeScript, неплохо бы получить про него то же самое, особенно про борьбу с Недожсом с помощью сабжа. Ну и ссылку на ваш инстаграм, конечно!

Спс

★★★★☆

Да не парься. Нет там секретов, ради которых стоит читать книжки.
На практике особенностей немного:

1. Вместо клепания классов чаще юзаются примеси
2. Всякие косяки «нормализуются» shim-ами вроде `es5-shim` и библиотеками типа `lodash` / `underscore`
3. Асинхронные вызовы клеятся через `async` или промисы типа `Q` / `RSVP` / ... (я предпочитаю async)

Самое сложное, особенно в ноде, клепать вместо разухабистых фреймворков микромодули, не впадая в библиотекостроительство. Но такой опыт приходит только с практикой.

На сборщик мусора ты предсказуемо повлиять не сможешь, поэтому париться как он работает смысла нет.

Нетормозящий код... ну меньше абстракций лепи, ёпта, и все будет пучком. Глубже - тоже только с практикой. У меня есть 2 проекта, js-yaml и sfg2ttf, где надо было выжать максимум по скорости. Дык вот приёмы там местами противоположные :)

Многозадачность - это уже частности, как раз то API в котором ты не хотел ковыряться. WebWorkers на клиенте, `cluster` / `threadgogo` и фиберы на ноде. В 0.12 еще генераторы (yield) появились, но они скорее всего скорость просадят.

Про кофескрипт не знаю (не использую), т.к. не вижу большого практического смысла.

В общем, бери проекты и делай, а с доками по ходу разберешься.

Инстаграмы в профиле, если чо. Ну и я звал уже поинстаграммить.

Vit ★★★★★ ()
Ответ на: комментарий от Vit

окей, спасибо!

На сборщик мусора ты предсказуемо повлиять не сможешь, поэтому париться как он работает смысла нет.

в V8 вроде бы var'ы первого уровня вложенности не собираются, можно повлиять тем, что не делать их

вообще, я на яве кожу, и хоть управление GC заключается только в выборе GC и одной функции, вручную запускающей сборку, на самом деле приходится часто медетировать с профайлером и думать, как правильно пропихнуть макароны сквозь дырочку и не зацепить пальцем вентилятор. В этом помогают всякие просветляющие статьи типа http://habrahabr.ru/post/148322/ (первая в поиске в гугле -)

Про кофескрипт не знаю (не использую), т.к. не вижу большого практического смысла.

проблема в том, что половина мира его использует, и с их кодом приходится считаться. Я вот с языком не знаком, и огромные куски кода на нем выглядят как один большой блоб, который руками не трожить :3

stevejobs ★★★★☆ ()
Ответ на: комментарий от stevejobs

Не лезь в яваскриптовый GC. Ты там погибнешь, ничего толкового не добившись. Если у тебя настолько высокие требования к реалтайму, то надо выбирать другой язык. А для всего остального достаточно знать, что GC довели до ума и явных фризов на секунду в v8 больше нет. Работа GC настолько сильно зависит от количества памяти, что твои попытки его закостылировать покажут в результате погоду на марсе. На практике никого не парит, как именно он собирает мусор, и затачивать по него код - глупость.

По оптимизациям v8 есть видео Егорова на ютюбе, но там настолько много нюансов, что без реальных задач будет зряшная трата времени. У меня есть примеры кода, где имело смысл клеить методы напрямую, без прототипов, и другие примеры, где создание таких объектов вызывало просадку по скорости. Единственный разумный подход - перестать париться над скоростью, и просто не клепать миллионы прослоек, благо типизация не статическая и это не сложно. Если вдруг случится чудо, и у тебя на самом деле появится задача, где надо кроить микросекунды - тогда и разберешься. Но на практике такие шансы исчезающе малы.

Будь проще, в общем. В JS нет ни каких серебряных пуль и магии. Его стоит выбирать просто потому что тебе хочется на нем писать, или заказчик требует. Либо если тебе приперло написать именно клиентское приложение, которое общается с тонким сервером через rest (но клиентское приложение - это уже не node.js).

проблема в том, что половина мира его использует, ...

Нет такой проблемы. Кофескрипт используют всякие фрики-выпендрежники, и бегинеры, которые вместо того чтобы учиться программированию ищут волшебные вундервафли. И на тех и на других можно спокойно положить болт. В крайнем случае, если кто-то написал под ноду модуль на кофескрипте - ну подключишь модуль, он же полностью изолирован. На твой код это не повлияет.

Vit ★★★★★ ()
Последнее исправление: Vit (всего исправлений: 1)

Мне кажется, что тебе ответили очень адекватно.

Твой вопрос можно разбить на несколько:

1) философия, организация/паттерны

известная книжка, вполне оправдывает время на прочтение:

http://www.amazon.com/JavaScript-Good-Parts-Douglas-Crockford/dp/0596517742

на ней все не заканчивается, разумеется.

сейчас читаю:

http://www.amazon.com/Maintainable-JavaScript-Nicholas-C-Zakas/dp/1449327680

2) детали реализации виртуальной машины

куча движков: Chakra, V8, SpiderMonkey и так далее... детали реализации отличаются, и этого простому девелоперу не осилить да и не нужно, если ты только не в <Browser> Core Engine Team хочешь идти.

если интересуют всякие кросс-браузерные особенности, то нужны тома типа JavaScript: The Definitive Guide, опыт, stackoverflow и читать сухие спецификации.

3) как писать нетормозящий жирный код

High Performance JavaScript

http://shop.oreilly.com/product/9780596802806.do

Америку ты не откроешь, но что-то из книжки почерпнешь, думаю.

Главное - жажда к познанию, и читать-читать, и пробовать-пробовать-пробовать.

noomorph ()
Ответ на: комментарий от Vit

кс отличный инструмент, сам юзаю. вместе с тем люблю повторять что не думаю на кс, а исключительно на жс. вместе с либами всегда идет отконпелированый вариант.

trashymichael ★★★ ()
Ответ на: комментарий от trashymichael

Ну я слишком ленив, чтобы держать в голове два синтаксиса, если в итоге всё равно лучше думать на ЖС.

Vit ★★★★★ ()
Ответ на: комментарий от iVS

Ты никогда не замечал, что чтобы написать сайт нужно одновременно 100500 языков и технологий? )))

А JS так, для души. Я не надеялся, что тут кто-то раньше понедельника что-то ответит

stevejobs ★★★★☆ ()

Я кинул ссылку в удалённые, но это кажется не то, что тебе нужно.

rros ()
Ответ на: комментарий от Deleted

Все там будем. От браузера далеко не убедишь :)

Vit ★★★★★ ()
Ответ на: комментарий от stevejobs

Смотря что называть ООП. Обычно под этим таки внезапно подразумевают классы. А если дословно читать аббревиатуру, то что-либо более подходящее чем жс врядли придумать можно.

Kalashnikov ★★★ ()
Ответ на: комментарий от rros

А в JavaScript'е самое понятное ООП.

Брехня.

Deleted ()
Ответ на: комментарий от Vit

Если не секрет, что ты используешь на сервере, когда недожс не подходит? В каком-то из тредов ты писал, что не являешься фанатиком недожса, соответственно должно быть кроме него что-то еще.

stevejobs ★★★★☆ ()
Ответ на: комментарий от stevejobs

Мне пока везде подходит. У меня ж не ынтырпразы. Нет смысла зоопарк плодить. Просто я не упарываюсь на тему, что это мегатехнология в over9000 раз лучше всего другого. И надо учитывать, что мне пришлось вместо разработки своего проекта тратить ресурсы на портирование библиотек из рубей и питона. С качественными библиотеками в ноде пару лет назад было совсем тухло, чего бы там не кричали фанбои.

Vit ★★★★★ ()
Ответ на: комментарий от Vit

Асинхронные вызовы клеятся через `async` или промисы типа `Q` / `RSVP` / ... (я предпочитаю async)

ты об https://github.com/caolan/async ?

я хочу полностью изничтожить вложенность, она не нужна

судя по описанию этой либы, есть

async.series([
    function(){ ... },
    function(){ ... }
]);

но тогда получается, что буквально каждую строчку кода надо обертывать в функцию, а тело методов - в серии. Это выглядит как говно! Неплохо бы иметь специальный синтаксис типа async/await. Вот тут может пригодиться кофескрипт.

Или я чего-то не понимаю?

stevejobs ★★★★☆ ()
Последнее исправление: stevejobs (всего исправлений: 1)
Ответ на: комментарий от stevejobs

Ну используй что-то на фиберах https://github.com/laverdet/node-fibers/wiki или промисы. Или dev-версию, там уже yield есть.

Но вообще, ты не первый новичок, который гневно потрясает. Это пройдет :)

Вот вариант с большой портянкой на async https://github.com/fontello/fontello/blob/master/server/font/_lib/worker.js#L168

А вот с самопальным хитрым медиатором https://github.com/nodeca/nodeca.forum/blob/master/server/forum/section/list/...

Не умничай и начни код писать в реальных проектах, там разберешься :)

Единственное место, где колбеки реально не в кассу и портят кровь - шелловские скрипты. Но в 0.12 наконец-то сделают синхронный вариант exec для чайлдов, и все станет нормально (для файловой системы синхонные вызовы давно есть).

Vit ★★★★★ ()
Ответ на: комментарий от Vit

Промисы многие используют, но эта хрень имеет свойство пролезать по всему коду от начала до конца.

Есть эпический пример, когда в SVGO из-за ошибочного выбора промисов получилось «асинхронное» API библиотеки там где оно не нужно. Потом автор по всему коду это выпиливал.

Vit ★★★★★ ()
Ответ на: комментарий от Vit

Окей, но я все-таки попробую просто генерить это говно из какого-нибудь DSL во вложенные вызовы =) Мне приятно писать на JS. Мне неприятно и глубоко ненужно все остальное типа асинхронщины. Весь этот буллшит про то, что асинхронщина что-то там ускорят - господи, Недожс и так не запускается на шаред-хостинге, а на дедике люди отлично обходятся огромной блокирующей явой, и никто пока не умер. Если бы асинхронщину можно было выпилить совсем подчистую и оставить JS вместо языка, было бы замечательно. Вот люди советуют попробовать писать на яве на встроенном в нее JS, надо бы попробовать.

stevejobs ★★★★☆ ()
Последнее исправление: stevejobs (всего исправлений: 1)
Ответ на: комментарий от stevejobs

Да ничего асинхронность не ускоряет, конечно. Просто позволяет нормально сетевые однотредники делать. Но способов имплементации асинхронности - выше крыши, и конкретно в ноде не самый user-friendly.

Я тебе не советую кодогенераторы юзать. Будешь потом выпиливать все что нагенерил :) . Даже промисы штука специфичная, если у тебя нет большого опыта их использования из других языков. Тебе надо учиться правильно бить код на части, тогда колбеки не будут большой проблемой. Просто когда у тебя есть рефакторинг, можно косячить и оставлять проблемы архитектуры на потом. А в ноде приходится думать сразу. За это она мне и нравится - мозг тренирует.

Если яву хочешь - ну там vertx теперь есть. Юзай и забей на ноду. Нет смысла тянуть в проект JS любой ценой. Я не очень понимаю, когда ради простых задач городят связки из нескольких языков. Это еще может иметь смысл в ынтырпрайзах, где толпа народу, и все любят разные языки. Но для одного человека IMHO дикий overkill.

Vit ★★★★★ ()
Ответ на: комментарий от Vit

Самое сложное, особенно в ноде, клепать вместо разухабистых фреймворков микромодули, не впадая в библиотекостроительство. Но такой опыт приходит только с практикой.

А можно об этом подробнее? Хотя бы примеры. Потому что сейчас стыкнулся с тем, что горожу много громоздкого кода там, где не надо.

sphericalhorse ★★★★ ()
Ответ на: комментарий от sphericalhorse

Не очень понимаю, каких примеров вам надо, и как они вам помогут, если они не связаны с вашим кодом. Ссылки на проекты в профиле. Но сомневаюсь, что будет польза.

Попробуйте думать не в терминах «классов», а в терминах «данных» (что на входе и что на выходе). Иногда помогает лучше архитектуру спланировать.

Vit ★★★★★ ()

вот эта вот.

И я правельна щетаю, что DOS и ТурбоПасКАЛЛ в школах наконец то заменили на АльтЛинух и JavaScript. Оно не так тормозит и может выполняться на любом браузере. Так ведь?

EnterpriseMobility ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.