1. Главная страница » Компьютеры

Java для чего используется

Автор: | 16.12.2019

Язык программирования Java был создан компанией Sun Microsystems в 1995 году. В последующие годы платформа стала основой миллионов систем на самых разных платформах, включая прикладные системы для рабочего стола Windows, Macintosh и Unix, встроенные программы и общесистемные приложения для бизнеса. Согласно статистике Oracle (которая приобрела Sun Microsystems в 2010 году) Java сейчас применяется более чем на 3 миллиардах устройств.

Виды Java приложений

Приложения для рабочего стола (десктопные) с графическим интерфейсом

Java обеспечивает разработку графического интерфейса, предлагая разные фреймворки, такие как Abstract Windowing Toolkit (AWT), Swing и JavaFX.

В целом создание графического представления на Java более трудоемко и не столь популярно, как на других платформах. C# набирает популярность на рынке, вытесняя тот же Swing. Но если Вам нужно кроссплатформенное решение, Java – не такой плохой выбор. Наиболее популярные десктопные приложения, написанные на Java – это вероятно сами среды для работки на Java, к примеру, Eclipse и Netbeans.

Мобильные приложения

Чаще всего сейчас Java используется на мобильных устройствах. Откройте любое приложение на своем Android-телефоне, оно на самом деле написано на языке программирования Java с использованием Android SDK. Несколько лет назад Android обеспечил Java столь необходимый импульс, и сегодня многие программисты Java – это разработчики именно Android-приложений.

Читайте также:  Excel сколько раз встречается значение в столбце

Встроенные системы

Встроенные системы, от крошечных чипов до специализированных компьютеров, являются компонентами более крупных электромеханических систем, выполняющих специальные задачи. На некоторых устройствах, таких как SIM-карты, проигрыватели дисков Blue-ray, счетчики коммунальных услуг и телевизоры, используются встроенные технологии Java. Согласно Oracle, 100% проигрывателей Blu-ray дисков и 125 миллионов телевизионных устройств используют Java.

Веб-приложения

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

Веб-серверы и серверы приложений

С использованием Java на сегодняшний момент разработано уже достаточно много веб-серверов и серверов приложений. К ним можно отнести известные Apache Tomcat, Oracle WebLogic, IBM WebSphere и Red Hat JBoss.

Корпоративные (общеорганизационные) системы

Java Enterprise Edition (Java EE) — это популярная платформа, которая предоставляет API и среду выполнения для создания сценариев и запуска общесистемных приложений, включая сетевые приложения и веб-сервисы. Oracle заявляет, что Java задействована на 97% корпоративных компьютеров. Высокая производительность и быстрые вычисления на Java привели к тому, что высоконагруженные торговые платформы, например, Murex, были разработаны на языке Java. Он также представляет собой основу для многочисленных банковских программ (Goldman Sachs, Citigroup, Barclays, Standard Charted), в которых Java работает от конечного пользователя до сервера.

Технологии больших данных

Hadoop и аналогичные Big Data — платформы также в той или иной степени задействуют Java, например, Apache на базе Java HBase и Accumulo (с открытым исходным кодом) и ElasticSearch. Java не господствует здесь, так как есть такие технологии, как MongoDB, разработанная на C++. Java может получить больший процент в этом растущем пространстве, если Hadoop или ElasticSearch станут популярными.

Научные приложения

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

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

Что такое технология Java и каково ее применение?

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

Можно ли загрузить Java бесплатно?

Да, Java можно загрузить бесплатно. Загрузите последнюю версию на веб-сайте java.com.

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

Почему необходимо выполнять обновление до новейшей версии Java?

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

Что я получаю, загрузив программное обеспечения Java?

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

Что собой представляет программное обеспечения подключаемого модуля Java?
Я слышал термины "виртуальная машина Java" и JVM. Это и есть программное обеспечение Java?

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

Рассказывает Роман Иванов

Каждому Java-разработчику будет очень полезно понимать, что из себя представляет JVM, как в неё попадает код и как он исполняется. Статья больше подойдёт новичкам, но найти в ней что-то новое смогут и более опытные программисты. В статье вкратце описано, как устроен class-файл и как виртуальная машина обрабатывает и исполняет байт-код.

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

Рассмотрим схему работы JVM более подробно.

Структура class-файла

Напишем простейшее приложение и скомпилируем его. Компилятор заботливо создаст файл с расширением class и поместит туда всю информацию о нашем мини-приложении для JVM. Что мы увидим внутри? Файл поделён на десять секций, последовательность которых строго задана и определяет всю структуру class-файла.

Файл начинается со стартового (магического) числа: 0xCAFEBABE. Данное число присутствует в каждом классе и является обязательным флагом для JVM: с его помощью система понимает, что перед ней class-файл.

Следующие четыре байта class-файла содержат старший и младший номера версий Java. Они идентифицируют версию формата конкретного class-файла и позволяют JVM проверять, возможна ли его поддержка и загрузка. Каждая JVM имеет ограничение версии, которую она может загрузить — более поздние версии будут игнорироваться. Как видно на примере файла выше, у нас major версия 0x34 , что соответствует Java SE 8. Для Java SE 11 будет значение 0x37 .

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

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

Тип константы Значение тега
CONSTANT_Class 7
CONSTANT_Fieldref 9
CONSTANT_Methodref 10
CONSTANT_InterfaceMethodref 11
CONSTANT_String 8
CONSTANT_Integer 3
CONSTANT_Float 4
CONSTANT_Long 5
CONSTANT_Double 6
CONSTANT_NameAndType 12
CONSTANT_Utf8 1
CONSTANT_MethodHandle 15
CONSTANT_MethodType 16
CONSTANT_InvokeDynamic 18

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

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

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

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

