Отличие Java от JavaScript. Javascript для начинающих: история, назначение, отличия от Java

Вопрос о том, чем отличается Java от JavaScript, будоражит умы многих начинающих программистов, ведь они кажутся почти одинаковыми и имеют однокоренное слово в своих именах. Можно предположить, что JS больше похож на «скриптовую» форму. Но это неправильное суждение. Это два разных языка программирования. Они лишь совместно используют общую историю создания Netscape, что объясняет их похожесть. Далее они расходятся совершенно в разные стороны.

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

В первые дни появления Интернета, в 1990 году, Internet Explorer и Netscape Navigator были двумя самыми популярными веб-браузерами, которые широко применяли пользователи.

Талантливый разработчик Брендан Эйч из Netscape Inc всего за 10 дней создал язык программирования для браузера, который инструктировал компьютер о том, как взаимодействовать с пользователем. Он назвал этот язык Livescript и интегрировал его непосредственно в Navigator. После чего браузер интерпретировал команды пользователя. Код компилировать было не нужно, а подключаемый модуль вообще не требовался.

Другой язык программирования - Java, набирал популярность примерно в то же время, хотя для работы его требовался отдельный плагин. Это язык программирования, изобретенный Джеймсом Гослингом из Sun Microsystems. На его создание и развитие потребовалось намного больше, чем 10 дней - это заняло более четырех лет. С 1991 года группа инженеров Sun Microsystem под названием «Зеленая команда» работала день и ночь, чтобы создать его. Он был впервые увидел свет в 1995 году, с тех пор было выпущено несколько новых версий языка.

Сегодняшний Интернет насыщен продуктами программирования, и можно поблагодарить Java за многие его приложения, которые облегчают повседневную жизнь пользователей. В настоящее время бренд принадлежит Oracle.

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

