Java — объектно-ориентированный язык программирования, разрабатываемый компанией Sun Microsystems и официально выпущенный 23 мая 1995 года. В отношении произношения в русском языке, как и в ряде других, образовались две различные нормы — заимствованная англоязычная /ˈdʒɑːvə/ [1] и традиционно-национальная «Ява», соответствующая традиционому произношению названия острова Ява.
Java — так называют не только сам язык, но и платформу для создания приложений уровня предприятий на основе данного языка.
Изначально язык программирования назывался Oak (русск. Дуб ) и разрабатывался Джеймсом Гослингом для бытовой электроники, но впоследствии был переименован в Java и стал использоваться для написания клиентских приложений и серверного программного обеспечения. Назван в честь марки кофе Java, любимого программистами, поэтому на официальной эмблеме языка Java изображена чашка с дымящимся кофе.
Содержание
Основные особенности языка
Программы на Java транслируются в байт-код, выполняемый виртуальной java-машиной (JVM) — программой, обрабатывающей байтовый код и передающей инструкции оборудованию как интерпретатор, но с тем отличием, что байтовый код, в отличие от текста, обрабатывается значительно быстрее.
Достоинство подобного способа выполнения программ — в полной независимости байт-кода от ОС и оборудования, что позволяет выполнять Java-приложения на любом устройстве, которое поддерживает виртуальную машину. Другой важной особенностью технологии Java является гибкая система безопасности благодаря тому, что исполнение программы полностью контролируется виртуальной машиной. Любые операции, которые превышают установленные полномочия программы (например, попытка несанкционированного доступа к данным или соединения с другим компьютером) вызывают немедленное прерывание. Это позволяет пользователям загружать программы, написанные на Java, на их компьютеры (или другие устройства, например, мобильные телефоны) из неизвестных источников, при этом не опасаясь заражения вирусами, пропажи ценной информации, и т. п.
Часто к недостаткам концепции виртуальной машины относят то, что исполнение байт-кода виртуальной машиной может снижать производительность программ и алгоритмов, реализованных на языке Java. Данное утверждение было справедливо для первых версий виртуальной машины Java, однако в последнее время оно практически потеряло актуальность. Этому способствовал ряд усовершенствований: применение технологии native-кода в стандартных библиотеках, а также аппаратные средства, обеспечивающие ускоренную обработку байт-кода (например, технология ARM).
История версий
Java 1.0
Разработка Java началась в 1990 году, первая официальная версия — Java 1.0, — была выпущена только в 1995 году.
Java 2.0
К 1998 году была разработана обновлённая спецификация JDK 1.2, вышедшая под наименованием Java 2. Собственно языковых изменений в данной версии не появилось. Платформа получила следующие дополнения:
Java 5
Спецификация Java 5 была выпущена в сентябре 2004 года. В данной версии разработчики внесли в язык целый ряд принципиальных дополнений:
Классификация платформ Java
Внутри Java существуют три основных семейства технологий:
Самыми популярными считаются серверные технологии семейства J2EE.
Последним релизом является версия 1.6, в которой было произведено улучшение системы безопасности, улучшение поддержки скриптового языка Mozilla Rhino (англ.), улучшена интеграция с рабочим столом, добавлены некоторые новые возможности в создании графических интерфейсов.
Является ли Java компилируемым или интерпретируемым языком программирования?
В прошлом я использовал C ++ в качестве языка программирования. Я знаю, что код, написанный на C ++, проходит процесс компиляции, пока не станет объектным кодом «машинный код».
Я хотел бы знать, как Java работает в этом отношении. Как пользовательский Java-код запускается компьютером?
Реализации Java обычно используют двухэтапный процесс компиляции. Исходный код Java компилируется в байт-код компилятором Java. Байт-код выполняется виртуальной машиной Java (JVM). Современные JVM используют метод компиляции Just-in-Time (JIT) для компиляции байт-кода с нативными инструкциями, понятными аппаратному ЦП на лету во время выполнения.
Некоторые реализации JVM могут интерпретировать байт-код вместо JIT, компилируя его в машинный код и выполняя его напрямую. Хотя это все еще считается «интерпретатором», он довольно сильно отличается от интерпретаторов, которые читают и выполняют исходный код высокого уровня (то есть в этом случае исходный код Java не интерпретируется напрямую, это байт-код, вывод компилятора Java).
Технически возможно заблаговременно скомпилировать Java в нативный код и запустить полученный бинарный файл. Также возможно интерпретировать код Java напрямую.
Подводя итог, в зависимости от среды выполнения, байт-код может быть:
Код, написанный на Java:
Когда Java интерпретирует байт-код и когда он его компилирует? Код приложения первоначально интерпретируется, но JVM отслеживает, какие последовательности байт-кода часто выполняются, и транслирует их в машинный код для непосредственного выполнения на оборудовании. Для байт-кода, который выполняется только несколько раз, это экономит время компиляции и уменьшает начальную задержку; для часто выполняемого байт-кода JIT-компиляция используется для запуска на высокой скорости после начальной фазы медленной интерпретации. Кроме того, поскольку программа тратит большую часть времени на выполнение меньшего количества кода, сокращение времени компиляции является значительным. Наконец, во время первоначальной интерпретации кода, статистика выполнения может быть собрана до компиляции, что помогает выполнять лучшую оптимизацию.
Термины «интерпретируемый язык» или «скомпилированный язык» не имеют смысла, потому что любой язык программирования может интерпретироваться и / или компилироваться.
В настоящее время частичная компиляция точно в срок используется для многих языков, которые когда-то считались «интерпретированными», например JavaScript.
Java компилируется в байт-код, который затем переходит в Java VM, которая его интерпретирует.
Вид обоих. Сначала компилируется Java (некоторые предпочитают говорить «переведенный») в байт-код, который затем либо компилируется, либо интерпретируется в зависимости от настроения JIT.
Java выполняет как компиляцию, так и интерпретацию,
Когда программа должна быть запущена, байт-код преобразуется, байт-код может быть преобразован с использованием компилятора JIT. В результате получается машинный код, который затем подается в память и выполняется.
В современных реализациях на языке программирования, таких как в Java, для платформы все более популярно предоставлять обе опции.
Является ли Java компилирован или интерпретирован языком?
1. Обзор
Языки программирования классифицируются на основе их уровней абстракции. Мы дифференцируют языки высокого уровня (Java, Python, JavaScript, C, Go), низкоуровневые (ассембер) и, наконец, машинный код.
Каждый языковой код высокого уровня, такой как Java, должен быть переведен на родной код машины для выполнения. Этот процесс перевода может быть как компиляцией, так и интерпретацией. Однако есть и третий вариант. Комбинация, которая стремится воспользоваться обоими подходами.
В этом учебнике мы изумим, как код Java компилируются и выполняются на нескольких платформах. Мы посмотрим на некоторые Java и JVM дизайн специфики. Это поможет нам определить, компилирована ли Java, интерпретирована или гибрид обоих.
2. Составлено против Интерпретировано
Начнем с некоторых основных различий между составленными и интерпретируемыми языками программирования.
2.1. Собранные языки
Собранные языки (C q, Go) преобразуются непосредственно в родной код машины по программе компилятора.
Они требуют явного шага сборки перед выполнением. Вот почему мы должны восстанавливать программу каждый раз, когда мы делаем изменения кода.
Собранные языки, как правило, быстрее и эффективнее чем интерпретируемые языки . Тем не менее, их генерируемый машинный код специфичен для платформы.
2.2. Интерпретированы языки
С другой стороны, в интерпретируемых языках (Python, JavaScript) нет шагов сборки. Вместо этого, переводчики работают на исходный код программы при его выполнении.
Интерпретируемые языки когда-то считались значительно медленнее, чем составленные языки. Однако с разработкой точно в срок (JIT) компиляции разрыв в производительности сокращается. Однако следует отметить, что компиляторы JIT превращают код из интерпретируемого языка в родной код машины по мере времени времени, которую выполняет программа.
Кроме того, мы можем выполнять интерпретируемый языковой код на нескольких платформах как Windows, Linux или Mac. Интерпретируемый код не имеет сходства с определенным типом архитектуры процессора.
3. Напишите один раз запустить в любом месте
Java и JVM были разработаны с портативностью в виду. Поэтому большинство популярных платформ сегодня могут запускать Java-код.
Это может звучать как намек на то, что Java является чисто интерпретируемый язык. Однако перед казнью Исходный код Java должен быть составлен вкод. Bytecode – это специальный машинный язык, родом из JVM. JVM интерпретирует и выполняет этот код во время выполнения.
Это JVM, который построен и настроен для каждой платформы, которая поддерживает Java, а не наши программы или библиотеки.
Современные JVMs также имеют компилятор JIT. Это означает, что JVM оптимизирует наш код во время для получения аналогичных преимуществ производительности для составленного языка.
4. Компилятор Java
Явакинструмент командной строки компилирует исходный код Java в файлы класса Java содержащий нейтральный для платформы интегрид:
5. Java Виртуальная машина
Собранные классные файлы (bytecode) могут быть выполнены виртуальной машиной Java (JVM):
$ Java HelloWorld Здравствуйте, Ява!
Давайте более глубоко рассмотрим архитектуру JVM. Наша цель состоит в том, чтобы определить, как bytecode преобразуется в родной код машины во время выполнения.
5.1. Обзор архитектуры
СПМ состоит из пяти подсистем:
5.2. Класс Загрузчик
СПМ использует эту Класс Загрузчик подсистемы для привести собранные файлы класса в Память JVM.
Помимо загрузки, ClassLoader также выполняет увязку и инициализацию. Это включает в себя:
5.3. Двигатель исполнения
Подсистема двигателя выполнения отвечает за чтение ютекода, преобразование его в родной код машины и его выполнение.
За выполнение отвечают три основных компонента, включая как переводчика, так и компилятора:
Движок выполнения использует интерфейс метода Native (JNI) для вызова родных библиотек и приложений.
5.4. Как раз вовремя Компилятор
Основным недостатком переводчика является то, что каждый раз, когда метод называется, он требует интерпретации, которая может быть медленнее, чем составленный родной код. Java использует компилятор JIT для преодоления этой проблемы.
Компилятор JIT не полностью заменяет переводчика. Двигатель выполнения по-прежнему использует его. Тем не менее, JVM использует компилятор JIT на основе того, как часто метод называется.
Профайлер является специальным компонентом компилятора JIT, ответственного за поиск горячих точек. JVM решает, какой код для компиляции JIT основан на информации профилирования, собранной во время выполнения.
Одним из результатов этого является то, что Java-программа может стать быстрее при выполнении своей работы после нескольких циклов выполнения. После того, как JVM изучил точки доступа, он может создать родной код, позволяющий вещи работать быстрее.
6. Сравнение производительности
Давайте рассмотрим, как компиляция JIT улучшает производительность выполнения Java.
6.1. Тест производительности Фибоначчи
Мы будем использовать простой рекурсивный метод для расчета числа n-th Fibonacci:
Для того, чтобы измерить преимущества производительности для повторных вызовов метода, мы забудем метод Фибоначчи 100 раз:
Во-первых, мы будем собирать и выполнять Java-код обычно:
Затем мы выполним тот же код с отключенным компилятором JIT:
Наконец, мы будем реализовывать и запускать тот же алгоритм в C и JavaScript для сравнения.
6.2. Результаты тестирования производительности
Давайте посмотрим на измеренные средние показатели в наносекундах после запуска рекурсивного теста Фибоначчи:
7. Что следует учитывать
Технически, можно компилировать любой статический код языка программирования для машинного кода напрямую. Кроме того, можно интерпретировать любой код программирования шаг за шагом.
В этой статье мы сосредоточились на объяснении того, как все работает в HotSpot. HotSpot — это реализация Oracle с открытым исходным кодом с открытым исходным кодом. Graal VM также основан на HotSpot, поэтому применяются те же принципы.
Самые популярные реализации JVM в настоящее время используют сочетание переводчика и компилятора JIT. Тем не менее, вполне возможно, что некоторые из них используют другой подход.
8. Заключение
В этой статье мы рассмотрели Java и внутренние данные JVM. Наша цель состояла в том, чтобы определить, является ли Java компиляцией или интерпретируемой формулировкой. Мы исследовали компилятор Java и внутренние внутренние системы двигателя выполнения JVM.
Исходя из этого, мы пришли к выводу, что Java использует комбинацию обоих подходов.
Исходный код, который мы пишем на Java, сначала компилируется в bytecode во время процесса сборки. Затем JVM интерпретирует генерируемый код для выполнения. Тем не менее, JVM также использует компилятор JIT во время выполнения для улучшения производительности.
Работу компилируемых языков можно представить следующей схемой:
То есть жизненный цикл программы представляет собой следующие этапы: 1. Написание исходного текста программы (source code) 2. Компиляция в исполнимый файл (.exe например) 3. Выполнение программы на ПК
Такой подход обеспечивает высокое быстродействие. То есть программа готовится заранее, в тот момент когда она нужна, она просто запускается. Все пользователи привыкли именно к такому подходу
Примеры таких языков: assembler, C, C++, Pascal
2. Интерпретируемые языки
Соответственно, жизненный цикл программы сводится к: 1. Написание 2. Выполнение
Это специфические языки, например языки для создания веб-страниц. Примеры: PHP, JavaScript, Python
Принцип работы языков смешанного типа (компилируемо-интерпретируемые) проиллюстрируем такой схемой:
Java относится именно к компилируемо-интерпретируемым языкам программирования. Интерпретатор в Java называется «виртуальная машина», именно поэтому он так обозначен на рисунке.
Возникает вопрос, зачем такая сложность? Дело в том что такой подход объединяет преимущества компилируемых языков (скорость выполнения) и интерпретируемых (независимость от ОС и безопасность)
Примеры таких языков: Java, C#
Эти три подхода можно проиллюстрировать следующим образом:
1. Компилируемые языки это готовая еда. Хорошо иметь ее под рукой, но она быстро портится. Программы, написанные на компилируемых языках зависят от ОС и от аппаратного оборудования
2. Интерпретируемые языки это замороженные продукты. Они хорошо хранятся, но их долго готовить Программы, написанные для интерпретируемых языков очень мобильны, работают везде, где есть интерпретатор, безопасны, но. Процесс преобразования занимает время, что сказывается на производительности
3. Комбинированные языки можно сравнить с полуфабрикатом. Его быстро готовить, он долго хранится. Но как вы понимаете, вкус будет хуже, чем у свежеприготовленной пищи. Программы написанные на комбинированных языках программирования, ограничены функциональностью своего интерпретатора. То есть возможностей которые может использовать такая программа всегда будет меньше чем возможностей, которые может использовать программа написанная на компилируемом языке
К какой группе языков относится java компилируемый
Java — объектно-ориентированный язык программирования, разрабатываемый компанией Sun Microsystems с 1991 года и официально выпущенный 23 мая 1995 года. Изначально новый язык программирования назывался Oak (James Gosling) и разрабатывался для бытовой электроники, но впоследствии был переименован в Java и стал использоваться для написания апплетов, приложений и серверного программного обеспечения.
Программы на Java могут быть транслированы в байт-код, выполняемый на виртуальной java-машине (JVM) — программе, обрабатывающей байт-код и передающей инструкции оборудованию, как интерпретатор, но с тем отличием, что байт-код, в отличие от текста, обрабатывается значительно быстрее.
Язык Java зародился как часть проекта создания передового программного обеспечения для различных бытовых приборов. Реализация проекта была начата на языке C++, но вскоре возник ряд проблем, наилучшим средством борьбы с которыми было изменение самого инструмента — языка программирования. Стало очевидным, что необходим платформо-независимый язык программирования, позволяющий создавать программы, которые не приходилось бы компилировать отдельно для каждой архитектуры и можно было бы использовать на различных процессорах под различными операционными системами.
Язык Java потребовался для создания интерактивных продуктов для сети Internet. Фактически, большинство архитектурных решений, принятых при создании Java, было продиктовано желанием предоставить синтаксис, сходный с C и C++. В Java используются практически идентичные соглашения для объявления переменных, передачи параметров, операторов и для управления потоком выполнением кода. В Java добавлены все хорошие черты C++.
Три ключевых элемента объединились в технологии языка Java