Имя флага Код Определение
ACC_PUBLIC 0x0001 Объявлен публичным
ACC_FINAL 0x0010 Объявлен финальным
ACC_SUPER 0x0020 Специальный флаг, введённый в версии Java 1.1 для совместимости при вызове методов родителя
ACC_INTERFACE 0x0200 Объявлен интерфейсом
ACC_ABSTRACT 0x0400 Объявлен абстрактным
ACC_SYNTHETIC 0x1000 Зарезервированное определение
ACC_ANNOTATION 0x2000 Объявлен аннотацией
ACC_ENUM 0x4000 Объявлен перечислением

Подобную структуру имеет и следующий блок — Fields.

Этот блок начинается с двухбайтового параметра количества полей в этом классе или интерфейсе. За ним идёт массив структур переменной длины. Каждая структура содержит информацию об одном поле: имя поля, тип, значение, если это, например, финальная переменная. В списке отображаются только те поля, которые были объявлены классом или интерфейсом, определённым в файле. Поля от родительских классов и имплементированных интерфейсов здесь не присутствуют, они задаются в своих class-файлах.

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

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

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

Мы рассмотрели структуру файлов и готовы перейти к следующей части — загрузке class-файла в JVM и последующему выполнению байт-кода из этого класса. В качестве закрепления полученных знаний по структуре class-файла можете воспользоваться встроенным декомпилятором Java и посмотреть результат его выполнения с ключами -c -verbose (javap -c -verbose TestJava.class) .

Загрузка классов

Теперь, разобравшись с общей структурой файла, посмотрим, как JVM его обрабатывает.

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

  1. Bootstrap — базовый загрузчик, загружает платформенные классы. Этот загрузчик является родителем всех остальных классов и частью платформы.
  2. Extension ClassLoader — загрузчик расширений, потомок Bootstrap-загрузчика. Загружает классы расширений, которые по умолчанию находятся в каталоге jre/lib/ext .
  3. AppClassLoader — системный загрузчик классов из classpath, который является непосредственным потомком Extension ClassLoader. Он загружает классы из каталогов и jar-файлов, указанных переменной среды CLASSPATH , системным свойством java.class.path или параметром командной строки -classpath .
  4. Собственный загрузчик — у приложения могут быть свои собственные загрузчики.

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

После загрузки класса начинается этап линковки, который делится на три части.

  1. Верификация байт-кода. Это статический анализ кода, выполняется один раз для класса. Система проверяет, нет ли ошибок в байт-коде. Например, проверяет корректность инструкций, переполнение стека и совместимость типов переменных.
  2. Выделение памяти под статические поля и их инициализация.
  3. Разрешение символьных ссылок — JVM подставляет ссылки на другие классы, методы и поля. В большинстве случаев это происходит лениво, то есть при первом обращении к классу.

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

JVM получает один поток байтовых кодов для каждого метода в классе. Байт-код метода выполняется, когда этот метод вызывается в ходе работы программы. Поток байт-кода метода — это последовательность инструкций для виртуальной машины Java. Каждая инструкция состоит из однобайтового кода операции, за которым может следовать несколько операндов. Код операции указывает действие, которое нужно предпринять. Всего на данный момент в Java более 200 операций. Все коды операций занимают только 1 байт, так как они были разработаны компактными, поэтому их максимальное число не может превысить 256 штук.

В основе работы JVM находится стек — основные инструкции работают с ним.

Рассмотрим пример умножения двух чисел. Ниже представлен байт-код метода:

На Java это будет выглядеть так:

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

Всего JVM поддерживает семь примитивных типов данных: byte, short, int, long, float, double и char.

Если бы мы хотели положить в переменную а другое значение, например 11112, то нам пришлось бы использовать инструкцию sipush :

Данные операции выполняются в так называемом фрейме стека метода. У каждого метода есть некоторая своя часть в общем стеке. Таким образом в нашем главном потоке исполнения программы создаются множество подстеков на каждый вызов метода. Более наглядно это представлено на картинке ниже:

В каждом стек-фрейме хранится массив локальных переменных, который позволяет сохранять и доставать локальные переменные, как мы сделали в примере выше, поместив значения 1 и 5 в переменные 1 и 2. Стоить отметить, что здесь компилятор также оптимизировал байт-код, используя однобайтовые инструкции. Если бы переменных в нашем методе было много, использовался бы код операции сохранения значения вместе с указанием позиции переменной в массиве.

Чтобы достучаться до пула констант класса и получить нужное значение, используются инструкции lcd и lcd_w . При этом lcd может ссылаться только на константы с индексами от 1 до 255, поскольку размер её операнда составляет всего 1 байт. Lcd_w имеет 2-байтовый индекс, поэтому может ссылаться на более широкий диапазон индексов.

Вызовы методов

Java предоставляет два основных вида методов: методы экземпляра и методы класса. Методы экземпляра используют динамическое (позднее) связывание, тогда как методы класса используют статическое (раннее) связывание.

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

Возвращаемое методом значение кладётся на стек. Типы возвращаемых значений методов указаны ниже:

Операция Описание
ireturn Помещает на стек значение типа int
lreturn Помещает на стек значение long,
freturn Помещает на стек значение float
dreturn Помещает на стек значение double
areturn Помещает на стек значение object
return Не изменяет стек

Циклы

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

Каждый раз на стеке оказывается два числа, которые сравниваются, и если i > 9999 , происходит выход из цикла. При этом для создания цикла используется конструкция на основе goto , которая запрещена в самом языке Java, хотя ключевое слово и зарезервировано.

Заключение

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

Таким образом, мы поверхностно рассмотрели жизненный цикл байткода в JVM: class-файлы, их загрузку и выполнение байт-кода и базовые инструкции.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *