будет ли преобразование из кода java в байтовый код jvm считаться компилированным или транспилированным? - PullRequest
1 голос
/ 26 мая 2020

Компиляция - это процесс преобразования с одного уровня абстракции на более низкий уровень. Между тем транспиляция - это процесс преобразования с одного уровня абстракции на другой на том же уровне, как преобразование кода java в Kotlin / python. Это мое понимание двух процессов. Может ли кто-нибудь объяснить это с точки зрения кода java и байтового кода jvm. И мой вывод верен?

Ответы [ 3 ]

2 голосов
/ 26 мая 2020

Высокий / Низкий уровни абстракции от человеческого языка к машинному языку

Компилятор выполняет перевод с языка более высокого уровня на язык более низкого уровня. Под высшим / низшим мы подразумеваем степень абстрагирования от машинного языка. Таким образом, это будет включать Java язык для байт-кода. Байт-код ближе к машинному языку и дальше от человеческого языка.

Транспиллер выполняет преобразование между языками сопоставимых уровней абстракции. Одним из примеров может быть преобразование EcmaScript 6 в EcmaScript 5 для совместимости со старыми веб-браузерами. Преобразование из Java языка в Kotlin будет другим, или Swift в Kotlin.

См. Википедию: https://en.wikipedia.org/wiki/Source-to-source_compiler

Промежуточное представление

В частности, байт-код, скомпилированный из Java языка и битовый код, скомпилированный с помощью LLVM (из Swift, Rust и c), известен как Промежуточное представление (IR) . IR предназначен для дальнейшей обработки, оптимизации и перевода, чтобы стать машинным языком .

1 голос
/ 26 мая 2020

Будет ли преобразование из кода java в байтовый код jvm считаться компилированным или транспилированным?

Это компиляция, согласно определениям, которые вы даете в своем вопросе. Набор инструкций байт-кода находится на более низком уровне абстракции, чем Java исходный код.


Сказав это, это различие между компиляцией и транспиляцией немного нечеткое, поскольку нет четкого определения «уровень абстракции».

(Можно возразить, что, поскольку C иногда называют «языком ассемблера высокого уровня», C ++ «должен» быть на более высоком уровне абстракции, чем C.)

0 голосов
/ 26 мая 2020

Это работает, как описано ниже:

Сначала java исходный код конвертируется в файл байт-кода транслятором с именем «Compiler». Файл с байтовым кодом получает имя с расширением .class, а javac (java компилятор) - это инструмент для компиляции файла. java.

Затем

java - это инструмент, используемый для вызова Java интерпретатора «JVM». Теперь начинается работа JVM. При вызове JVM

  1. запускается подпрограмма в JVM, называемая загрузчиком классов (или загрузчиком системного класса), и загружает байт-код в память ОС (или ОЗУ).

  2. другая подпрограмма Bytecode Verifier проверяет и гарантирует, что код не нарушает правила безопасности. Вот почему программа java очень защищена и не содержит вирусов.

  3. Затем последняя подпрограмма Execution Engine наконец-то преобразует байт-коды в машинный код. Имя этого движка, которое используется сегодня, - JIT Just In Compiler.

Вы можете прочитать примерно то же самое здесь: https://www.quora.com/How-does-the-Java-interpreter-JVM-convert-bytecode-into-machine-code

...