Принцип работы программ java

IV семестр (ответы на вопросы к экзамену по java freebrain.Ru)

1. Виртуальная машина Java. Структура программ. Типы переменных в Java. Принципы работы ClassLoader.

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

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

Java Virtual Machine (сокращенно Java VM, JVM) — виртуальная машина Java — основная часть исполняющей системы Java, т.н. Java Runtime Environment (JRE). Виртуальная машина Java интерпретирует и исполняет байт-код Java, предварительно созданный из исходного текста Java-программы компилятором Java (javac). JVM является ключевым компонентом платформы Java. Так как виртуальные машины Java доступны для многих аппаратных и программных платформ, Java может рассматриваться и как связующее программное обеспечение, и как самостоятельная платформа. Использование одного байт-кода для многих платформ позволяет запускать приложения, написанные на java, на разных платформах.

Программы, предназначенные для запуска на JVM должны быть скомпилированы в стандартизированном переносимом двоичном формате, который обычно представляется в виде файлов с расширением .class. Программа может состоять из множества классов, размещенных в различных файлах. Для облегчения размещения больших программ, часть файлов вида .class могут быть упакованы вместе в .jar файл (сокр. от Java Archive).

Читайте также:  Короткая цитата

Виртуальная машина JVM исполняет файлы .class или .jar, эмулируя инструкции, написанные для JVM, путем интерпретирования или использования just-in-time компилятора (JIT). JIT компиляция используется в большинстве JVM в целях достижения большей скорости. Существуют также ahead-of-time компиляторы, позволяющие разработчикам приложений перекомпилировать файлы классов в родной для конкретной платформы код. Как и большинство виртуальных машин, Java Virtual Machine имеет stack-ориентированную архитектуру, свойственную микроконтроллерам и микропроцессорам. JVM, которая является экземпляром JRE, вступает в действие при исполнении программ Java. После завершения исполнения, этот экземпляр удаляется сборщиком мусора. JIT является частью виртуальной машины Java, которая используется для ускорения времени выполнения приложений. JIT одновременно компилирует части байт-кода, которые имеют аналогичную функциональность, и, следовательно, уменьшает количество времени, необходимого для компиляции.

Java-программа состоит из одного или нескольких определений классов, размещенных в одном или нескольких файлах с расширением .java. Для компиляции программ используется java-компилятор javac, в результате для каждого класса из исходного файла создается файл класса, содержащий байт-коды класса. Основа имени файла класса совпадает с именем класса, к ней добавляется суффикс .class. Один из классов программы должен быть открытым (public) классом и содержать метод main, с которого начинается выполнение программы.

Символы, строки и идентификаторы (т.е. имена классов, переменных, методов) в Java формируются 16-битовыми символами Unicode. Это обеспечивает, например, возможность давать классам и и их членам русские имена.

Java является строго типизированным языком, т.е. тип каждой переменной должен быть объявлен. Существует восемь основных (примитивных) типов данных: четыре целочисленных (int, long, short, byte), два – для действительных чисел с плавающей точкой (float, double), один – символы в формате Unicode (тип char – целый беззнаковый) и один логический (boolean). Модификатора unsigned в Java нет. Диапазоны целочисленных типов не зависят от машины, на которой выполняется программа. К не простым типам данных в Java относятся объекты и массивы. Эти типы часто называют ссылочными, поскольку доступ к ним осуществляется по ссылке (т.е. по адресу области памяти, занимаемой объектом или массивом), в то время как простые типы данных обрабатываются по значению.

Читайте также:  Php пример удаляет файлы

Ккласс ClassLoader обеспечивает загрузку классов Java (точнее, обеспечивают его наследники, конкретные загрузчики классов – сам ClassLoader является абстрактным классом). Каждый раз, когда загружается какой-либо .class-файл, например, вследствие обращения к конструктору или статическому методу соответствующего класса – на самом деле это действие выполняет один из наследников класса ClassLoader. Существует стандартный вариант реализации ClassLoader – так называемый системный загрузчик классов. Этот загрузчик используется по умолчанию при запуске приложений Java командой: java Имя_главного_класса Системный загрузчик классов реализует стандартный алгоритм загрузки из каталогов и JAR-файлов, перечисленных в переменной окружения CLASSPATH, а также из JAR-файлов, содержащих стандартные системные классы, входящих в любой комплект поставки Java. Одна из особенностей языка Java заключается в том, что можно реализовать свой собственный загрузчик классов – наследник ClassLoader – и использовать его вместо системного. Системный загрузчик можно получить с помощью вызова ClassLoader.getSystemClassLoader() – статического метода класса ClassLoader. При запуске приложения Java с помощью стандартной команды виртуальная машина Java первым делом создает системный загрузчик, загружает с его помощью .class-файла главного класса и вызывает статический метод класса, соответствующий объявлению public static void main(String[] argv) (или же сообщает об ошибке, не обнаружив такого метода). Java – язык с отложенной загрузкой кода. Первоначально загружается только один класс – тот, который передан в качестве параметра утилите «java» (на самом деле, вначале загружается целый ряд системных классов, в частности, системный загрузчик и все используемые ими классы.). Как только код этого класса обращается к какому-то другому классу (любым способом: вызовом конструктора, обращением к статическому методу или полю), загружается другой класс. По мере выполнения кода, загружаются всё новые и новые классы. Ни один класс не загружается до тех пор, пока в нем не возникнет реальная потребность. (Такое поведение заложено в стандартный системный загрузчик.)

В Java поддерживается понятие «текущего» загрузчика классов. Текущий загрузчик – это тот загрузчик классов (экземпляр некоторого наследника ClassLoader), который загрузил класс, код которого исполняется в данный момент. Каждый класс «помнит» загрузивший его загрузчик. Загрузчик, загрузивший некоторый класс, всегда можно узнать, вызвав метод getClassLoader у объекта типа Class, соответствующего данному классу. Когда возникает необходимость загрузить другой класс вследствие обращения к его конструктору, статическому методу или полю, виртуальная Java-машина автоматически обращается к текущему загрузчику классов, о котором «помнит» текущий исполняемый класс. При этом другой класс также «запоминает» этот загрузчик в качестве текущего. Т.о., текущий загрузчик, загрузивший данный класс, по умолчанию наследуется всеми классами, прямо или косвенно вызываемыми из данного. Так как главный класс приложения обычно загружается системным загрузчиком, то он же используется и для загрузки всех остальных классов, необходимых приложению. В случае Java-апплета браузер загружает главный класс апплета своим собственным загрузчиком (умеющим читать классы с веб-сервера); в результате тот же самый загрузчик используется для загрузки всех вспомогательных классов апплета. Наследование текущего загрузчика – лишь поведение по умолчанию. Загрузчик классов можно написать и так, что он не будет наследоваться для некоторых классов. В тот момент, когда к загрузчику приходит запрос «выдать класс по заданному имени», он может передать этот запрос какому-нибудь другому загрузчику. Тогда данный класс и другие классы, вызываемые из него, будут загружаться новым загрузчиком.

Источник

Оцените статью