Может ли код C ++ читать файлы Java .class?

Я уже давно работаю в Java и хочу узнать, как работает c ++, когда дело доходит до компиляции и выполнения.

Мне было интересно, если есть способ конвертировать скомпилированный класс C ++ в файлы .class в Java и наоборот. Меня интересует один формат, который можно использовать как в коде Java, так и в коде C ++, который можно напрямую выполнить, чтобы увидеть результаты.

1

Решение

Почти все осуществимо однако, если вы амбициозны и достаточно упрямы, вопрос обычно заключается во времени, стоимости и особенностях.

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

После компиляции код C ++ представлен машинным кодом. Байт-код Java, конечно, переводится в машинный код — просто благодаря тому, что JVM выполняет его и что джиттер может на лету перекомпилировать его в машинный код.

Таким образом, грубо говоря, каждый код Java, скомпилированный или нет, может быть переведен на C ++.

Тем не менее, есть некоторые конструкции кода в C ++, которые могут быть скомпилированы в машинный код, но это может быть представимы в байт-коде Java, но это не могу быть представленным обратно на языке Java. Их много: от некоторых простых в обращении, таких как передача параметров в виде ссылок, до более сложных, таких как арифметика указателей (TheList->), до некоторых действительно болезненных для перевода, таких как множественное наследование, управление пользовательской памятью (то есть перегруженные операторы). новый и удалить), или некоторые злые типы, такие как союзы.

Итак, ясно, что код C ++ не переводим на Java. Ясно, что скомпилированный код C ++ еще более не переводим, так как компиляторы C ++ часто тщательно оптимизируют продукты, так что очень трудно догадаться, на что похожи «классы» или «функции».

Однако, если вы ограничиваете язык C ++ и ограничиваетесь тем, что не используете какие-либо из этих трудно переводимых конструкций (см. «TheList»), вы можете сделать код C ++ переводимым. Опять код, но не двоичные файлы.

Это еще не все, хотя. «Переводимость» — это одно, а другое — будет ли оно работать? Наиболее отличительной разницей во время выполнения является GarbageCollector. Допустим, вам действительно удалось перевести некоторый код Java на C ++, и вы выстроили его в соответствие с приложением C ++. Ваш код Java / C ++ выполняется и создает несколько объектов. Кто их очистит? Как правило, в С ++ нет GC. Следовательно, ваш Java-код утечет — или вам придется предоставить / реализовать какой-то GC для кода Java / C ++. Не очень. Конечно, вы можете ограничить Java-код, чтобы он не создавал никаких объектов.

Не поймите меня неправильно: даже такие сложные для перевода вещи, как арифметика указателей и т. Д., Можно перевести: вы можете генерировать тонны вспомогательного / связанного кода, который заменит их на «правильные вещи второй платформы». Это будет, однако, до смешного сложным и медленным. Я не думаю, что кто-нибудь вменяемый когда-либо попробует.

Таким образом, единственное, что может показаться доступным, это очень ограниченный C ++ — код <-> несколько ограниченный Java-код. Если мы сократим вопрос к этому, то да, это должно быть переведено. Но..

Что это значит для переведите код? Как ты это сделал? Вы должны читать, обрабатывать, анализировать исходный код, а затем как-то создать другой код на другом языке. Ладно, хорошо. Производить код просто, это просто текст. Но вы когда-нибудь пытались анализировать код? Короче говоря, позвольте мне сказать вам, что чтение / разбор кода Java по крайней мере на порядок проще что чтение / разбор кода C ++. Java была отчасти предназначена для легкого анализа с помощью относительно простых алгоритмов. Если вы отбросите любые попытки оптимизации, написание Java-парсера / компилятора будет относительно простой вещью. С другой стороны, C ++ не было. Как и в Java, для правильного разбора C ++ вам потребуется эффективно создать собственный компилятор C ++, но также и препроцессор. В некоторой степени вам также может понадобиться реализовать некоторые части компоновщика. Что еще хуже, C ++ эволюционировал из более старых языков и буквально упакован некоторыми функциями, которые используются один раз в жизни, что делает синтаксис действительно сложно точно процесс (т.е. вы когда-либо использовали альтернативный набор токенов? ..и это только начало :)). Не пугайся слишком сильно! Я просто хочу дать вам ощущение того, к чему вы пытаетесь прикоснуться. Вам, вероятно, не нужно было бы писать это. Такие уже имеющиеся инструменты существуют как для Java (на самом деле многие, на самом деле), так и для C ++ (немного, и я уверен, что разумные из них не полностью бесплатны … или, возможно, вы могли бы использовать набор инструментов GCC, вероятно …). Они производят машинно-обрабатываемые представления исходного кода, и если вы действительно хотите выполнить некоторую работу по переводу, я бы посоветовал вам начать там.

Конечно, мои знания могут исчезнуть через несколько лет, и, возможно, кто-то уже написал какого-то более или менее работающего переводчика — я бы хотел это увидеть!

Если нет, думаю, оно того не стоит. Попробуйте встроить среду выполнения Java в свое приложение C ++ или поговорите с Java на C ++ DLL через JNI. это много проще!

5

Другие решения

Скомпилированный код C ++ загружается ОС. То есть компоновщик C ++ генерирует зависимые от ОС исполняемые модули. Тогда как Java .class загружается JVM. JVM выполняет байт-код Java.

Если вы хотите создать загрузчик / запуск Java-кода, вы можете начать с исходного кода JVM.
=> ссылка на сайт

Если вы хотите загрузить / выполнить скомпилированный код C ++ в среде Java, необходимо выполнить следующее.
(Предполагая 32-битную платформу Windows)

. PE парсер / загрузчик => ссылка на сайт
. Анализатор инструкций процессора X86 (?) => ссылка на сайт
. Инструкция X86 для Java-байт-кода

Одним словом, это почти невозможно.

Для простых взаимодействий C / C ++ и Java подойдет JNI. ссылка на сайт

3

Я думаю, JNI будет полезно:

«Собственный интерфейс Java (JNI) — это программная среда, которая позволяет коду Java, работающему на виртуальной машине Java (JVM), вызывать и вызываться собственными приложениями (программами, специфичными для аппаратной части и платформы операционной системы) и написанными библиотеками. на других языках, таких как C, C ++ и ассемблер. «

Вот Хорошие советы, как программировать простой пример использования Java Native Interfac (напишите приложение Java, которое вызывает функцию C).

0

Преобразование уже скомпилированного кода C ++ в байт-код JVM — непростая задача, особенно если вы хотите использовать скомпилированный код C ++ с разных платформ.

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

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

0