И Kotlin, и Java — это языки программирования, которые компилируются в байт-код для выполнения на JVM (Java Virtual Machine).
Оба языка используют статическую типизацию и объектно-ориентированную парадигму.
- Исходный код
Kotlin
: файлы с расширением.kt
.Java
: файлы с расширением.java
.
- Компиляция
Kotlin
: КомпиляторKotlin
(kotlinc
) преобразует.kt
файлы в байт-код (файлы.class
).Java
: Компилятор Java (javac
) преобразует.java
файлы в байт-код (файлы.class
).
- Байт-код
- Байт-код — это промежуточный код, который может выполняться на
JVM
. - Файлы
.class
содержат инструкции дляJVM
.
- Выполнение на JVM
JVM
интерпретирует байт-код и выполняет его на конкретной платформе (например,Windows
,Linux
,Android
).
kotlinc Hello.kt -include-runtime -d Hello.jar
Hello.kt
— исходный файл.Hello.jar
— исполняемый файл, содержащий байт-код и необходимые библиотеки.
javac Hello.java
Hello.java
— исходный файл.Hello.class
— файл с байт-кодом.
JVM — это виртуальная машина, которая выполняет байт-код.
Она обеспечивает платформонезависимость: один и тот же байт-код может выполняться на любой платформе, где установлена JVM
.
Class Loader (Загрузчик классов):
- Загружает классы (файлы
.class
) в память. - Проверяет корректность байт-кода.
Execution Engine (Исполняющий движок):
- Интерпретирует байт-код и выполняет его.
- Использует
JIT
(Just-In-Time
) компиляцию для оптимизации производительности.
Memory Areas (Области памяти):
- Method Area - Хранит метаданные классов (например, имена методов, поля).
- Heap - Хранит объекты и массивы.
- Stack - Хранит локальные переменные и вызовы методов.
- PC Register - Хранит адрес текущей инструкции.
- Native Method Stack - Для вызова нативных методов (например, написанных на
C/C++
).
Garbage Collector (Сборщик мусора):
- Управляет памятью, автоматически освобождая неиспользуемые объекты.
- Загрузка классов -
Class Loader
загружает.class
файлы. - Верификация - Проверяет корректность байт-кода.
- Интерпретация -
Execution Engine
интерпретирует байт-код. - JIT-компиляция - Часто используемые части кода компилируются в машинный код для ускорения выполнения.
- Выполнение - Код выполняется на процессоре.
- Это файлы, содержащие байт-код, который может выполняться на
JVM
. - Они создаются компилятором
Kotlin
илиJava
.
- Magic Number - Уникальный идентификатор (
0xCAFEBABE)
. - Version - Версия класса.
- Constant Pool - Таблица констант (например, строки, имена методов).
- Access Flags - Модификаторы доступа (например,
public
,final
). - This Class - Имя текущего класса.
- Super Class - Имя родительского класса.
- Interfaces - Список интерфейсов.
- Fields - Поля класса.
- Methods - Методы класса.
- Attributes - Дополнительные атрибуты (например, аннотации).
- Android использует
ART
(Android Runtime
) илиDalvik
(в старых версиях) вместо стандартнойJVM
. - ART/Dalvik выполняет
DEX
-файлы (оптимизированный байт-код дляAndroid
).
Компиляция:
Kotlin
/Java
код компилируется в.class
файлы..class
файлы преобразуются вDEX
-файлы (Dalvik Executable
) с помощью инструментаdx
илиd8
.
Сборка APK:
DEX
-файлы, ресурсы (изображения, строки) и манифест упаковываются вAPK
(Android Package
).
Установка:
APK
устанавливается на устройство.ART
/Dalvik
компилируетDEX
-файлы в нативный код (AOT
-компиляция) или интерпретирует их (JIT
-компиляция).
Запуск:
- Приложение запускается в процессе
Android
. ART
/Dalvik
выполняет код, управляет памятью и взаимодействует с системой.
Это архивный файл, содержащий всё необходимое для работы приложения:
- DEX-файлы - Скомпилированный код.
- Ресурсы - Изображения, строки, макеты.
- Манифест -
AndroidManifest.xml
(информация о приложении, разрешения, компоненты). - Нативные библиотеки - Библиотеки на
C/C++
(если используются).
- classes.dex - Скомпилированный код.
- res/ - Ресурсы (изображения, строки).
- AndroidManifest.xml - Манифест приложения.
- lib/ - Нативные библиотеки.
- assets/ - Дополнительные файлы.
- Процессор выполняет машинный код (нативные инструкции).
JVM
(илиART
/Dalvik
) преобразует байт-код в машинный код с помощьюJIT
илиAOT
компиляции.
Стек (Stack):
- Хранит локальные переменные и вызовы методов.
- Каждый поток имеет свой стек.
- Быстрый доступ, но ограниченный размер.
Куча (Heap):
- Хранит объекты и массивы.
- Общая для всех потоков.
- Медленный доступ, но большой размер.
public class Example {
public static void main(String[] args) {
int x = 10; // Локальная переменная (хранится в стеке)
String str = new String("Hello"); // Объект (хранится в куче)
}
}
x
хранится в стеке.str
хранится в куче, а ссылка на него — в стеке.
Сборщик мусора автоматически освобождает память, удаляя объекты, которые больше не используются.
- Mark - Помечает все используемые объекты.
- Sweep - Удаляет неиспользуемые объекты.
- Compact - Уплотняет память, чтобы избежать фрагментации.
Нативные методы — это методы, написанные на других языках (например, C/C++
), которые могут вызываться из Java
/Kotlin
кода.
public class NativeExample {
public native void nativeMethod(); // Нативный метод
static {
System.loadLibrary("native-lib"); // Загрузка нативной библиотеки
}
}
Kotlin
/Java
код компилируется в.class
файлы..class
файлы преобразуются вDEX
-файлы дляAndroid
.
- Выполняет байт-код.
- Состоит из
Class Loader
,Execution Engine
,Memory Areas
иGarbage Collector
.
- Использует
ART
/Dalvik
для выполненияDEX
-файлов. APK
— это архив сDEX
-файлами, ресурсами и манифестом.
- Стек - Локальные переменные и вызовы методов.
- Куча - Объекты и массивы.
- Автоматически освобождает неиспользуемую память.