[Из песочницы] Три Больших Лжи о JavaScript
Привет, Хабр! Представляю вашему вниманию мой перевод статьи »The Three Big Lies About JavaScript» автора Richard Kenneth. Данная статья была написана в мае 2016 года, однако ее актуальность, на мой взгляд, не исчезла. Я начинающий программист, поэтому возможны ошибки в плане «понимания». Итак…
Три Больших Лжи о JavaScript
Есть два варианта лжи: ложь, которую мы говорим другим, и ложь, которую мы говорим себе, что бы оправдать ее
Есть три больших лжи, которые JavaScript поклонники говорят мне снова и снова.
Ложь#1
JavaScript — это самый неправильно понимаемый язык программирования в мире.
Люди не знают, как правильно им пользоваться, и поэтому они постоянно попадают во всевозможные неприятности. И это ложь, потому что в JavaScript нет ничего непонятного.
Это заурядный императивный / процедурный язык программирования с небольшим количеством функциональных возможностей программирования (ФП) и спорной «объектно-ориентированной» функцией, называемой прототипами объектов. И что же здесь особенного?
В основном, все проблемы, возникающие при использовании JavaScript, являются виной только людей, которые его используют: они невежественны, они ленивы, они привыкли к тому, как программирование выполняется на Java или Python.Чего же они не знают? Функционального программирования?
Почему же тогда люди не ошибаются при использовании других языков ФП, таких как C#, Clojure, Dart, Elm, Erlang, F#, Julia, Haskell, Scala и Scheme? Функциональное программирование является достаточно хорошо понятной парадигмой в IT-индустрии. Так что же тогда делает JavaScript, таким особенно проблематичным в этом отношении?
Может быть, люди не достаточно осведомлены о прототипах объектов. В таком случае, прочитайте «What JavaScript«s Object Prototypes Aren«t». Прототипы, конечно же, не годятся для разработки программного обеспечения. Они не являются особенно высоким уровнем абстракции программирования. Прототипы — это в основном прославленные хэш-таблицы, довольно таки низкий уровень и это то, что я называю «кирпичиками» для реального объектно-ориентированного программирования (class-based OOP). Люди могут не понимать, как использовать прототипы объектов, но зачем вам учиться «укладывать кирпичи»? Это не заслуживает Ваших усилий.
Да, я понимаю. Прототипы очень гибкие. Они не обладают всеми «ритуалами», на которых стоит классическое ОПП. В этом смысле они забавны в использовании. Но они не масштабируются хорошо для больших приложений, и поэтому люди возвращаются к классам. Если бы прототипы были таким полезным приемом, вы бы видели его адаптацию везде, потому что прототипы могут быть смоделированы на языках, основанных на классах, так же, как классы могут быть смоделированы на языках, основанных на прототипах. И это то, что JavaScript программисты не могут уяснить.
Ложь#2
Асинхронное программирование — ключевая сила JavaScript. Что же, давайте сначала поймем, почему асинхронное программирование вообще существует в JavaScript.
Для разработки графического интерфейса пользователя (GUI) цикл событий является — de rigueur (обычной вещью), будь то в Windows, или X Window, или OS X’s Cocoa, или веб-браузере. Все они обрабатывают события пользовательского ввода асинхронно. Означает ли это, что асинхронное программирование также является силой C++ или Objective-C? Циклы событий (с асинхронными библиотеками) также использовались в Python и Perl и Tcl. Тогда, я полагаю они все обладают силой асинхронного программирования? (Я смеюсь, когда люди используют несуществующее слово »asynchronicity» (асинхронный — это прилагательное, описывающее объекты или события, которые не координируются во времени).
JavaScript, так же использует цикл событий и асинхронную обработку для поддержки пользовательского интерфейса веб-браузера. Разве это делает его великим языком?
И теперь эта модель вычислений, сделала Node.js довольно популярным на стороне сервера, где он используется для разработки, не связанного с GUI, т.е. для высокопроизводительного параллелизма. Node очевидно, полезен для многих приложений, но вряд ли он захватит мир параллелизма. Недавние события, показывают ограничения Node.js. И да, это должно убедить всех использовать только JavaScript.
Цикл событий был описан как «параллелизм бедняка.
Сторонники Node любят снова и снова показывать одни и те же примеры крупных предприятий (PayPal, Netflix, Walmart, Uber, и т.д.). Что же для каждого Node.js примера можно сопоставить в ответ? — сотни примеров Java? Java зарекомендовала себя бесчисленное количество раз для разработки в enterprise. Вот почему это является отраслевым стандартом. Node.js же, еще не доказал себя. Мы не знаем на самом деле, сколько корпораций пытались использовать Node.js и в итоге отказались от него. Мы понятия не имеем, каков реальный показатель успеха Node.js проектов. Для enterprise, выбор в сторону Node.js, все еще является риском.
Я уверенно предсказываю, что Go вытеснит Node в будущем, как только он нарастит свою экосистему фреймворков и пакетов. Его траектория неоспорима.
Такие языки, как Go и Erlang/Elixir, могут легко превзойти Node в большинстве сценариев параллелизма. Даже модель цикла событий / асинхронности не является устойчивой в долгосрочной перспективе. Мы должны быть заинтересованы в использовании реальных языков параллельного программирования, если нашей целью является максимальная производительность. Зачем идти на компромисс с JavaScript.
Ложь#3
JavaScript является самым популярным языком программирования в мире.
Действительно ли так это? Существует огромная разница между языком, который широко используется по умолчанию, и языком, который широко используется.
Помните, что в любой другой области, кроме интернета, разработчики не являются заложниками одного языка. Мы игнорируем этот факт на свой страх и риск.
JavaScript является единственным нативным языком для веб-браузера, поэтому это самый прямой путь для написания браузерного приложения. Большинство разработчиков, однако, презирают этот язык и, если бы у них действительно был бы лучший выбор, они бы его сделали. Вы сами можете убедиться в этом, если поищете в интернете (форумы, социальные сети, веб-сайты и т.д.) мнения людей касательно JavaScript. Существует множество длинных списков WATs и WTFs о JavaScript, которые вы не найдете для любого другого языка, за исключением PHP. Что мы знаем наверняка, так это то, что очень популярен web, а не JavaScript.
Большинство основных языковых рейтинговых индексов не указывают на то, что JavaScript — самый популярный язык программирования. Даже ни вторая, ни третья, ни четвертая позиция. Согласно IEEE Spectrum (Американский журнал) — это #8 место, PYPL #5, TIOBE #7, CodeEval #6. Redmonk (аналитическая компания) использует статистику Github, которая показывает сильно завышенное число для JavaScript, именно потому, что веб-приложения, написанные на любом языке, должны иметь хотя бы немного JavaScript`а для работы в браузере; тут без вариантов. Поэтому Redmonk не в состоянии дать объективный рейтинг аномалии JavaScript`а; иным образом, самый популярный язык — это Java.
Опросы пользователей, например, из StackOverflow, также содержат подобное смещение в выборе. Как мы можем утверждать, что JavaScript это популярный язык, когда у нас нет иного выбора, кроме как использовать только его? (К счастью, нам доступны трансляторы).
Нам следует помнить, что для других областей (например, сетевых серверов, игр и графики, мобильных, настольных, и т. д.). есть большое разнообразие в выборе языка программирования. Web-приложения исключительно уникальны. (По крайней мере, до тех пор, пока релиз WebAssembly наконец то не состоится.)
Правда
Позвольте мне быть предельно ясным: JavaScript не является хорошим языком программирования для разработки программного обеспечения. JavaScript был разработан быть легким, свежим скриптовым языком для веб-браузера. Как таковой, он был сделан, чтобы быть гибким и чрезвычайно прощающим, со слабой типизацией. Он даже не имеет правильного целочисленного типа или правильного типа массива. Что это за язык?!
Слабая типизация, это Ахиллесова пята языка программирования, с помощью которого разрабатывается программное обеспечение. Хоть это и делает написание быстрых простых сценариев для веб-браузера очень легким, это же и работает против вас, когда вы пишете большие приложения, которые требуют безопасности и надежности. Вот почему большинство основных языков обычно строго типизированы (не путать со статически типизированными). И это очень, очень важно!
Слабая типизация и вытекающее из нее произвольное принуждение демонстрируют полное отсутствие языковой дисциплины. Это объясняет большую часть списка WATs и WTFs порождённая JavaScript`ом. (далее, автор приводит ссылки на онлайн ресурсы, где приводится список «бородавок» JavaScripta).