2016-11-18 3 views
1

Прежде всего, это не ваш стандарт «Я хочу скомпилировать код Java-кода для машинного кода».Можно ли скомпилировать машинный код в Java без внешней программы?

Я работаю над компилятором, написанным на Java, который переведет определенный язык (в моем случае: Brainfuck) на сборку x86, после чего я в настоящее время планирую использовать NASM и GCC для создания машинного кода.

Видя, как JSM HotSpot может скомпилировать байт-код Java для машинного кода, я предполагаю, что имеется некоторый механизм для компиляции исходного кода типа A в машинный код.

Есть ли способ использовать это в компиляторе, написанном на Java? Моя основная цель - изучить возможность написания компилятора на Java без использования внешних программ, например GCC и NASM, доступных на пути. Мне нужен компилятор C, потому что я связываюсь с cstdlib, поскольку я использую эти функции в своем коде сборки x86.

Чтобы уточнить, что я делаю в данный момент следующие:

  1. Написать x86 ассамблею к bf.asm файла.
  2. Преобразование сборки в код объекта с nasm -f win32 bf.asm.
  3. Связать код объекта с ОС Windows и библиотеками cstdlib с помощью gcc -o bf bf.obj.

Я ищу возможности замены необходимости использования nasm и gcc шаги 2 и 3, и вместо того, чтобы делать те с Java кодом.

+3

Может ли downvoter объяснить, почему этот вопрос не показывает каких-либо исследований, что делает его неясным или не полезным? – skiwi

+4

Ну @skiwi, некоторые фундаментальные исследования расскажут вам, что делает компилятор или ассемблер. И от этого ответ на ваш вопрос будет очевиден. –

+0

@StephenC Я знаю, что делают компиляторы и сборщики. Пожалуйста, переходите к делу. – skiwi

ответ

9

Видя, как JSM HotSpot может скомпилировать байт-код Java для машинного кода, я предполагаю, что имеется некоторый механизм для компиляции исходного кода типа A в машинный код.

Это не следует.

Компилятор JIT компилирует байт-коды Java в собственный код. Он не понимает ничего, кроме Java-байтов. А байт-коды не являются «исходными кодами». (Они на самом деле являются формой машинного кода ... для абстрактного компьютера ... на Java виртуальной машины.)

Короче говоря, нет никакого механизма доступны в рамках виртуальной машины Java для компиляции исходного кода для машинного кода.

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

Есть ли способ использовать это в компиляторе, написанном на Java?

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


Итог: если ваша цель состоит в том, чтобы генерировать машинный код, который может быть запущен, как и связанный с отдельным исполняемым

  • ЛТ-компилятор не имеет смысла для вас, но
  • вы можете использовать JVM, включая JIT-компилятор, в качестве вашей платформы исполнения, путем генерации байт-кодов, и
  • Вы могли бы использовать также обычное Java-программирование для реализации ваш компилятор или ассемблер, включая компонент, который генерирует и испускает собственный код в формате, который соответствует вашим потребностям.
+0

Благодарим вас за ответ. Я только что обновил сообщение, чтобы включить список того, что я делаю прямо сейчас, я понял, что забыл добавить это, и вопрос, возможно, выглядел неполным, извините за это. – skiwi

+1

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

4

Можно ли скомпилировать машинный код в Java без внешней программы?

Да. Напишите ассемблер x86 в Java.

Если вы создаете сборку x86, следующим шагом, очевидно, является ее сборка.

Видя, как JSM HotSpot может скомпилировать байт-код Java для машинного кода, я предполагаю, что имеется некоторый механизм для компиляции исходного кода типа A в машинный код.

Просто потому, что HotSpot может преобразовывать код байта Java в машинный код x86, не означает, что он может конвертировать любой другой вход в тот же.

Вы, по сути, спрашиваете, можно ли использовать Java JITter для сборки x86 asm. Это не имеет никакого смысла.

я нужен компилятор C, потому что я связь с cstdlib

Нет, вам нужен линкер. Ничто из ссылки не требует компилятора.

+1

О части 'cstdlib' ... он также нуждается в самой библиотеке, может быть, это путает ОП, думая, что ему нужен весь компилятор? Поскольку компиляторы C обычно распространяются в комплекте со всеми базовыми библиотеками, так что это обычный способ, которым программист добирается до них. Плюс, если вы используете оболочку компилятора для связывания окончательного двоичного кода, может быть легко пропустить существование компоновщика как отдельного автономного инструмента в toolchain. – Ped7g

+0

Благодарим вас за ответ. Я только что обновил сообщение, чтобы включить список того, что я делаю прямо сейчас, я понял, что забыл добавить это, и вопрос, возможно, выглядел неполным, извините за это. – skiwi

Смежные вопросы