Как именно происходит компиляция java? - программирование
Подтвердить что ты не робот

Как именно происходит компиляция java?

Смущает процесс компиляции java

OK Я знаю это: мы пишем исходный код java, компилятор, который независим от платформы, переводит его в байт-код, тогда jvm, который зависит от платформы, переводит его в машинный код.

Итак, с начала, мы пишем исходный код java. Компилятор javac.exe - это .exe файл. Что это за файл .exe? Является ли java-компилятор написанным в java, тогда как это происходит .exe файл, который его выполняет? Если код компилятора написан java, тогда как код компилятора выполняется на этапе компиляции, так как его работа jvm для выполнения Java-кода. Как сам язык может составить собственный код языка? Все это похоже на проблему с курицей и яйцом.

Теперь, что именно содержит файл .class? Это абстрактное синтаксическое дерево в текстовой форме, это табличная информация, что это такое?

может кто-нибудь сказать мне четкий и подробный способ о том, как мой исходный код java преобразуется в машинный код.

4b9b3361

Ответ 1

  Хорошо, я знаю это: мы пишем исходный код Java, компилятор, который не зависит от платформы, переводит его в байт-код,

На самом деле сам компилятор работает как собственный исполняемый файл (отсюда и javac.exe). И правда, он преобразует исходный файл в байт-код. Байт-код не зависит от платформы, поскольку он нацелен на виртуальную машину Java.

затем jvm, который зависит от платформы, переводит его в машинный код.

Не всегда. Что касается Sun JVM, то здесь есть два jvms: клиент и сервер. Они оба могут, но не обязательно должны компилироваться в нативный код.

Итак, с самого начала мы пишем исходный код Java. Компилятор javac.exe представляет собой файл .exe. Что именно это файл .exe? Разве Java-компилятор не написан на Java, тогда как получается .exe файл, который его выполняет?

Этот файл exe представляет собой упакованный байт-код Java. Это для удобства - избегать сложных пакетных скриптов. Он запускает JVM и запускает компилятор.

Если код компилятора написан на java, то почему код компилятора выполняется на этапе компиляции, так как это задача jvm - выполнять код java.

Это именно то, что делает упаковочный код.

Как сам язык может компилировать свой собственный код языка? Все это кажется мне проблемой с курицей и яйцом.

Правда, сбивает с толку на первый взгляд. Хотя, это не только Java-идиома. Компилятор Ады также написан на самой Аде. Это может выглядеть как "проблема с курицей и яйцом", но на самом деле это всего лишь проблема с самозагрузкой.

Теперь, что именно содержит файл .class? Это абстрактное синтаксическое дерево в текстовом виде, табличная информация, что это?

Это не Абстрактное Синтаксическое Дерево. AST используется токенизатором и компилятором только во время компиляции для представления кода в памяти. Файл .class похож на сборку, но для JVM. JVM, в свою очередь, является абстрактной машиной, которая может работать на специализированном машинном языке, ориентированном только на виртуальную машину. В простейшем случае файл .class имеет структуру, очень похожую на обычную сборку. Сначала объявляются все статические переменные, затем идут несколько таблиц сигнатур внешних функций и, наконец, машинный код.

Если Вам действительно любопытно, Вы можете покопаться в файле классов, используя утилиту "javap". Вот пример (запутанный) результат вызова javap -c Main:

0:   new #2; //class SomeObject
3:   dup
4:   invokespecial   #3; //Method SomeObject."<init>":()V
7:   astore_1
8:   aload_1
9:   invokevirtual   #4; //Method SomeObject.doSomething:()V
12:  return

Итак, вы должны уже иметь представление о том, что это такое на самом деле.

Кто-нибудь может мне рассказать, как мой исходный код Java преобразуется в машинный код?

Я думаю, что это должно быть более понятно прямо сейчас, но здесь краткое резюме:

  • Вы вызываете javac, указывая на ваш файл исходного кода. Внутренний считыватель (или токенизатор) javac читает ваш файл и создает из него реальный AST. Все синтаксические ошибки происходят с этой стадии.

  • javac еще не закончил свою работу. Когда у него есть AST, может начаться истинная компиляция. Он использует шаблон посетителя для обхода AST и разрешает внешние зависимости, чтобы добавить смысл (семантику) в код. Готовый продукт сохраняется в виде файла .class, содержащего байт-код.

  • Теперь пришло время запустить вещь. Вы вызываете java с именем файла .class. Теперь JVM запускается снова, но для интерпретации Вашего кода. JVM может или не может компилировать Ваш абстрактный байт-код в собственную сборку. Компилятор Sun HotSpot в сочетании с компиляцией Just In Time может сделать это при необходимости. Выполняемый код постоянно профилируется JVM и перекомпилируется в собственный код, если соблюдаются определенные правила. Чаще всего горячий код компилируется первым.

Изменение: Без javac нужно было бы вызвать компилятор, используя что-то похожее на это:

%JDK_HOME%/bin/java.exe -cp:myclasspath com.sun.tools.javac.Main fileToCompile

Как вы можете видеть, он вызывает частный API Sun, поэтому он связан с реализацией JDK Sun Это сделало бы системы сборки зависимыми от него. Если кто-то переключился на любой другой JDK (вики-списки 5, кроме Sun), приведенный выше код следует обновить, чтобы отразить это изменение (поскольку маловероятно, что компилятор будет находиться в пакете com.sun.tools.javac). Другие компиляторы могут быть написаны на нативном коде.

Таким образом, стандартным способом является поставка оболочки javac с JDK.

Ответ 2

Является ли java-компилятор написанным в java, тогда как это происходит .exe файл, который его выполняет?

