Глубокое понимание компилятора Javac для JVM

JVM

I. Обзор

Мы все знаем, что файлы *.java должны быть скомпилированы в файлы *.class, прежде чем они смогут быть распознаны JVM.Эта часть работы в основном выполняется Javac.Подобно Javac, мы называем этовнешний компилятор;

Но файл *.class не является машинным языком, как он может быть распознан машиной? JVM необходимо скомпилировать файл *.class в машинный код.Эта часть работы выполняетсяJIT-компиляторЗаканчивать;

В дополнение к этим двум компиляторам существует также компилятор, который напрямую компилирует файлы *.java в собственный машинный код, который мы называемкомпилятор АОТ.

Во-вторых, процесс компиляции javac

Прежде всего, начнем с исходного кода javac (на основе openjdk8), адрес для скачивания:Korea.open JDK.java.net/JDK8/JDK8/com…, а затем скопируйте все исходные файлы из каталога JDK_SRC_HOME/langtools/src/share/classes/com/sun в каталог исходного кода проекта, сгенерированныйсодержаниеследующее:

Мы выполняем основной метод com.sun.tools.javac.Main так же, как мы использовали бы команду javac в командном окне:

Судя по коду Sun Javac, процесс компиляции можно условно разделить на три этапа:

  • Процесс разбора и заполнения таблицы символов
  • Обработка аннотаций для подключаемых модулей обработки аннотаций
  • Процесс анализа и генерации байт-кода

Работа этих трех шагов примерно такова:

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

Точкой входа для компиляции Javac является класс com.sun.tools.javac.main.JavaCompiler.Код для трех вышеуказанных шагов сконцентрирован в compile() и compile2() этого класса:

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