Альтернативы JavaScript


144

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

Знаете ли вы о какой-либо существующей или планируемой инициативе по созданию лучшего (переработанного) языка любого вида (не только javascript) для манипулирования деревом DOM и HTTP-запросов в браузерах следующего поколения? Если да, каков план его интеграции, скажем, в Firefox, и если нет, то по каким причинам (кроме взаимодействия) должен быть JavaScript единственный поддерживаемый язык на платформе браузера?

Я уже использовал jQuery, и я также прочитал «javascript: хорошие части». Действительно, предложения хороши, но я не могу понять, почему только javascript? На стороне сервера (ваша любимая платформа os) мы можем манипулировать деревом DOM на любом языке, даже на Fortran. Почему клиентская часть (платформа браузера) поддерживает только javascript?


4
Google Dart, Script #, CoffeeScript, JSX (обе разные реализации JS), JavaScript Harmony и т. Д. См. Эту ссылку для получения дополнительной информации github.com/jashkenas/coffee-script/wiki/…
nawfal

25
Хороший вопрос. Язык, разработанный за 10 дней, до сих пор остается у нас в 2013 году. Wtfjs.com
Den

2
«Почему только javascript? На стороне сервера (ваша любимая платформа os) мы можем манипулировать деревом DOM с каждым языком, даже с Fortran. Почему клиентская сторона (платформа браузера) поддерживает только javascript?» на стороне сервера вы можете установить все, что захотите, но я не могу заставить ваших клиентов устанавливать дополнительные плагины / дополнения, даже если у нас столько ошибок и проблем безопасности с javascript, угадайте, сколько ошибок и проблем безопасности у нас будет, если мы добавим еще несколько?
Питер

6
@ Питер Я не могу сказать, серьезен ли твой аргумент или шутка. Люди легко устанавливают платформы, если хотят. Если бы альтернатива Javascript была доступна и работала хорошо, тогда коммерческие провайдеры просто потребовали бы, чтобы пользователи загрузили все, что нужно для ее запуска - так же, как они всегда делали с Flash, и так же, как они делали некоторое время с Silverlight. Из всех причин, по которым на стороне клиента могут не появиться альтернативы, сложность обеспечения того, чтобы у ваших пользователей была ваша платформа, не является значительной из них.
Ely

1
@ely: А получилось хорошо? Вспышка? Java-апплеты? Silverlight? У меня даже не было экземпляра Silverlight.
Себастьян Мах

Ответы:


41

Проблема с javascript заключается не в самом языке - это очень хороший прототип и динамический язык. Если вы пришли из ОО, у вас есть некоторая кривая обучения, но это не ошибка языка.

Большинство людей предполагают, что Javascript похож на Java, потому что у него похожий синтаксис и похожее имя, но на самом деле это больше похоже на lisp. Это на самом деле очень хорошо подходит для манипулирования DOM.

Настоящая проблема в том, что он компилируется браузером, и это означает, что он работает по-разному в зависимости от клиента.

Мало того, что фактический DOM отличается в зависимости от браузера, но есть огромная разница в производительности и макете.


Изменить следующее уточнение в вопросе

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

Кроме того, вам потребуется встроенный в браузер переводчик или каким-либо образом установленный в качестве плагина (который вы можете проверить перед тем, как открыть страницу) для каждого языка. Потребовались годы, чтобы привести Javascript в соответствие.

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

ОК, а как насчет песочницы для скомпилированного кода? Звучит как апплеты Java для меня. Или ActionScript во Flash. Или C # в Silverlight.

А как насчет стандарта IL? Это имеет больший потенциал. Разработка на любом языке, который вы хотите, а затем скомпилируйте его в IL, который затем JIT браузер.

За исключением того, что Javascript уже похож на IL - просто посмотрите на GWT . Это позволяет вам писать программы на Java, но распространять их как HTML и JS.


Изменить после дальнейшего уточнения в вопросе

Javascript не является или, скорее, не является единственным языком, поддерживаемым браузерами: в темные времена Internet Explorer можно было выбирать между Javascript или VBScript для работы в IE. Технически IE даже не запускал Javascript - он запускал JScript (в основном, чтобы избежать необходимости платить Sun за слово java , Oracle все еще владеет именем Javascript ).

Проблема заключалась в том, что VBScript был проприетарным для Microsoft, но также и в том, что он был не очень хорош. В то время как Javascript добавлял функциональность и получал высокоскоростные инструменты отладки в других браузерах (например, FireBug), VBScript оставался только для IE и практически не отлаживался (инструментов для разработки в IE4 / 5/6 не было). Тем временем VBScript также расширился и стал довольно мощным скриптовым инструментом в ОС, но ни одна из этих функций не была доступна в браузере (и когда они были, они стали огромными дырами в безопасности).