Особенности языка:

  • Компиляция и интерпретация - это Java, что и создает условия для перевода компилятором исходного кода в байт-код. Затем создается машинный код, который может выполняться непосредственно машиной, и за это отвечает интерпретатор.
  • Наличие независимой и портативной платформы, ее можно переместить с одной машины на другую. Применять с любой модификацией операционных систем, при этом системные ресурсы и процессор не влияют на программы.
  • Байт-код, сгенерированный компилятором, может использоваться на любой машине.
  • Чисто объектно-ориентированный язык, где все вращается вокруг классов и объектов.
  • Предотвращает угрозу вирусов и неправильное использование ресурсов. Он состоит из сборщика мусора и использует обработку исключений для устранения ошибок и риска сбоев.
  • Distributed. Он позволяет создавать приложения в сети и может совместно использовать как данные, так и программу. И также может использоваться для доступа к удаленным объектам через интернет и позволяет нескольким программистам работать в тандеме из разных удаленных мест.
  • Многопоточность и интерактивность. Помогает многопоточным программам, где одновременно можно обрабатывать несколько задач.
  • Имеет динамические и расширяемые новые классы, объекты, методы и библиотеки. Он также может поддерживать функции, написанные на таких языках, как C и C ++.
  • Простота разработки, так как повторное использование кода облегчает процесс создания.
  • Масштабируемость. Можно улучшить производительность, увеличив время запуска и минимизируя потребление памяти в среде выполнения.
  • JavaScript - это что такое? Прежде всего данный язык важен для функционирования системы. Он имеет встроенный клиентский обеспечивающий корректное поведение и интерактивность приложений. Язык был представлен в ECMA (Европейская ассоциация производителей компьютеров) Netscape для целей стандартизации. Стандартная версия называется ECMA Script. Он стал популярным из-за маркетинговой уловки, чтобы получить пользовательский интерес.

    Браузер используется для запуска кода JavaScript (что это такое, мы рассматриваем). Последний доступен в разных версиях. Не только браузеры используются в качестве платформ. Некоторые базы данных, такие как Mongo DB, Couch DB, используют JS в качестве языка сценариев и запросов. Он включает в себя небольшой и простой набор команд относительно Java, интерпретируемых браузером.

    События страниц могут быть быстро построены с помощью JS, хотя он не способен разрабатывать настольные приложения так, как могут развиваться другие языки, такие как Java или C ++, предназначенные для управления.

    Особенности и описание языка программирования Java приводятся ниже:

  • Интерпретация - код JS исполняется в браузере, непосредственно лишая компиляцию кода.
  • Язык сценариев на стороне клиента, который использует браузер для выполнения кода, и не требует взаимодействия с сервером. Тем не менее новые версии и фреймворки уже позволяют создавать скрипты на стороне сервера.
  • Event-based - может запускать определенный код при возникновении какого-либо может быть любая страница загрузки или отправка формы.
  • Применяет контроль над HTML-страницей, манипулируя объектами на ней.
  • Первичные языковые различия

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

    Для лучшего понимания вопроса представим таблицу сравнения.

    Строгий язык с переменной, объявленной ​​сначала для использования в программе. Тип переменной проверяется в процессе компиляции.

    Имеет более расслабленный синтаксис и правила.

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

    Язык для сценариев на основе объектов.

    Приложения могут запускаться на любой виртуальной машине (JVM) или в браузере.

    JS-код выполняется только в браузере, поскольку JS разработан только для браузера.

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

    Объекты базируются на прототипах.

    Программа имеет расширение файла.Java и преобразует исходный код в байт-коды, которые выполняются JVM (Java Virtual Machine).

    Файл имеет расширение файла «.js» и интерпретируется, но не компилируется, каждый браузер имеет интерпретатор JavaScript для выполнения JS-кода.

    Автономный язык.

    Программа использует больше памяти.

    Требует меньше памяти, поэтому используется на веб-страницах.

    Использует поточный подход к параллелизму

    Поддерживает события на основе параллелизма

    Используя данную таблицу, пользователи лучше начнут понимать, в чем разница Java и JavaScript.

    JavaScript изначально был специфичным для сайта. В своем нынешнем воплощении он работает практически на всех браузерах, а некоторые веб-сайты используют его для улучшения своего пользовательского интерфейса. Джава-апплеты поддерживаются браузерами только в некоторой степени, их использование невелико в основном из-за проблем безопасности. У большинства посетителей сайта включен JS, а Джава-приложения отключены по умолчанию, особенно в мобильных браузерах. Оба языка совместимы с сервером Джава, например, в приложениях, как Apache Tomcat, JBoss и WebSphere.

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

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

    Изучив эти аргументы, пользователя, возможно, найдет ответ на вопрос о том, в чем разница у Java и JavaScript.

    Ключевые отличия современных языков

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

  • Стиль исполнения. Ключевым является то, как они выполняются. Джава-код обычно записывается в IDE и скомпилирован в код запускающегося виртуальной машиной Джава, но не читается пользователями. JS реализуется обычным образом с помощью своего механизма и синтаксиса. На самом деле файлы JS, отправленные в Интернете, обычно сжимаются до едва различимого формата. Читаемость является важным различием, поскольку для изменений в Джава IDE потребуется выполнения ряда шагов и специализированное ПО для компиляции и развертывания изменений.
  • Влияние сообщества. Сообщество программистов оказало огромное влияние на оба языка. Java Community Process используется Джава для принятия входных данных о будущих включениях на языках через запросы спецификации. Текущий владелец Джава, Oracle, использует эти запросы для работы над следующей официальной реализацией языка.
  • Написание и развертывание. Это другое ключевое отличие Java и JavaScript. Джава создан специально для разработчиков, которые записывают код один раз, а затем развертывают его в любой операционной системе, которую они выбирают, без необходимости внесения изменений. JS более восприимчив к изменениям среды исполнения и следует за открытым стандартом ECMAScript.
  • Сравнение Java и JavaScript как концепции наследования. JS не использует классы, а основан на прототипе.
  • Различия в родословной. JS имеет более простой и меньший набор команд, чем Джава.
  • В то время как Джава и JS имеют один и тот же объектно-ориентированный подход, первый может стоять сам по себе, а последний должен быть в основном размещен в HTML-документе для работы. Джава является более сложным и более широким языком, создавая автономные приложения.

    Джава-апплеты являются полностью автономными программами, а JS - это текст, который обрабатывается и интерпретируется браузером. Однако сегодняшние веб-приложения размывают границы между обычными настольными приложениями и создаваемыми с использованием обычных веб-технологий, таких как CSS, HTML и JS.

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

    Джава не зависит от HTML, а JS почти полностью зависит от него. Ответ на вопрос, какой язык лучше подходит для лучших веб-приложений, может варьироваться, причем некоторые предпочитают JSt на лету, а некоторым нравятся более широкие возможности и сильные стороны Джава.

    Одна из самых сильных сторон JS заключается в том, что люди могут понять его. Это значительно упрощает кодирование и делает язык более надежным. Это также дает огромное преимущество по сравнению с Джава по скорости. Можно быстрее создавать события и элементы веб-страницы с помощью JS, чем с Джава. Многие команды JavaScript также называются обработчиками событий. Эти команды непосредственно встроены в существующие команды HTML.

    Помимо простоты использования JavaScript больше прощает программисту, чем Java. Это дает программисту больше свободы в плане создания объектов с его прототипом. Между тем Java более жесткая и требует, чтобы все классы и экземпляры были определены и обозначены. JavaScript также позволяет вызывать уже существующие объекты, например, сам браузер или строку состояния, и разрешает играть только с этой частью. Java больше ориентирован на то, где он нужен почти все время, тогда как JavaScript ориентирован на веб-страницы.

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

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

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

    Эти языки сейчас актуальные и очень часто используются. Это не самые новые языки, но и их не назовешь.

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

    Язык программирования JavaScript обычно используется при веб-разработке и предоставляет дополнительные функции страницам или может создать приложение в самой веб-странице. Некоторые видеоигры были разработаны с использованием JavaScript, и они могут быть запущены прямо в окне интернет-браузера. Например, на игровом сайте для детей http://igryman.ru/view_360 JavaScript используется для функционала сайта, а сами игры сделаны на Flash.

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

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

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

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

    Несмотря на то, что в своем имени они разделяют имя «Java», у них очень мало атрибутов и характеристик. В этой статье мы рассмотрим некоторые ключевые различия в языках, изучив некоторые высокоуровневые атрибуты, предлагаемые каждым языком.

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

    Java и JavaScript

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

    Java - относится к JavaScript, как хам - к хомяку.

    К сожалению, я не могу претендовать на эту аналогию как свою собственную. Вместо этого, это придумал Джереми Кейт , но это отличная идея: единственное, что объединяет языки, - это то, что они разделяют имя «Java» в их имени.

    Одно сходство в том, что языки - это то, что мы называем «C-style» языками, в том смысле, что их синтаксисы аналогичны синтаксису языка C. То есть, они оба имеют функции, скобки, скобки и точки с запятой.

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

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

    Итак, начнем.

    Что такое Java?

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

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

    Но подождите: что такое среда выполнения Java?

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

    Байт-код Java - это набор инструкций виртуальной машины Java. Каждый байт-код состоит из одного, а в некоторых случаях двух байтов, представляющих команду (код операции), вместе с нулями или более байтов для передачи параметров.

    Звучит не так волнующе, не правда ли? Это нормально! Как разработчики, мы не несем ответственности за написание байт-кода. Вместо этого компилятор Java компилирует наш код в байт-код.

    Этот байт-код выполняется поверх среды выполнения, которая выполняется в контексте другой операционной системы. Эта операционная система может работать на сотовом телефоне, может работать на другом компьютере, может работать в Windows, OS X, Linux или любой другой системе, на которой она совместима. Вы можете прочитать все об этом на этой странице .

    Звучит неплохо, да? Дело в том, что здесь есть ряд проблем. Кажется, это намного проще, чем это, и это то, над чем работают более продвинутые Java-разработчики. Это выходит за рамки данной статьи. Вместо этого мы сосредоточимся на атрибутах языка, чтобы мы могли сравнить и сопоставить его с JavaScript.

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

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

    Если вы никогда не писали код раньше, некоторые из них могут звучать как жаргон. Понятно! У нас есть ресурсы, которые помогут вам научить вас тому, что вам нужно знать:

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

    Что такое JavaScript?

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

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

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

    Если вас что-то смущает, не волнуйтесь! Мы все были там:

    • Определение переменных?
    • Реализация функций?
    • Создание объектов?
    • Настройка условных операторов?
    • И многое другое.

    Это много. Я знаю. Но самое приятное, что у нас есть много ресурсов, чтобы ускорить работу с JavaScript. И как только вы изучите нюансы языка, становится легче и легче работать в его пределах.

    Помните, что все «я не уверен, что я делаю» естественно, и это часть обучения. Если вы никогда не видели программирования, связанного с JavaScript, я настоятельно рекомендую проверить несколько следующих курсов:

    После того, как вы лучше освоите язык, важно также использовать надлежащие инструменты для разработки ваших приложений. Это включает в себя использование таких инструментов, как отладчик (который включает большинство современных браузеров). Однако это выходит за рамки данной статьи.

    Примечание об объектной ориентации

    Еще одно важное отличие состоит в том, что JavaScript и Java рассматриваются как объектно-ориентированные языки, но по разным причинам.

    Java позволяет нам создавать экземпляры объектов из классов, которые мы создаем. Напротив, все в JavaScript является объектом. Это означает, что классов нет. И поскольку все является объектом, все имеет методы и свойства, которые мы можем использовать.

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

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

    Какой из них выбрать?

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

    Хотя вы можете писать JavaScript на сервере с такими технологиями, как Node.js, они не являются теми же типами приложений, которые созданы на Java. Кроме того, хотя вы можете писать серверные приложения на Java, они не являются теми же типами приложений, которые вы обычно пишете с помощью JavaScript.

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

    Заключение

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

    Если вы хотите работать в Интернете, JavaScript, скорее всего, ваш лучший выбор. Если, с другой стороны, вы хотите писать настольные приложения, то Java - не плохой выбор.

    Для тех, кто заинтересован, стоит отметить, что JavaScript стал одним из де-факто языков работы в Интернете. Это не без кривых обучения, а также множество фреймворков и библиотек, которые заставляют вас напряженно трудиться. Если вы ищете дополнительные ресурсы для изучения или использования в своей работе, ознакомьтесь с имеющимися у нас на рынке Envato .

    Я провожу большую часть своего времени, работая с WordPress; Тем не менее, я также поклонник JavaScript и веду блог об этом время от времени . Если вас интересуют другие курсы и учебные пособия, которые я написал для Envato, ознакомьтесь со страницей моего профиля . Кроме того, вы можете прочитать больше статей о разработке WordPress и JavaScript в моем блоге . Не стесняйтесь следовать за мной в Twitter также на

    LiveScript, ECSMAScript = JavaScript

    Сейчас мы спокойно реагируем на Gmail, с его всплывающими окнами, мгновенными сообщениями и все это без перезагрузки страницы. Но в начале 90-х на подобное могли программы под Windows и то с очень большой натяжкой, при этом накладывая свою природу Standalone приложений. Собственно, обозначенная проблема, это нехватка веб-страничкам интерактивности, только сухой текст с картинками да гиперссылки. Этой проблемой и обеспокоились инженеры тогда еще компании Netscape (сейчас Mozilla) и здесь стоит начать рассказ о Javascript.

    Перед молодым инженером Бренданом Айком, была поставлена задача, создать язык, который был бы похож на Java, но был поменьше и как писал сам автор «эдаким младшим его братом», и очень важно, имел бы выразительную лексику, чтобы непрограммисты могли быстро освоить технологию. Уже по истечению 10-ти дней была написана первая версия языка, которую решили назвать LiveScript. Конечно, создать за короткий промежуток времени идеальный язык вряд ли возможно, но, несмотря на некоторые свои недостатки, он решал поставленную перед ним задачу, а именно, позволял работать с HTML без перезагрузки страницы.

    Через некоторое время, язык был переименован в JavaScript. Такое название выбрано не случайно. В то время, да собственно как и сейчас, язык Java был очень популярен и приставка слова Java, должна была привлечь больше внимания к языку. И это дало свои плоды, люди заинтересовались, попробовали, оценили возможности языка, да так, что после анонса технологии, более 20-ти компаний выразили намерение использовать в своих будущих продуктах Javascript как объектный скриптовый язык с открытым стандартом (по материалам Wikipedia). И это был 1995 год.

    В том же году, по подаче Netscape, язык был стандартизирован ассоциацией ECMA (European Computer Manufacturers Association) и получил название ECMAScript. Текущая редакция документа 5.1, которая поддерживается большинством современных браузеров.

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

    Жизненно важные концепции для вашего кода

    С 1994 года Javascript очень сильно вырос. Сейчас это fullstack язык и это означает, что на нем можно написать полноценный сайт, без задействования дополнительно серверного языка программирования, к примеру, . Это стало возможным после появления движка V8 разработанного компанией Google и серверной платформы node.js основанной на нем.

    Стоит выделить две очень важные возможности языка, это замыкания и контекст выполнения.

    • Замыкания – это возможность обращаться к переменным, которые доступны в месте объявления функции;
    • Контекст выполнения – это изменения ссылки this на объекты внутри функции, в зависимости от того, для кого выполняется функция.

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

    Javascript это Java ?

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

    Javascript

    Интерпретируемый

    Компилируемый

    Это означает, что код, который вы напишете на Javascript, может быть выполнен сразу же, без компиляции. В свою очередь, код Java вначале должен быть преобразован в байт-код, который впоследствии будет выполнен виртуальной машиной.

    Динамическая типизация

    Статическая

    Динамическая типизация означает, что в различных участках программы, одна и та же переменная может принимать значения различных типов. К примеру, при объявлении переменной вы определили её как строковую, но по ходу выполнения, присвоили ей числовое значение. Javascript интерпретирует такой код без ошибок, компилятор же Java выдаст ошибку.

    Прототипно объектно-ориентированный

    Классово объектно-ориентированный

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

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

    Резюмируя. С чего начать?

    JavaScript на данный момент, наиболее популярный клиентский язык программирования. Если вы ранее слышали о нем и после прочтения статьи, решили все таки заняться изучением, ProstoWeb подготовил для вас несколько полезных ресурсов для начинающих:

    Сайты

    • http://javascript.ru – номер один в рунете;
    • https://developer.mozilla.org/ru/docs/JavaScript - самая свежая информация по наиболее актуальным темам языка. Большая часть статьей затрагивает более глубокие темы, но есть и базовая информация по языку (англ.).

    Пообещал написать статью про использование GraalVM для смешивания Java и JS. Вот она.


    В чем проблема? В повседневной практике часто встречаются приложения, состоящие из двух частей: JavaScript-фронтенд и Java-бэкенд. Организация интеропа между ними требует усилий. Как правило, делают их люди с разных сторон баррикад, и при попытке залезть в чужую область они начинают страдать. Еще есть фуллстек веб-разработчики, но про них всё понятно: они должны страдать всегда.


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


    Если кто-то из джавистов еще не писал на React, то здесь будет туториал, позволяющий это сделать. Если кто-то из джаваскриптеров не пробовал писать на Java, то в этом же туториале получится к ней прикоснуться (правда, всего одной строчкой и сквозь JS-биндинги).

    JS->Java. Тряхнем стариной: Nashorn

    Если хочется интероп Java->JS, такая технология в JDK давным-давно была, и называется она Nashorn (читается: «Насхорн»).


    Давайте возьмем какую-нибудь реальную ситуацию. Люди из раза в раз, из года в год, продолжают писать «серверные» валидаторы на Java и «клиентские» валидаторы на JS. Особый цинизм тут в том, что проверки зачастую совпадают на 80%, и вся эта активность, по сути, - особая форма бездарно потерянного времени.


    Представим, что у нас есть очень тупой валидатор:


    var validate = function(target) { if (target > 0) { return "success"; } else { return "fail"; } };

    Запустить мы его можем на всех трех платформах:

    • Браузер
    • Node.js

    В браузере это тривиально. Просто встраиваем этот кусок кода куда угодно, и оно работает.


    В Node.js надо либо уважать их феншуй по использованию require, либо хакнуть его к чертям вот таким простым кодом:


    var fs = require("fs"); var vm = require("vm"); var includeInThisContext = function(path) { var code = fs.readFileSync(path); vm.runInThisContext(code, path); }.bind(this); includeInThisContext(__dirname + "/" + filename);

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


    Теперь долбанем всё то же самое, но под Насхорном в Java.


    public class JSExecutor { private static final Logger logger = LoggerFactory.getLogger(JSExecutor.class); ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); Invocable invoker = (Invocable) engine; public JSExecutor() { try { File bootstrapFile = new ClassPathResource("validator.js").getFile(); String bootstrapString = new String(Files.readAllBytes(bootstrapFile.toPath())); engine.eval(bootstrapString); } catch (Exception e) { logger.error("Can"t load bootstrap JS!", e); } } public Object execute(String code) { Object result = null; try { result = engine.eval(code); } catch (Exception e) { logger.error("Can"t run JS!", e); } return result; } public Object executeFunction(String name, Object... args) { Object result = null; try { result = invoker.invokeFunction(name, args); } catch (Exception e) { logger.error("Can"t run JS!", e); } return result; } }

    Как видите, можно дернуть как произвольный код, так и отдельную функцию по ее имени.


    Есть, конечно, такие проблемы, которые можно решить только в ручном порядке. Например, можно состряпать полифилл типа такого:


    var global = this; var window = this; var process = {env:{}}; var console = {}; console.debug = print; console.log = print; console.warn = print; console.error = print;

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


    Кстати, ab на моем ноутбуке (ab -k -c 10 -n 100 http://localhost:3000/?id=2) на такой код показывает 6-7 тысяч запросов в секунду, и не важно, на чем он запущен - на Nashorn или Node.js. Но в этом ничего интересного: во-первых, ab на локалхосте измеряет погоду на Марсе, во-вторых, мы и так верим, что явных ляпов в этих движках нет, они конкуренты.


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

    Java->JS. Проблема

    Попробуем пропихнуть данные в обратном направлении, из Java в JS.


    Зачем это может быть нужно?


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


    Рассмотрим игрушечный случай из реальной жизни. Представьте: нужно сгенерить фронт вебпаком, и хочется вписать в правый верхний угол веб-странички текущую версию приложения. Вполне вероятно, что версию бэкенда можно нормальным способом вытащить только вызвав какой-то джавовый код (легаси же). Значит, нужно создать такой Maven-проект, который будет работать в два прохода: прибить к какой-нибудь фазе Maven Build Lifecycle сборку пары классов и их запуск, которые сгенерят properties-файл с номером версии, который на следующей фазе подхватит вручную вызванный npm.


    Приводить пример такого pom.xml я здесь не буду, потому что это мерзко:)


    Более глобально проблема заключается в том, что современная культура поддерживает и поощряет программистов-полиглотов и проекты, написанные на множестве языков. Из этого возникают следующие моменты:

    • Разработчики хотят использовать тот язык, который более всего подходит к решаемой задаче. Очень больно писать на Java веб-интерфейс (по крайней мере до тех пор, пока JVM и OpenJDK не стабилизируются на WebAssembly), а на JS он делается просто и удобно.
    • Часто хочется параллельно развивать несколько кодовых баз. Например, есть одна база на JS - фронт, и другая база на Java - бэк. Хочется развивать проекты, потихоньку переписывая всё приложение на Node.JS, включая серверный код - в тех местах, где Java не нужна по смыслу. Не должно быть «дня номер ноль», когда весь Java-бэкенд или JS-фронтенд отправляется на свалку, и пусть весь мир подождет, пока мы напишем новый.
    • При пересечении границы языка приходится вручную писать множество мусорного кода, обеспечивающего интероп.

    Иногда есть готовые решения - например, переход границы Java/С делается с помощью JNI.


    Использование такой интеграции еще и тем хорошо, что, как любят говорить программисты-функционалы, «не сломается то, чего нет». Если мы в своем коде поддерживаем адовейшие pom.xml, properties и xml-файлы и другой ручной интероп, то они имеют свойство ломаться в самых неприятных моментах. Если же эту прослойку написали какие-нибудь реальные боевые ботаны, типа Oracle или Microsoft, оно почти не ломается, а когда ломается - чинить это не нам.


    Возвращаясь к предыдущему примеру: зачем нам вставать два раза и делать чудеса с Насхорном, если можно не вставать вообще и писать весь UI только на Ноде?


    Но как это сделать, учитывая, что нужно прозрачно посасывать данные из Java?


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

    Java->JS. Graal

    К счастью, у нас есть еще один довольно новый и интересный проект - Graal.js. То есть часть Graal, ответственная за запуск JavaScript.


    Инновационные проекты из мира JDK зачастую воспринимаются чем-то далеким и нереальным. Graal в этом плане отличается - очень внезапно он вышел на сцену как зрелый конкурент.


    Graal - это не часть OpenJDK, а отдельный продукт. Он известен тем, что в свежих версиях OpenJDK можно переключить JIT-компилятор из C2 на тот, что идет в составе Graal. Кроме того, в составе Graal поставляется фреймворк Truffle, с помощью которого можно реализовывать разные новые языки. В данном случае разработчики из Oracle Labs реализовали поддержку JavaScript.


    Чтобы прочувствовать, насколько это просто и удобно, давайте рассмотрим игрушечный проект-пример.


    Представим, что мы делаем рубку НЛО на Хабре.



    В первой версии Рубки, НЛО сможет банить рандомных людей, и кнопка будет называться «Забанить кого-нибудь!». Во второй версии кнопка будет банить или троллей, или спамеров, и кого именно мы сейчас баним - будет подгружаться из Java. В целях минимализации примера меняться будет только надпись на кнопке, бизнес-логику прокидывать не будем.


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

    Часть 1. Заготовка приложения1. Качаем «энтерпрайзную» GraalVM (по ссылке) и прописываем обычные для Java переменные окружения.

    Энтерпрайзная версия нужна потому, что только в ней есть GraalJS.


    Можно, например, в.bash_profile записать вот такое:


    graalvm () { export LABSJDK=/Users/olegchir/opt/graalvm-0.33/Contents/Home export LABSJRE=/Users/olegchir/opt/graalvm-0.33/Contents/Home/jre export JDK_HOME=$LABSJDK export JRE_HOME=$LABSJRE export JAVA_HOME=$JDK_HOME export PATH=$JDK_HOME/bin:$JRE_HOME/bin:$PATH }

    И потом после перезагрузки шелла вызвать эту функцию: graalvm .


    Почему я предлагаю сделать отдельную баш-функцию и вызывать ее по мере необходимости, а не сразу? Тут всё очень просто: после того, как GraalVM попадет в PATH, ваш нормальный системный npm (например, /usr/local/bin/npm в macOS) будет подменён нашей особой джавовой версией ($JDK_HOME/bin/npm). Если вы JS-разработчик, такая подмена на постоянку - не самая лучшая идея.

    2. Делаем директорию для проекта mkdir -p ~/git/habrotest cd ~/git/habrotest 3. npm init (заполнить с умом, но можно и просто прощелкать кнопку enter)4. Устанавливаем нужные модули: Webpack, Babel, React npm i --save-dev webpack webpack-cli webpack-dev-server npm i --save-dev babel-core babel-loader babel-preset-es2015 babel-preset-react npm i --save react react-dom

    Заметьте, что npm может оказаться слегка устаревшей версии (относительно «настоящего») и попросит обновиться. Обновляться не стоит.

    5. Создаем директории, в которых будет происходить работа: mkdir -p src/client/app mkdir -p src/client/public mkdir -p loaders 6. Учим Babel нашим языкам:
    { "presets" : ["es2015", "react"] } 7. Настраиваем вебпак:

    ./webpack.config.js:


    var p = require("path"); var webpack = require("webpack"); var BUILD_DIR = p.resolve(__dirname, "src/client/public"); var APP_DIR = p.resolve(__dirname, "src/client/app"); var config = { output: { path: BUILD_DIR, filename: "bundle.js" }, entry: APP_DIR + "/index.jsx", module: { rules: [ { test: /\.jsx?/, include: APP_DIR, loader: "babel-loader" } ] } }; module.exports = config; 8. Создаем страничку для нашего приложения:

    ./src/client/index.html


    Добро пожаловать в рубку НЛО 9. Создаем индекс (чтобы потом пихать в него демонстрационный компонент):

    ./src/client/app/index.jsx


    import React from "react"; import {render} from "react-dom"; import NLOComponent from "./NLOComponent.jsx"; class App extends React.Component { render () { return (

    Добро пожаловать в рубку, НЛО

    ); } } render(, document.getElementById("app")); 10. Создаем компонент!

    ./src/client/app/NLOComponent.jsx


    import React from "react"; class NLOComponent extends React.Component { constructor(props) { super(props); this.state = {banned: 0}; this.onBan = this.onBan.bind(this); } onBan () { let newBanned = this.state.banned + 10; this.setState({banned: newBanned}); } render() { return ( Забанить кого-нибудь! 11. Запускаем сборку: webpack -d

    Всё должно успешно собраться и вывести нечто вроде:


    joker:habrotest olegchir$ webpack -d Hash: b19d6529d6e3f70baba6 Version: webpack 4.5.0 Time: 19358ms Built at: 2018-04-16 05:12:49 Asset Size Chunks Chunk Names bundle.js 1.69 MiB main main Entrypoint main = bundle.js [./src/client/app/NLOComponent.jsx] 3.03 KiB {main} [./src/client/app/index.jsx] 2.61 KiB {main} + 21 hidden modules 12. Теперь можно открыть в браузере./src/client/index.html и насладиться следующим видом:

    Первая часть туториала пройдена, теперь нужно научиться менять надпись на кнопке.

    Часть 2. Подсовываем переменные13. Попробуем внедрить в наш компонент переменную «название кнопки» (buttonCaption) и «список вариантов» (buttonVariants), о которых ничего не известно в JS. В дальнейшем они будут подтягиваться из Java, но сейчас просто проверяем, что их использование приводит к ошибке: import React from "react"; class NLOComponent extends React.Component { constructor(props) { super(props); this.state = {banned: 0, button: buttonCaption}; this.onBan = this.onBan.bind(this); } onBan () { let newBanned = this.state.banned + 10; this.setState({banned: newBanned, button: buttonVariants}); } render() { return ( Количество забаненных: {this.state.banned} {this.state.button} ); } } export default NLOComponent;

    Наблюдаем честную ошибку:


    NLOComponent.jsx?8e83:7 Uncaught ReferenceError: buttonCaption is not defined at new NLOComponent (NLOComponent.jsx?8e83:7) at constructClassInstance (react-dom.development.js?61bb:6789) at updateClassComponent (react-dom.development.js?61bb:8324) at beginWork (react-dom.development.js?61bb:8966) at performUnitOfWork (react-dom.development.js?61bb:11798) at workLoop (react-dom.development.js?61bb:11827) at HTMLUnknownElement.callCallback (react-dom.development.js?61bb:104) at Object.invokeGuardedCallbackDev (react-dom.development.js?61bb:142) at invokeGuardedCallback (react-dom.development.js?61bb:191) at replayUnitOfWork (react-dom.development.js?61bb:11302) (anonymous) @ bundle.js:72 react-dom.development.js?61bb:9627 The above error occurred in the component: in NLOComponent (created by App) in div (created by App) in App 14. Теперь давайте познакомимся с легальным способом подсовывать переменные в Вебпаке. Это лоадеры.

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


    var p = require("path"); var webpack = require("webpack"); var BUILD_DIR = p.resolve(__dirname, "src/client/public"); var APP_DIR = p.resolve(__dirname, "src/client/app"); let defaults = { output: { path: BUILD_DIR, filename: "bundle.js" }, entry: APP_DIR + "/index.jsx", module: { rules: [ { test: /\.jsx?/, include: APP_DIR, loader: "babel-loader" } ] }, resolveLoader: { modules: ["node_modules", p.resolve(__dirname, "loaders")] } }; module.exports = function (content) { let dd = defaults; dd.module.rules.push({ test: /index\.jsx/, loader: "preload", options: {} }); return dd; };

    (Заметьте, что в options лоадеру можно подсунуть любые данные и потом считать с помощью loaderUtils.getOptions(this) из модуля loader-utils)


    Ну и теперь, собственно, пишем лоадер. Лоадер устроен тупо: на вход в параметр source нам приходит изначальный код, мы его изменяем по своему желанию (можем и не изменять) и потом возвращаем назад.


    ./loaders/preload.js:


    const loaderUtils = require("loader-utils"), schemaUtils = require("schema-utils"); module.exports = function main(source) { this.cacheable(); console.log("applying loader"); var initial = "Забанить тролля!"; var variants = JSON.stringify(["Забанить тролля!", "Забанить спамера!"]); return `window.buttonCaption=\"${initial}\";` + `window.buttonVariants=${variants};` + `${source}`; };

    Выполняем пересборку с помощью webpack -d .


    Всё отлично работает, нет никаких ошибок.

    Часть 3. Добавляем Java-код15. Теперь вы спросите: хорошо, мы выучили один маленький грязный хак Вебпака, но при чем здесь Java?

    Интересно здесь то, что наш лоадер выполняется не просто так, а под Граалем. Значит, можно с помощью API, похожего на Nashorn"овский, работать из JS с джавовыми типами.


    const loaderUtils = require("loader-utils"), schemaUtils = require("schema-utils"); module.exports = function main(source) { this.cacheable(); console.log("applying loader"); //Мы можем получать джавовые типы и содзавать объекты этого типа var JavaString = Java.type("java.lang.String"); var initial = new JavaString("Забанить тролля!"); //Мы можем конвертить данные туда, сюда, и обратно var jsVariants = ["Забанить тролля!", "Забанить спамера!"]; var javaVariants = Java.to(jsVariants, "java.lang.String"); var variants = JSON.stringify(javaVariants); //Но интероп не всегда хорош, и тогда приходится городить костыли return `window.buttonCaption=\"${initial}\";` + `window.buttonVariants=${variants};` + `${source}`; };

    Ну и конечно, webpack -d .

    16. При попытке собрать вебпаком видим ошибку: ERROR in ./src/client/app/index.jsx Module build failed: ReferenceError: Java is not defined at Object.main (/Users/olegchir/git/habrotest/loaders/preload.js:9:19)

    Она возникает потому, что джавовые типы недоступны по умолчанию и включаются специальным флагом --jvm , который имеется только в GraalJS, но не в «обычной» Ноде.


    Поэтому собирать надо специальной командой:


    node --jvm node_modules/.bin/webpack -d


    Так как набирать всё это достаточно муторно, я использую алиас в баше. Например, в.bash_profile можно вставить следующую строчку:


    alias graal_webpack_build="node --jvm node_modules/.bin/webpack -d"

    Или как-нибудь еще короче, чтобы набирать было приятно.

    17. PROFIT!

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


    Заключение

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


    Напоследок, каплю дегтя в бочку меда. В чем же подвох?

    • GraalJS - пока не Open Source, хотя, по слухам, опенсорснуть его хотят; Уже всё в порядке .
    • Джавовый npm пока что подтормаживает. Почему - надо изучать. Тормозит именно npm, а не сам JS-движок;
    • Под капотом у всего этого находится лютая магия, и при попытке туда влезть придется изучать много всего дополнительно;
    • Всё это собрано относительно JDK8. Новых фишек из Java 11 придется дожидаться достаточно долго;
    • Graal - экспериментальный проект. Нужно учитывать это при попытке интегрировать его в совсем уж кровавый энтерпрайз без права на ошибку.

    Теги: Добавить метки



    Есть вопросы?

    Сообщить об опечатке

    Текст, который будет отправлен нашим редакторам: