Пообещал написать статью про использование 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 - экспериментальный проект. Нужно учитывать это при попытке интегрировать его в совсем уж кровавый энтерпрайз без права на ошибку.

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

Все. Это несвязанные языки.

2018-12-04T00:00Z

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

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

Хотя у них одинаковые имена, они действительно два совершенно разных языка программирования / модели / платформы и используются для решения совершенно разных задач.

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

2018-12-11T00:00Z

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

Эти два языка полностью различны.

2018-12-18T00:00Z

Вот некоторые различия между двумя языками:

  • Java - это статически типизированный язык; JavaScript динамичен.
  • Java является основанной на классе; JavaScript основан на прототипе.
  • Конструкторы Java - это специальные функции, которые могут быть вызваны только при создании объекта; JavaScript «конструкторы» - это просто стандартные функции.
  • Java требует, чтобы все неблокированные операторы заканчивались точкой с запятой; JavaScript вставляет точки с запятой на концах определенных строк.
  • Java использует блочное масштабирование; JavaScript использует функциональное определение области.
  • Java имеет неявную this область для нестатических методов и неявную область классов; JavaScript имеет скрытую глобальную область.

Вот некоторые особенности, которые я считаю особыми сильными сторонами JavaScript:

  • JavaScript поддерживает закрытие; Java может имитировать сортировку «закрытий» с использованием анонимных классов. (Реальные закрытия могут поддерживаться в будущей версии Java.)
  • Все функции JavaScript являются переменными; Функции Java являются только переменными, если они явно отмечены.
  • Прототипы JavaScript могут быть переопределены во время выполнения и имеют немедленный эффект для всех ссылочных объектов. Java-классы не могут быть переопределены таким образом, который затрагивает любые существующие экземпляры объектов.
  • JavaScript позволяет переопределять методы в объекте независимо от его прототипа (подумайте о себе в Ruby, но о стероидах); методы в объекте Java привязаны к его классу и не могут быть переопределены во время выполнения.

2018-12-25T00:00Z

Java и Javascript похожи, так как Car и Carpet похожи.

2019-01-01T00:00Z

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

На большинстве (но не «практически всех») ПК установлена ​​Java VM.

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

javaScript или JS — это объектно-ориентированный интерпретируемый язык программирования, с помощью которого создаются приложения, как функционирующие отдельно, так и встраиваемые в HTML-код. В последнем случае Джава Скрипт используется для создания на странице интерактивных элементов — формы авторизации, опросы, анкеты и т.п. так же, JavaScript используется в веб-браузерах в качестве дополнительного расширения в целях организации интерактивного управления браузером, запуска сценариев, внедрённых в код страниц и работы с документами в пределах окна браузера. и взаимодействия его с пользователем, управлять веб-броузером и изменять содержимое документа, отображаемое в пределах окна веб-броузера. Эта встроенная версия JavaScript запускает сценарии, внедренные в HTML код веб-страниц. Эту версию принято называть клиентским языком JavaScript.

JavaScript — совсем не простой язык

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

В чём разница между Java и JavaScript

Не стоит путать Java Скрипт с ещё одним языком программирования — Java. Это совершенно разные вещи! Java — это объектно-ориентированный язык программирования, разработанный компанией Sun Microsystems ещё в 1995 году и в последствии приобретённый компанией Oracle. Для работы приложений, написанных на Джаве, нужна специальная виртуальная машина.
А вот Джава Скрипт — можно с натяжкой назвать значительно более упрощённой версией Java. Упрощённой до такой степени, что схож только синтаксис, и то — только в некоторых моментах. По своей сути это иной, особенный язык, который существует сам по себе.В его основе лежат международные стандарты, благодаря чему обеспечивается прекрасная совместимость
между реализациями, хотя, как таковая совместимость реализаций JavaScript в разных броузерах обычно приносит немало проблем разработчикам, использующим клиентский язык JavaScript.

Что изучать Java или Javascript?!

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

Если верить статистике Github, то на данный момент, Java и JavaScript - это самые одни из самых популярных языков программирования, после Python, PHP и Ruby. Несмотря на схожесть в их названиях, это очень разные языки. Вы можете подумать, что JavaScript это более простая, облегченная версия Java. Но вы ошибаетесь. Это два совершенно разных полноценных языка программирования, которые позволяют делать различные вещи, но в то же время в них больше отличий чем схожих черт.

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

Первая версия Java с кодовым именем "Oak" и "Green" после первоначальной разработки появилась на свет в мае 1995 года. Множество программистов в то время расценивали этот язык как замену C/C++, поскольку здесь был похожий синтаксис, а также реализованы новые концепции. Язык делал программирование более простым и безопасным.

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

Это становится возможным из-за Java машины (JVM). Java машина, это обычная программа, которая выступает в роли посредника между операционной системой и Jar файлом. Она читает файл программы, который содержит инструкции на Java и превращает их в инструкции платформы, на которой выполняется прямо во время выполнения. Такой процесс называется Just-in-time компиляция или JIT.

Что такое JavaScript?

JavaScript появился как простой язык для создания ограничителей HTML форм. Когда в компании Netscape Communications решили, что им нужен более динамичный интернет, был создан новый язык, который мог использоваться прямо внутри HTML. Этот язык назывался LiveScript и был разработан за десять дней.

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

В отличие от Java, которая компилируется, JavaScript - полностью интерпретируемый язык. Когда вы посещаете сайт, использующий JavaScript, ваш браузер получает полный исходный код программы. Далее она выполняется на лету с помощью JavaScript движка. Различные браузеры используеют разные движки: V8 (Chrome), SpiderMonkey (Firefox), Chakra (Edge) и так далее.

Схожие стороны Java или JavaScript

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

  • Объективно ориентированное программирование (ООП) - оба языка требуют от программиста использования во время кодирования принципов объектов и связей между ними. Оба языка поддерживают такие паттерны ООП, как интерфейсы, инкапсуляция и полиморфизм.
  • Разработка фортэнда - оба языка могут использоваться для разработки фортэнда, другими словами - интерфейса пользователя, который работает вместе с сервером. JavaScript можно встраивать в HTML, или в качестве сторонней библиотеки на страницы сайта. А Java может работать в браузере в качестве java апплета.
  • Разработка бэкэнда - другими словами - разработка серверного программного обеспечения. Java уже давно используется в бэкэнд технологиях проектами Apache, JBoss, WebSphere. Новая технология, Node.js позволяет запускать серверы, написанные на JavaScript.
Основные отличия Java vs JavaScript

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

  • Компилируемость и интерпретация - как я уже писал выше, Java - это компилируемый язык программирования, а JavaScript - интерпретируемый. Отличие только в реализации, на деле оба языка могут выполняться на различных платформах.
  • Статическая и динамическая проверка типа - Java использует статическую проверку типов. Тип переменной проверяется во время компиляции. Программист должен явно задать какого типа будет переменная - строка, число, число с плавающей точкой и так далее). JavaScript, как и другие скриптовые языки использует динамическую типизацию. Правильность использования типов проверяется во время выполнения. Программисту не нужно задавать тип переменной при объявлении. Оба подхода имеют множество преимуществ и недостатков. Самое главное отличие java от javascript - при статической типизации большинство ошибок выплывают на этапе разработки, потому что компилятор знает чего ждать, код выполняется быстрее и потребляет меньше памяти. Преимущество динамической типизации - программы пишутся быстрее и проще.
  • Параллельность - реализация возможности выполнять несколько последовательностей инструкций в одно и то же время очень сильно отличается в Java и JavaScript. Java позволяет использовать несколько потоков для запуска параллельных задач. Реализация параллельности в JavaScript очень сложна. Она есть только в Node.js. В основном потоке она реализуется через очередь выполнения, которая называется цикл обработки событий. Оба метода работают хорошо, но потоки Java быстрее.
  • Классы и объекты - Java использует классы и отношения между ними. Свойства объекта определены в классе и являются неизменной частью класса. Наследовать классы можно от других классов и тогда они получают все свойства родителей. Вы удивитесь, но в JavaScript нет классов. Там есть только объекты. И наследование реализовано по-другому. Все объекты можно наследовать от других объектов напрямую. Для этого достаточно указать нужный объект в качестве прототипа.
Когда лучше использовать?

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

Лучше выбрать Java если вы разрабатываете:

  • Android приложение;
  • Коммерческое программное обеспечение;
  • ПО для научных вычислений;
  • ПО для анализа Big Data;
  • ПО общего назначения или инструменты безопасности;
  • Серверные программы.

Лучше использовать javaScript в таких сферах:

  • Динамические одностраничные приложения (SPA);
  • Форт-энд приложения (Query, AngularJS, Backbone.js, Ember.js, ReactJS);
  • Серверные приложения (Node.js, MongoDB, Express.js и так далее);
  • Мобильные приложения (PhoneGap, Ract Native и т д).
Выводы

В этой статье мы рассмотрели чем отличается java от javascript. Как видите, отличий просто масса, несмотря на то, что языки имеют похожее название. На вопрос что лучше java или javascript сложно ответить, потому что языки имеют очень разные сферы применения. Надеюсь, эта информация была полезной для вас.

На завершение видео-шутка про противостояние Java и JavaScript на основе игры престолов:

Что такое Java Чем является JavaScript Почему JavaScript назвали именно так? Как создавалась Java Чем отличается Java от JavaScript

Начнём с того, чем является Java и Javascript.

Чем является Java?

Java - язык для создания программ, платформа вычисления. Т.е. программа, которая обрабатывает байтов коды и передает инструкцию интерпретации оборудованию. Создана была в 1995 году Sun Microsystems. Приложение Java представляет собой специальный байт-код, выполняющийся на любом компьютере, при помощи виртуальной Java-машины.

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

Что такое Javascript?

Теперь рассмотрим, чем является Javascript. Javascript - мультипарадигменный язык создания сайтов. В него входят такие стили, как императивный, функциональный, объектно-ориентир. То есть он нужен для создания "живых" web-сайтов. В отличии от Java, Javascript придумали в Netscape, Inc. Это означает, что он никак не относится к платформе Java.

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

Зачем Javascript назвали именно так?

Ранее мы выяснили, что Javascript создали совершенно другие люди. Так почему же он имеет все-таки похожее название?

Это связано с тем, что тогда был очень известен язык программирования Java, вот они и решили схитрить и называли его JavaScript. Изначально они назвали его, как LiveScript. Эти люди планировали, что он будет "маленьким братиком" Java. Но сейчас все совсем по-другому, Javascript высоко возрос, и сейчас не зависит и не имеет ничего общего с Java.

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

Как создавалась Java?

С начала планировали назвать Oak. Джеймс Гослинг создавал Java, как программу для программирования обыденных электронных устройств. Позже переименования Oak в Java, её решили использовать для написания клиентских приложений и серверного программного обеспечения. Его решили назвать в честь кофе "Java". Именно поэтому на эмблеме языка изображена чашка с горячим кофе.

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

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

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

Для них надо подключать разные друг от друга модули.

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