Есть все еще некоторые корпоративные внутренние приложения, которые используют VBScript (и некоторые полагаются на эти дыры в безопасности), и они все еще используют IE7 (они только остановили IE6, потому что MS наконец-то убила его).

Приведение Javascript в его текущее состояние было кошмаром и заняло 20 лет. Он по-прежнему не имеет постоянной поддержки, так как языковые функции (указанные в 1999 году) по-прежнему отсутствуют в некоторых браузерах и требуются многочисленные шайбы.

Добавление альтернативного языка для перевода в браузерах сталкивается с двумя основными проблемами:

  • Заставить всех поставщиков браузеров внедрить новый языковой стандарт - то, что им не удалось сделать в Javascript в течение 20 лет.

  • Второй язык потенциально ослабляет поддержку, которую вы уже имеете, что позволяет (например) IE иметь вторую поддержку Javascript, но отличный VBScript (опять же). Я действительно не хочу писать код на разных языках для разных браузеров.

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


5
Я бы сказал, что он «интерпретируется», а не «компилируется» браузером.
Флавиус Стеф

19
Более новые браузеры делают JIT-компиляцию на JavaScript.
Носредна

4
Я также погуглил утверждение jit, и, как выяснилось, в Firefox 3.1 будет встроена поддержка. Ознакомьтесь с andreasgal.com/2008/08/22/tracing-the-web или people.mozilla.com/~schrep/ tm-image-Adjust.swf
Флавиус Стеф

2
Движок V8 JavaScript (chrome) компилируется напрямую.
Дейв У. Смит

3
Я категорически не согласен с вашим первым ответом "проблема с JavaScript не в самом языке". Я думаю, что это синтаксически очень уродливый язык, и в нем отсутствуют функции, которые вы получаете от большинства других языков. Функции, которые, по крайней мере, мне все еще нужны в больших приложениях (загрузка зависимостей, читаемые принципы ОО). Если бы нам пришлось делать это (через Интернет) сейчас, я не думаю, что JavaScript был бы «лучшим» вариантом для языка.
SirLenz0rlot

28

Компилировать в Javascript

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

(Но я на самом деле не думаю, что это проблема. Javascript уже хорошо оптимизирован. Машинный код также небезопасен, если написан вручную, но отлично работает как цель компиляции и язык выполнения.)

Так много вариантов

Существует постоянно растущий пул языков, которые компилируются в Javascript. Довольно полный список можно найти здесь:

Обращает на себя внимание

Я упомяну некоторые из них, которые я считаю заслуживающими внимания (хотя, без сомнения, пренебрегаю некоторыми драгоценными камнями, о которых я не знаю):

  • Spider появился в 2016 году. Он претендует на то, чтобы взять лучшие идеи Go, Swift, Python, C # и CoffeeScript. Он не безопасен, но имеет некоторые незначительные функции безопасности .

  • Elm : Haskell может быть самым умным языком из всех, и Elm - это вариант Haskell для Javascript. Он очень чувствителен к типу и лаконичен, и предлагает функциональное реактивное программирование как отличную альтернативу реактивным шаблонам или спагетти MVC. Но это может быть шоком для процедурных программистов .

  • Цель Google Go - лаконичность, простота и безопасность. Код Go может быть скомпилирован в Javascript с помощью GopherJS .

  • Дарт был более поздней попыткой Google заменить Javascript. Он предлагает интерфейсы и абстрактные классы через C / Java-подобный синтаксис с необязательной типизацией.

  • Haxe похож на ActionScript Flash, но он может работать с несколькими языками, поэтому ваш код можно повторно использовать в программах на Java, C, Flash, PHP и Javascript. Он предлагает типобезопасные и динамические объекты.

  • Opalang добавляет синтаксический сахар в Javascript, чтобы обеспечить прямой доступ к базе данных , интеллектуальные продолжения, проверку типов и помощь в разделении клиент-сервер. (Привязано к NodeJS и MongoDB.)

  • GorillaScript , «язык компиляции в JavaScript, разработанный для расширения возможностей пользователя при попытке предотвратить некоторые распространенные ошибки». похож на Coffeescript, но более всеобъемлющий, предоставляя множество дополнительных функций для повышения безопасности и уменьшения количества повторяющихся шаблонов.

  • LiteScript находится где-то между Coffeescript и GorillaScript. Он предлагает асинхронный / выходной синтаксис для «обратных» обратных вызовов и проверку на наличие опечаток переменных.

  • TypeScript от Microsoft - это небольшой расширенный набор Javascript, который позволяет устанавливать ограничения на типы аргументов функций, которые могут отлавливать несколько ошибок. Точно так же BetterJS позволяет вам применять ограничения, но в чистом Javascript, либо добавляя дополнительные вызовы, либо указывая типы в комментариях JSDoc. И теперь Facebook предложил Flow, который дополнительно выполняет вывод типов.

  • LiveScript является дополнительным продуктом от Coffeescript, который был популярен своей краткостью, но не выглядел очень читабельным для меня. Наверное, не самый лучший для команд.

