Как именно происходит компиляция java?
запутался в процессе компиляции java
хорошо, я знаю это: мы пишем исходный код java, компилятор, который не зависит от платформы, переводит его в байт-код, а затем jvm, который зависит от платформы, переводит его в машинный код.
Итак, с самого начала мы пишем исходный код java. Компилятор javac.exe это .файл EXE. Что именно это .exe-файл? Разве компилятор java не написан на java, тогда как это происходит .exe-файл, который его выполняет? Если код компилятора пишется java, тогда как код компилятора выполняется на этапе компиляции, так как его работа jvm для выполнения кода java. Как может сам язык компилировать свой собственный код языка? Все это кажется мне проблемой курицы и яйца.
теперь что именно делает .файл класса содержит? Это абстрактное синтаксическое дерево в текстовой форме, это табличная информация, что это такое?
может кто-нибудь сказать мне, ясно и подробно о том, как мой исходный код Java преобразуется в машинный код.
9 ответов:
хорошо, я знаю это: мы пишем исходный код java, компилятор, который не зависит от платформы, переводит его в байт-код,
собственно сам компилятор работает как собственный исполняемый файл (отсюда javac.исполняемый.) И правда, он преобразует исходный файл в байт-код. Байт-код не зависит от платформы, поскольку он предназначен для виртуальной машины Java.
затем jvm, который зависит от платформы, переводит его в машину код.
не всегда. Как для JVM от Sun существует две виртуальные машины: клиентом и сервером. Они оба могут, но не обязательно должны компилироваться в машинный код.
Итак, с самого начала мы пишем исходный код java. Компилятор javac.exe это .файл EXE. Что именно это .exe-файл? Разве компилятор java не написан на java, тогда как это происходит .exe-файл, который его выполняет?
этой
exeфайл представляет собой обернутый байт-код java. Это удобство-избежать сложных пакетных сценариев. Он запускает JVM и выполняет компилятор.если код компилятора написан на java, то как код компилятора выполняется на этапе компиляции, так как его работа jvm для выполнения кода java.
это именно то, что делает код упаковки.
как может сам язык компилировать свой собственный код языка? Все это похоже на проблему курицы и яйца мне.
правда, сбивает с толку на первый взгляд. Хотя, это не только идиома Java. Компилятор Ada также написан в самой Ada. Это может выглядеть как "проблема курицы и яйца", но на самом деле это проблема только загрузчик.
теперь что именно .файл класса содержит? Это абстрактное синтаксическое дерево в текстовой форме, это табличная информация, что это такое?
это не абстрактное синтаксическое дерево. AST используется только токенизатором и компилятор во время компиляции представляет код в памяти.
.classфайл похож на сборку, но для JVM. JVM, в свою очередь, является абстрактной машиной, которая может запускать специализированный машинный язык, предназначенный только для виртуальной машины. В нем проще всего,.classфайл имеет очень похожую структуру на обычную сборку. В начале объявляются все статические переменные, затем идут некоторые таблицы сигнатур внешних функций и, наконец, машинный код.Если вам действительно интересно, вы можете копать classfile с помощью утилиты" 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. Все синтаксические ошибки происходят с этого этапа.The
javacеще не закончил работу. Когда у него есть AST, может начаться истинная компиляция. Он использует шаблон посетителя для обхода AST и разрешает внешние зависимости, чтобы добавить значение (семантику) в код. Готовый продукт сохраняется как содержащий байткод.теперь пришло время запустить эту штуку. Вы вызываете
javaименем .файл классов. Теперь JVM начинается снова, но до интерпретировать ваш код. JVM может или не может скомпилировать ваш абстрактный байт-код в собственную сборку. Компилятор Sun HotSpot в сочетании с компиляцией Just In Time может сделать это, если это необходимо. Запущенный код постоянно профилируется JVM и перекомпилируется в машинный код, если выполняются определенные правила. Обычно элемент горячий код является первым для компиляции в собственном коде.правка: без
javacможно было бы вызвать компилятор, используя что-то вроде этого:%JDK_HOME%/bin/java.exe -cp:myclasspath com.sun.tools.javac.Main fileToCompileкак вы можете видеть, он вызывает частный API Sun, поэтому он связан с реализацией Sun JDK. Это сделало бы системы сборки зависимыми от него. Если один переключился на любой другой JDK (wiki lists 5, кроме Sun) , то выше код должен быть обновлен, чтобы отразить изменение (так как это маловероятно компилятор будет находиться в COM.солнце.инструменты.и javac пакет). Другие компиляторы могут быть написаны в машинном коде.
таким образом, стандартный способ-отправить
javacобертка с JDK.
разве компилятор java не написан на java, тогда как это происходит .exe-файл, который его выполняет?
откуда вы получаете эту информацию? Элемент
javacисполняемый файл может быть написан на любом языке программирования, это не имеет значения, все, что важно то, что это исполняемый файл, который получается.javaфайлы.classфайлы.для получения подробной информации о двоичной спецификации a .файл класса вы можете найти эти главы в Java Спецификация Языка полезно (хотя, возможно, немного технически):
вы также можете взглянуть на Спецификация Виртуальной Машины, которая включает:
компилятор javac.exe это .файл EXE. Что именно это .exe-файл? Не компилятор java, написанный на java, тогда как же так получилось .EXE-файл, который исполняет его?
компилятор Java (по крайней мере тот, который поставляется с Sun/Oracle JDK) действительно написан на Java.
javac.exe- Это просто средство запуска, которое обрабатывает аргументы командной строки, некоторые из которых передаются в JVM, который запускает компилятор, а другие-в компилятор себя.Если код компилятора написан java, тогда как код компилятора выполняется на этапе компиляции , так как его работа jvm для выполните код java. Как может язык сам компилируешь свой собственный языковой код? Все это похоже на курицу и яйцо проблема для меня.
многие (если не большинство) компиляторы написаны на языке, который они компилируют. Очевидно, что на каком-то раннем этапе компилятор сам должен был быть скомпилирован чем-то иначе, но после этой "начальной загрузки", любая новая версия компилятора может быть скомпилирована более старой версией.
теперь что именно .файл класса содержать? Это абстрактное синтаксическое дерево в текстовой форме, это таблично информация, что это?
подробности формата файла класса описаны в спецификация виртуальной машины Java.
ну, javac и jvm обычно являются собственными двоичными файлами. Они написаны на Си или что-то еще. Конечно, можно написать их на Java, просто вам сначала нужна родная версия. Это называется "привязка ботинка".
забавный факт: большинство компиляторов, которые компилируются в машинный код, написанный на их родном языке. Однако все они должны были иметь родную версию, написанную на другом языке (обычно C). Первый компилятор C, для сравнения, был написан на ассемблере. Я предполагаю, что первый ассемблер был написан в машинном коде. (Или,С помощью бабочек;)
.файлы классов-это байт-код, генерируемый javac. Они не текстовые, это двоичный код, похожий на машинный код (но с другим набором команд и архитектурой).
jvm во время выполнения имеет два варианта: он может либо интепретировать байтовый код (притворяясь самим процессором), либо он может JIT (just-in-time) скомпилировать его в собственный машинный код. Последнее, конечно, быстрее, но все гораздо сложнее.
The .файл класса содержит байт-код, который является вроде очень сборка высокого уровня. Компилятор вполне может быть написан на Java, но JVM должен быть скомпилирован в машинный код, чтобы избежать проблемы курицы/яйца. Я считаю, что он написан на C, как и нижних этажах стандартных библиотек. Когда JVM запускается, он выполняет компиляцию just-in-time, чтобы превратить этот байт-код в собственные инструкции.
Краткое Описание
напишите код в текстовом редакторе, сохраните его в формате, понятном компилятору -".java" расширение файла, javac (компилятор java) преобразует это в ".класс" формат файла (байт - код-класс файла). Для JVM выполняет .файл класса в операционной системе, в которой он находится.
Длинное Объяснение
всегда помните, что java не является базовый язык, который распознает операционная система. Исходный код Java интерпретируется операционной системой с помощью переводчика под названием виртуальная машина Java (JVM). JVM не может понять код, который вы пишете в Редакторе, ему нужен скомпилированный код. Вот где компилятор входит в картину.
каждый компьютерный процесс позволяет себе манипуляции с памятью. Мы не можем просто написать код в текстовом редакторе и скомпилировать его. Нам нужно поместить его в память компьютера, то есть сохранить его до того, как скомпилировать.
Как javac (компилятор java) распознает сохраненный текст как тот, который будет скомпилирован? - у нас есть отдельный текстовый формат, который распознает компилятор, т. е. .java. Сохраните файл внутри .расширение Java и компилятор распознает его и скомпилировать его, когда спросил.
что происходит при компиляции? - компилятор-это второй переводчик (не технический термин), участвующий в процессе, он переводит понятный пользователю язык (java) в JVM понятный язык(байтовый код - .формат класса).
что происходит после компиляции? - компилятор выдает .файл класса, который понимает JVM. Затем программа выполняется, то есть.файл класса выполняется с помощью виртуальной машины и операционной системы.
факты, которые вы должны знать
1) Java не Multi-платформы это независимая платформа.
2) JVM является разработано с использованием C / C++. Одна из причин, почему люди называют Java более медленным языком, чем C/C++
3) байтовый код Java (.класс) находится в "Ассемблере", единственный язык, понятный JVM. Любой код, который производит .файл класса при компиляции или сгенерированный байтовый код может быть запущен на JVM.
Windows не знает, как вызывать программы Java перед установкой среды выполнения Java, и Sun выбрала собственные команды, которые собирают аргументы, а затем вызывают JVM вместо привязки jar-суффикса к движку Java.
компилятор изначально был написан на C с битами C++, и я предполагаю, что он все еще есть (почему вы думаете, что компилятор также написан на Java?). и javac.exe-это просто код C / C++, который является компилятором.
в качестве побочной точки вы можете написать компилятор на java, но вы правы, вы должны избегать проблемы курицы и яйца. Для этого вы обычно пишете один или несколько инструментов начальной загрузки в чем-то вроде C, чтобы иметь возможность компилировать компилятор.
в .файл класса содержит байт-коды, выходные данные процесса компиляции javac, и это инструкции, которые говорят JVM, что делать. Во время выполнения эти байт-коды преобразуются в собственные инструкции ЦП (машинный код), поэтому они могут выполняться на определенном оборудовании под JVM.
чтобы немного усложнить это, JVM также оптимизирует и кэширует машинный код, полученный из байт-кодов, чтобы избежать их повторного перевода. Это известно как компиляция JIT и происходит как программа работает и байт-коды интерпретируются.
- .java file
- компилятор (Java BUILD)
- .класс(байт-код)
- JVM (системное программное обеспечение обычно строится с помощью 'C')
- ОПЕРАЦИОННАЯ ПЛАТФОРМА
- процессор
Comments