Откуда вы получаете эту информацию? Исполняемый файл javac может быть написан на любом языке программирования, он не имеет значения, все, что важно, - это исполняемый файл, который превращает файлы .java в файлы .class.

Подробнее о двоичной спецификации файла .class вы можете найти в этих главах в Java Language Specification (хотя, возможно, немного техническую ):

Вы также можете посмотреть Спецификация виртуальной машины, которая охватывает:

Ответ 3

Компилятор javac.exe - это .exe файл. Что это за файл .exe? не java-компилятор, написанный в java, то как получится .exe файл, который выполняет его?

Компилятор Java (по крайней мере тот, который поставляется с Sun/Oracle JDK) действительно написан на Java. javac.exe - это просто средство запуска, которое обрабатывает аргументы командной строки, некоторые из которых передаются JVM, который запускает компилятор, а другие - самому компилятору.

Если код компилятора написан java, тогда как код компилятора выполненный на стадии компиляции, поскольку его работа jvm выполнить java-код. Как может язык сам компилирует свой собственный код языка? Все это похоже на курицу и яйцо проблема для меня.

Многие (если не большинство) компиляторы написаны на языке, который они компилируют. Очевидно, что на ранней стадии компилятор должен был скомпилироваться кем-то другим, но после этого "начальной загрузки" любая новая версия компилятора может быть скомпилирована более старой версией.

Теперь, что именно делает .class файл содержат? Это абстрактное синтаксическое дерево в текстовой форме, это табличное информация, что это такое?

Подробности формата файла класса описаны в спецификации виртуальной машины Java.

Ответ 4

Ну, javac и jvm обычно являются родными двоичными файлами. Они написаны на С или как угодно. Конечно, можно написать их на Java, просто сначала вам нужна нативная версия. Это называется "обвязка багажника".

Интересный факт: большинство компиляторов, которые компилируются в нативный код, написаны на своем родном языке. Однако им всем сначала нужно было написать нативную версию на другом языке (обычно C). Первый компилятор C, для сравнения, был написан на Ассемблере. Я предполагаю, что первый ассемблер был написан в машинном коде. (Или используя бабочек ;)

Файлы .class - это байт-код, сгенерированный javac. Они не текстовые, они представляют собой двоичный код, похожий на машинный код (но с другим набором команд и архитектурой).

Во время выполнения jvm имеет две опции: он может интерпретировать байтовый код (притворяясь самим процессором) или JIT (точно в срок) компилировать его в машинный код. Последнее, конечно, быстрее, но сложнее.

Ответ 5

Файл .class содержит байт-код, который очень похож на сборку высокого уровня. Компилятор может быть хорошо написан на Java, но JVM нужно будет скомпилировать в собственный код, чтобы избежать проблемы с курицей/яйцом. Я считаю, что он написан на языке C, как и на более низких уровнях стандартных библиотек. Когда JVM работает, он выполняет компиляцию "точно в момент времени", чтобы превратить этот байт-код в собственные инструкции.

Ответ 6

Краткое пояснение

Запишите код в текстовом редакторе, сохраните его в формате, который понимает компилятор - ". Расширение файла java" , javac (java-компилятор) преобразует это значение в ". class" (файл байта - файл класса). JVM выполняет файл .class в операционной системе, в которой он находится.

Длинное пояснение

Всегда помните, что java не является базовым языком, который распознает операционная система. Исходный код Java интерпретируется операционной системой транслятором, называемым Java Virtual Machine (JVM). JVM не может понять код, который вы пишете в редакторе, ему нужен скомпилированный код. Здесь компилятор входит в картину.

Каждый компьютерный процесс позволяет манипулировать памятью. Мы не можем просто написать код в текстовом редакторе и скомпилировать его. Нам нужно поместить его в память компьютера, а затем сохранить его перед компиляцией.

Как javac (java-компилятор) распознает сохраненный текст как скомпилированный?. У нас есть отдельный текстовый формат, который распознает компилятор, т.е. .java. Сохраните файл в расширении .java, и компилятор узнает его и скомпилирует его, когда его спросят.

Что происходит при компиляции? - Компилятор - это второй переводчик (не технический термин), вовлеченный в процесс, он переводит понятный пользователю язык (java) в понятный язык JVM (байт-код - формат .class).

Что происходит после компиляции? - Компилятор создает файл .class, который JVM понимает. Затем выполняется программа, то есть файл .class выполняется JVM в операционной системе.

Факты, которые вы должны знать

1) Java не является многоплатформенной независимой от платформы.

2) JVM разработан с использованием C/С++. Одна из причин, почему люди называют Java более медленным языком, чем C/С++

3) Байт-код Java (.class) находится в "Язык сборки" , единственный язык, понятный JVM. Любой код, который создает файл .class при компиляции или сгенерированный байт-код, может быть запущен на JVM.

Ответ 7

Windows не знает, как вызывать Java-программы перед установкой среды выполнения Java, а Sun выбрала собственные команды, которые собирают аргументы и затем вызывают JVM вместо привязки jar-suffix к движку Java.

Ответ 8

Компилятор был первоначально написан на C с битами С++, и я предполагаю, что он по-прежнему (почему вы думаете, что компилятор также написан на Java?). javac.exe - это только код C/С++, который является компилятором.

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

Файл .class содержит байт-коды, выходные данные процесса компиляции javac, и это инструкции, которые сообщают JVM о том, что делать. Во время выполнения эти байткоды переводились в собственные инструкции процессора (машинный код), поэтому они могут выполняться на конкретном оборудовании под JVM.

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

Ответ 9

  • .java файл
  • компилятор (JAVA BUILD)
  • .class(байт-код)
  • JVM (системное программное обеспечение обычно создается с помощью 'C')
  • РАБОЧАЯ ПЛАТФОРМА
  • ПРОЦЕССОР