Как выбрать?

При выборе альтернативного языка необходимо учитывать несколько факторов :

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

  • Имеет ли язык слишком мало функций (код все еще будет заполнен стандартным шаблоном) или слишком много функций (освоение займет много времени, и до тех пор некоторый действительный код может быть невозможно расшифровать)?

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

Будущее...

Джефф Уокер написал серию постов, заставляющих задуматься, о «проблеме Javascript», в том числе о том, почему он считает, что ни TypeScript , ни Dart, ни Coffeescript не предлагают адекватных решений. Он предлагает некоторые желательные функции для улучшения языка в заключении .


ES6 расширяет Javascript множеством функций, позволяющих более четко определять классы, и «встроенной асинхронностью» через генераторы. Тем не менее, динамически печатается, хотя!
Joeytwiddle

Подход Elm похож на Nitrogen или N2O (рамки Эрланга), поэтому он мне нравится.
ДенисКолодин

В настоящее время у нас есть некоторые синтаксические особенности CoffeeScript в ES8 и TypeScript, а также async-await. TypeScript предотвратил много ошибок на моем рабочем месте, хотя есть еще некоторые возможности для сюрпризов!
Joeytwiddle

Теперь также есть Wasm , который позволяет запускать в браузере другие языки. Однако связь с DOM все еще происходит через JavaScript.
Joeytwiddle

22

должен ли JavaScript быть единственным поддерживаемым языком на платформе браузера?

Да и нет. Существует альтернатива под названием Dart от Google, которая компилируется в JavaScript и, подобно jQuery, пытается немного облегчить манипулирование DOM. Это может быть весело экспериментировать, проверить это.

Смотрите также


15

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

И действительно нет альтернатив, которые работают по всем направлениям. Вспоминается Flash, но это тоже сценарий ECMA, и для большинства вещей он, вероятно, слишком убит.


1
или MooTools, Prototype и Dojo. jqueryvsmootools.com - отличное сравнение mootools и jquery.
Райан Флоренс

В Javascript нет ничего плохого. Вы, вероятно, имеете в виду проблемы в JScript IE и общие проблемы рендеринга и несоответствия с различными браузерами.
Гэвин

7

В краткосрочной перспективе я бы использовал такие вещи, как jQuery, чтобы скрыть несовместимости браузера. В долгосрочной перспективе такие технологии, как Silverlight или Adobe AIR, могут сделать это совсем другим минным полем (но все же минным полем) в будущем.


1
+1 за использование jQuery, чтобы скрыть несовместимости браузера. Я прочитал книгу, объясняющую, как работают некоторые из этих механизмов, и поверьте мне, когда я говорю, что jQuery избавляет программистов от головной боли в этом отделе.
Река Вивиан,

1
Оглядываясь на технические ответы задним числом, всегда странный взгляд. теперь мы знаем, что сеть победила: серебристый свет, вспышка и воздух все мертвы, а оставшийся победитель - это javascript во всех его странных и чудесных заклинаниях.
олигофрен

6

Дуг Крокфорд выступил с речью в Google подробно рассказав о плохих и хороших сторонах JavaScript и его будущем. С 1999 года он практически не изменился - что можно сказать, что это хорошо (почти все браузеры могут запускать один и тот же код, если вы знаете об их ограничениях), и Даг показывает, где хорошие части были в основном недоразумения, которые оказываются очень сильными.

Что касается манипулирования DOM, посмотрите на JQuery как библиотеку на стороне клиента, которая заменяет большую часть ужасного DOM API операциями, которые затрудняют написание довольно элегантных фрагментов кода, которые легче писать.


5

Если вы думаете, что у JavaScript есть серьезные проблемы, я рекомендую книгу Дуга Крокфорда « JavaScript: хорошие части» . (Или Google для «Crockford JavaScript», чтобы найти несколько видеопрезентаций, которые он сделал.) Крокфорд обрисовывает в общих чертах безопасное подмножество и набор методов, и определенно перечисляет некоторые части языка, которых следует избегать.

Я не знаю о планах заменить JavaScript как де-факто средство манипулирования DOM. Поэтому лучше всего научиться пользоваться им безопасно и хорошо.


1
Прочти снова. Понятно, что он отредактировал свой вопрос после прочтения ответов.
Дейв У. Смит

4

С точки зрения клиентской части Javascript - единственный способ манипулировать DOM. С точки зрения серверной стороны существует множество способов.


4

Internet Explorer поддерживает подключаемые языки сценариев, хотя единственным, который надежно включен в IE помимо JScript, является VBScript.

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


