JS fun?

Apr. 22nd, 2016 03:28 am
ermouth: (Default)
[personal profile] ermouth

Снимок экрана 2016-03-15 в 2.24.12

Ну, да, но я вот почти каждый день пишу JS, и то что происходит, иногда реально makes fun. Но это странный такой fun. JS стал местами выглядеть например вот так (это радует):

Снимок экрана 2016-03-15 в 2.23.09

Но иногда-то вот так (а это не радует):

Снимок экрана 2016-03-15 в 2.29.48

Оба примера потребуют транспайлера для запуска, и оба примера – сами транспайлеры.

Расширение синтаксиса и новые фичи сначала появляются как proposals и полифиллы-транспайлеры из “нового” синтаксиса в обычный ES5/6, а затем – иногда – утверждаются в следующий стандарт.

Вообще, JS-транспайлеры в web-related workflow давно норма, минификаторы кода на сайтах – как раз транспайлеры из JS в JS, ога.

Там полно замечательных разработок – я, например, активно использую AST builder и codegen для разбора и генерации JS, взятые как раз из минификатора кода. Который, замечу, изначально был написан на Lisp, а потом откомпилирован в JS, ога.

Среди JS-транспайлеров есть, конечно, звезда – babel.js. Если коротко, babel транслирует код, написанный практически на любом кандидате в будущие стандарты JS, в “классический” Javascript. К Бэйбелу бывают плагины (первый скриншот – как раз такой плагин) и всякие другие вкусности.

Ещё есть Microsoft-овский Typescript. Это такой JS c типизацией, классами в самом гнусном смысле и подобными прелестями – и транспайлер к нему. Некоторым нравится.

Ну и CoffeeScript (кажется, отходящий к праотцам – наконец-то), JSX, SJS и прочая, и прочая. Их можно сочетать в одном проекте минимумом усилий и они все прекрасно друг с другом уживаются, но…

Не fun

У всех этих прелестей есть и обратная сторона. JS стал с эзотерической точки зрения очень похож на C++. Огромный очень пёстрый и неровный стандарт, необозримое время, необходимое для действительно глубокого погружения в частности, абсолютное доминирование в своей области индустрии и много других таких вот нечётких аналогий.

Это всё очень круто – но это как-то перестаёт быть fun. Вернее, это какой-то неправильный fun.

Скажем, 3 года назад повсеместным стандартом возврата из асинхронного вызова были callback-и, а теперь это чуть не моветон, везде Promis’ы (которые круто дороже и не всегда нужны). Забавно – в 2014 я использовал promisify, чтобы превращать коллбэки в промисы, в 2016 мне стал нужен callbackify, чтобы превращать промисы обратно в коллбэки о_О

Доверие

JS комьюнити изначально основано на глубоком доверии – сам язык такой. Увы, взрывной рост комьюнити не привёл к появлению развитых инструментов, это доверие обеспечивающих. В результате недавно побурлил npmgate, и это только начало.

Если, по одному выражению, в C++ сложно выстрелить в ногу, но если получится, отрывает всю ногу – то в JS сейчас положение таково, что оторвать ногу может многим тысячам фанов сразу. И сделать это очень легко – даже стрелять не надо, достаточно обидеться.

Более того, оторвать ногу может так, что это будет долго незаметно.

Exotic bugs

В JS полно способов создавать весьма экзотические объекты. Например, все известные мне (в тч системный) методы определения, является ли объект array-ем, могут давать неожиданные результаты. Прекрасный баг вот на тему. Вообще в JS определить какой природы объект передан в функцию далеко не всегда тривиальная задача.

На это накладываются слои intermediate рантайм-представлений кода и рантайм же компиляция / bailout туда-сюда.

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

Консерватизм

Я как-то купил за 5(10?) фунтов книжку по JS-тестированию, и если б знал, насколько хороша книжка – дал бы кратно больше. Книжка эта меня просветлила совсем не в плане методик тестирования – я из неё увидел, насколько важен в JS консерватизм.

То-есть, если не использовать в JS нововведения младше двух-трёх лет, не наворачивать транспайлеров для красоты, использовать только хорошо проверенные мэйнстримовые хаки, приёмы и соглашения – глубокие ошибки могут быть только логические.

Я после прочтения этой книжки стал избегать ESnext, тайпскрипта, JSX и тп надстроек, ну и вычесал и в некотором смысле законсервировал набор библиотек. В результате то, что делается, работает всегда, сразу и на всём.

А хайп и яркие рыбки у поверхности – это то, что и в самом деле makes fun и вовсе не только для людей, далёких от JS. Вот ещё бы этот хайп в стандарт не так бойко попадал – и было б совсем славно.

Date: 2016-04-22 12:54 am (UTC)
From: [identity profile] morfizm.livejournal.com
Твой второй вариант (который не радует) примера на JS сильно похож на радующий меня вариант Perl'а. (Нерадующий вариант там вообще грустен.)

Disclaimer: я практически не использую ни одно, ни другое, потому что я динозавр так получилось, что я мало пишу application level кода, так что моё мнение может не быть идеально идеологически правильным. Тем не менее, мнение имею.

Promises являются моветоном for a reason. Они идеологически более правильны: уже лет 7 как моветон организовывать софт, чтобы он был data-driven, result-driven, vs implementation-driven. Помнишь Prolog? Это его основная фича. Ты описываешь, что *ты хочешь получить*, но не паришься вопросом *как*. Колбеки это очень low level, они навязывают определённый implementation. С колбеками трудно писать модульно и это становится отвратительно, когда нужен длинный chain асинхронного исполнения, вложенные колбеки это ужос (быстрые ссылки, что я нашёл: http://callbackhell.com/, https://www.quora.com/Whats-the-difference-between-a-promise-and-a-callback-in-Javascript). Промисы не навязвают реализации и энкапсулируют выполнение промиса, что хорошо ложится, например, на многопоточность (для JS не актуально, но вообще важно).

Вообще, надо вспомнить, что у JavaScript-а основная фича это не performance и не компактность, а доступность для lower class девелоперов, которые иначе не умеют. Ты давно уже дошёл до уровня, когда тебе хорошо бы использовать язык со строгой типизацией (ты бы быстро понял и впитал её ценность), специально заточенный как под компактность, так и под performance. Идеологически это и есть C++. Я думаю, тебе было бы в кайф на нём писать. К сожалению, развитие идёт не в сторону "адаптируем C++ под web", а в сторону "наворачиваем JS, чтобы он был не хуже C++". Поэтому приходится сражаться с кучей антипаттернов и сайд-эффектов исторического развития языка.

Date: 2016-04-22 04:26 am (UTC)
From: [identity profile] soloviewoff.livejournal.com

Про консерватизм мысли очень похожи, на мой взгляд, на идеологию golang.  Как ты к нему относишься, кстати?

Date: 2016-04-22 09:20 am (UTC)
From: [identity profile] ermouth.livejournal.com
«Не отношусь», мне больше по душе Erlang.

В самом деле, отношусь не очень по двум причинам.

1) Совсем убирать try/catch – это перебор имхо. Он редко нужен, но зато когда нужен – без него туго, очень-очень много писанины лишней.

2) В golang CSP-модель, в Erlang – actor model. Второе мне точно ближе.

Profile

ermouth: (Default)
ermouth

November 2021

S M T W T F S
 123456
78910111213
14151617181920
21 222324252627
282930    

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 1st, 2026 06:42 am
Powered by Dreamwidth Studios