читать оглавление
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() этого класса:
Внимательно пишите статьи и делитесь ими с душой. Эта статья здесь. Друзья, которым она понравилась, могут помочь переслать и подписаться на нее. Спасибо за вашу поддержку!