1
Не используйте VBScript в IE - это ужасный вариант VB, который, как думала большая MS, взлетел, но не сделал этого. На самом деле он не работает как обычный VB или VBScript, и медленнее, чем Javascript.
Кит

1
Чего не хватает, скажем, в реализациях JavaScript / ECMAScript в WebKit или Gecko, которые доступны в небраузерных реализациях? Этот комментарий совершенно смущает меня.
век

4

Если вы хотите ограничить своих клиентов / посетителей конкретными браузерами и, возможно, захотите потребовать от них установки плагина, вы можете взглянуть на MS Silverlight - читаемый обзор находится в Википедии . С Silverlight 2 вы можете запускать на стороне клиента код, написанный на C #, IronPython, IronRuby, VB.NET и т. Д .; бесплатный клон Silverlight от Moonlight из проекта Mono обещает принести такую ​​же функциональность в Linux.

На практике большинство разработчиков веб-приложений и сайтов предпочитают охватывать более широкую аудиторию, чем Silverlight (и, возможно, Moonlight) в настоящее время могут предоставить - что означает использование Javascript или, возможно, Flash (который использует аналогичный язык программирования, Actionscript).

Таким образом, получение значительного умственного обмена, принятия и поддержки для всего остального оказывается тяжелой борьбой даже для Microsoft с ее многочисленными группами инженеров и маркетинговыми бюджетами и сторонним проектом свободного программного обеспечения (возможно, чтобы облегчить беспокойство по поводу запатентованной блокировки). ) - это может помочь объяснить, почему очень мало интереса, например со стороны Mozilla Foundation, к достижению этой цели. «Помимо функциональной совместимости», вы говорите: но ясно, что проблема функциональной совместимости здесь важна, учитывая то, что мы наблюдаем за прогрессом Silverlight ...


3

Как уже было сказано, у вас есть Flash (ActionScript, который является производным языком от Javascript) и Silverlight / Moonlight (IronPython, IronRuby, JScript, VBScript, C #), которые могут работать в браузере с помощью плагинов (первый из них гораздо более распространен) ,

Существует также другая альтернатива, если вам нравится Ruby: HotRuby , это реализация ruby ​​в javascript, которая будет работать в браузере. Он еще не очень зрелый, но вы можете посмотреть на него.


3

Одна вещь, которую я не видел, упоминалась (о, я вижу, что Alcides упоминал HotRuby, когда я писал, а Nosredna упоминала GWT и Script #) и хотел бы выкинуть, что есть ряд реализаций [insert language] -on- JavaScript (например, переводчики, которые позволяют конвертировать Ruby , Python , C # , Java , Obj-J / Cappuccino [аналогично Obj-C / Cocoa] или Processing [для Canvas] в JavaScript либо на клиенте, либо перед развертыванием [и некоторые из которых также есть различные библиотеки абстракций]). Конечно, если он переводится на клиента, это приводит к снижению производительности, но если вам удобнее использовать другой язык, это даст вам некоторую гибкость.

Лично я рекомендую научиться любить JavaScript. Это отличный, мощный язык и довольно элегантный, когда вы его узнаете. Я сталкиваюсь с противоположной дилеммой, пытаясь найти подходящее серверное решение JavaScript / DOM, которое отвечает всем моим потребностям. / незапрошенное мнение


Я упомянул GWT и Script #. Для тех, кто интересуется сценарием №, ссылка - projects.nikhilk.net/ScriptSharp
Nosredna

Спасибо, что указали мне на Obj-J / Cappuccino. Это удивительно для создания веб-приложений, и я открыл его только потому, что вы упомянули это, и имя (и отношение к Какао) заинтриговало меня.
Тимо

2

Нет. JavaScript есть, но он будет развиваться. Следующая версия "JavaScript Harmony", и вы можете узнать больше, если вы Google это.

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

Я люблю JavaScript. Но есть и другие решения, в том числе GWT, который компилирует Java в JavaScript и Script #, который компилирует C # в JavaScript.


2

Jquery (все еще javascript, но) это действительно поможет вам, у них есть поддержка почти всех браузеров, и это не так уж сложно изучить :)


2

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

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

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

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


1

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


1

Может быть, что-то вроде haxe (см. Haxe.org) может вам помочь. Это язык, который кажется чище JavaScript и может быть скомпилирован в JavaScript, поэтому его можно запускать в браузере.

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


1

Многие люди понимают, что Javascript не самый лучший и самый красивый язык. Тем не менее, в настоящее время он поддерживается браузерами, и поэтому будет крайне сложно внедрить другой язык. Нам просто не нужна еще одна браузерная война.

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

Но я думаю, что Javascript не так уж плох, если вы начнете думать о модели DOM и о том, как с ней работать. Многие вещи, которые мешают JS, являются результатом работы модели DOM.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.