Pull to refresh

Самый недооцененный язык в мире

Reading time 5 min
Views 8.5K
Original author: Douglas Crockford
JavaScript logo
JavaScript, также известный как Mocha, или LiveScript, или JScript или ECMAScript один из самых популярных языков программирования. Фактически каждый персональный компьютер имеет его интерпретатор и активно им пользуется. JavaScript всецело обязан своей популярностью тому, что он стал основным скриптовым языком для веба.

Несмотря на его популярность, немногие знают, что JavaScript — это очень хороший объектно-ориентированный язык с множеством возможностей. Почему многие этого не понимают? Почему этот язык настолько не понят?



Название


Префикс «Java-» намекает на то, что он является подмножеством или упрощенной версией Java. Судя по всему это название выбрали специально, чтобы создать неразбериху, а из нее выходит непонимание. JavaScript — это не интерпретируемая Java. Java — это интерпретируемая Java. JavaScript — это другой язык.

Синтаксис JavaScript настолько же похож на синтаксис Java, как Java на C. И он является подмножеством Java не в большей степени, чем Java является подмножеством C. Он лучше чем Java в приложениях, для которых Java (тогда называвшаяся Oak) изначально разрабатывалась.

JavaScript не был создан Sun Microsystems, создателями Java. JavaScript был разработан в Netscape. Изначально он назывался LiveScript, но это название не настолько сбивало с толку.

Суффикс "-Script" подразумевает, что это не настоящий программирования, что скриптовый язык это значительно хуже, чем язык программирования. Но в действительности все зависит от специализации. По сравнению с C, JavaScript жертвует скоростью ради выразительных возможностей и динамичности.

Lisp в шкуре C


JavaScript имеет C-подобный синтаксис, включая фигурные скобки и громоздкие выражения, делающие его похожим на обычный процедурный язык. В действительности JavaScript имеет больше общего с функциональными языками программирования вроде Lisp или Scheme, чем с C или Java. Он имеет массивы вместо списков и объекты вместо списка свойств. Функции являются его основой. Он имеет замыкания. Вы можете использовать лямбда-счисление без необходимости жонглировать скобками.

Типизируемость


JavaScript разрабатывался, чтобы работать в Netscape Navigator. Его успех сделал его составной частью всех браузеров. Это вылилось в свободную типизацию. JavaScript — это Джордж Ривз среди языков программирования. JavaScript неплохо подходит для огромного числа не веб-ориентированных приложений.

Движущаяся цель


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

Комитет ECMA, который занимается разработкой расширений к языку, несмотря на хорошие намерения, создал одну из самых его больших проблем: сделано и так слишком много его версий. Это создает путаницу.

Ошибки в дизайне


Ни один язык программирования не идеален. JavaScript имеет свои ошибки в дизайне, вроде перегрузки оператора "+", который значит одновременно сложение и конкатенацию с приведением типов, и частый источник ошибок — оператор with, которого лучше всего избегать. Политики для зарезервированных слов слишком строги. Использование точки с запятой было огромной ошибкой, также как и прямая запись в коде регулярных выражений. Эти ошибки привели к ошибкам при программировании, и поставили весь дизайн языка под вопрос. К счастью, большинства из этих проблем можно избежать при помощи хорошего стиля программирования.

Проблемы в дизайне вполне очевидны. Удивительно, но комитет ECMAScript не выражает никакой заинтересованности, чтобы его исправить. Возможно, они хотят создать новый язык.

Плохая реализация


Первые реализации JavaScript были достаточно глючные. Это плохо отразилось на языке. К тому же их встраивали в очень глючные браузеры.

Плохие книги


Честно говоря, все книги по JavaScript просто ужасны. Они содержат ошибки, плохие примеры и дают плохие инструкции. Важные возможности языка плохо объясняются, если объясняются вообще. Я прочитал дюжину книг по JavaScript и могу рекомендовать всего-лишь одну: JavaScript: The Definitive Guide (5th edition) написанную Дэвидом Фланаганом.

Двойные стандарты


Официальная спецификация к языку написана ECMA. И она просто ужасного качества. Её сложно читать и ещё сложнее там что-нибудь понять. Источник проблемы с плохой литературой связан с тем, что авторы не могут пользоваться стандартной документацией для того, чтобы лучше понять язык. Комитеты ECMA и TC39 только мешают.

Программисты


Большинство людей, которые пишут на JavaScript, не являются программистами вообще. Оне не обладают нужными знаниями и терпением, чтобы писать хорошие программы. Но в любом случае JavaScript имеет настолько сильную выразительную мощь, что и они могут сделать что-то полезное. Это создало JavaScript репутацию языка для новичков, не пригодного для профессионального программирования. А это совсем не так.

Объектно-ориентированный язык


Является ли JavaScript объектно-ориентированным языком? Он имеет объекты, хранящие данные и методы, которые могут эти данные обрабатывать. Объекты могут содержать другие объекты. У него нет классов, но у него есть конструкторы, которые делают то же самое, в том числе играя роль контейнера для переменных и методов класса. Он не имеет классо-ориентированного наследования, но у него есть прототипно-ориентированное наследование.

Два основных пути построения объектной системы — это наследования (являться кем-то) и аггрегация (иметь что-то). JavaScript может всё это, но его динамическая натура позволяет превосходить агрегацию.

Один из аргументов в пользу того, что JavaScript — не объектно-ориентированный язык, заключается в том, что JavaScript не умеет прятать данные. Это так, объекты не могут иметь закрытых переменных или методов: все части объекта открыты.

Но, оказывается, объекты в JavaScript могут иметь закрытые переменные и методы. Конечно, только некоторые это понимают, потому что JavaScript — это самый непонятный язык программирования в мире.

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

Post Scriptum: да, статья достаточно большая и старая, но прочитать её стоит, особенно в связи с разработкой JavaScript 2.
Update: Спасибо Outspector за огромное количество исправлений.
Tags:
Hubs:
+89
Comments 144
Comments Comments 144

Articles