Компиляция и исполнение кода на Java

Оглавление:
  • Что такое компиляция?
  • Элементы Java-приложения
  • Компиляция и запуск Java-приложения
  • JVM

Что такое компиляция?



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

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

Элементы Java-приложения

Каждое объявление класса компилируется в отдельный .class файл содержащий Java байт-код. JDK предоставляет инструменты для компиляции и запуска программ. Классы из API для платформы Java SE уже скомпилированы и JDK знает, где их найти.

Термин приложение (application) является синонимом программы, т.е. скомпилированного исходного кода, который может выполняться напрямую. Чтобы создать Java-приложение в программе должен быть класс в котором определен публичный, статический, ничего не возвращающий метод с именем main - точка входа с которой начинается выполнение приложения. При старте приложения Java interpreter также называемый Java Virtual Machine (JVM) запускает метод main().

Пример приложения:

// File: CharStack.java
public class CharStack {
  // Instance variables:
  private char[] stackArray;    // The array implementing the stack.
  private int    topOfStack;    // The top of the stack.

  // Static variable
  private static int counter;

  // Constructor now increments the counter for each object created.
  public CharStack(int capacity) {
    stackArray = new char[capacity];
    topOfStack = -1;
    counter++;
  }

  // Instance methods:
  public void push(char element) { stackArray[++topOfStack] = element; }
  public char pop() { return stackArray[topOfStack--]; }
  public char peek() { return stackArray[topOfStack]; }
  public boolean isEmpty() { return topOfStack == -1; }
  public boolean isFull() { return topOfStack == stackArray.length - 1; }

  // Static method
  public static int getInstanceCount() { return counter; }
}


// File: Client.java
public class Client {

  public static void main(String[] args) {

    // Create a stack.
    CharStack stack = new CharStack(40);

    // Create a string to push on the stack:
    String str = "!no tis ot nuf era skcatS";
    System.out.println("Original string: " + str);
    int length = str.length();

    // Push the string char by char onto the stack:
    for (int i = 0; i < length; i++) {
      stack.push(str.charAt(i));
    }

    System.out.print("Reversed string: ");
    // Pop and print each char from the stack:
    while (!stack.isEmpty()) { // Check if the stack is not empty.
      System.out.print(stack.pop());
    }
    System.out.println();
  }
}

Компиляция и запуск Java-приложения

>javac Client.java

Эта команда создает файл Client.class содержащий Java байт-код для класса Client. Класс Client использует класс CharStack, и если файл CharStack.class не существует, то компилятор скомпилирует CharStack.java.

Скомпилированные классы могут быть исполнены Java интерпретатором java, который также является частью JDK. 

>java Client
Original string: !no tis ot nuf era skcatS
Reversed string: Stacks are fun to sit on!

Обратите внимание, что указывается только имя, без расширения .class.
Приложение начинает свое выполнение с метода main() и завершается тогда, когда завершается исполнение метода main().

JVM

Java программы компилируются в байт-код, который интерпретируется JVM. Различные технологии оптимизации (например, just-in-time [JIT]) позволяют JVM быть эффективной виртуальной машиной относительно производительности, стабильности и безопасности. Много других языков (Scala, Groovy, и Clojure) теперь тоже компилируются в байт-код и исполняются на JVM.

Спецификация байт-кода является архитектурно-нейтральной, т.е. она не зависит от любой аппаратной архитектуры.

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

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

Комментариев нет:

Отправить комментарий