Может ли программное обеспечение C / C ++ быть скомпилировано в байт-код для последующего выполнения? (Архитектурно-независимое программное обеспечение Unix.) - PullRequest
7 голосов
/ 22 июня 2011

Я бы хотел скомпилировать существующее программное обеспечение в презентацию, которая впоследствии может быть запущена на разных архитектурах (и ОС).

Для этого мне нужен (байт) код, который можно легко запускать / эмулировать в другой архитектуре / ОС ( LLVM IR? Некоторые сборки RISC?)

Некоторые случайные идеи:

  • Компиляция в байт-код JVM и запуск с использованием Java. Слишком ограниченно? C-компиляторы доступны?
  • MS CIL. C-компиляторы доступны?
  • LLVM? Можно ли запустить промежуточное представление позже?
  • Компиляция в RISC-арку, такую ​​как MMIX. А как насчет системных вызовов?

Тогда есть система отображения системных вызовов, но, например, В BSD есть уровни перевода системных вызовов.

Существуют ли уже работающие системы, которые компилируют C / C ++ во что-то, что позже можно будет запустить с интерпретатором на другой архитектуре?


Редактировать

Могу ли я скомпилировать существующее программное обеспечение Unix в не столь низкоуровневый двоичный файл, который можно было бы "эмулировать" легче, чем запускать полный эмулятор x86? Что-то более похожее на JVM, чем на XEN HVM.

Ответы [ 6 ]

6 голосов
/ 23 июня 2011

На странице JVM в Википедии перечислены несколько компиляторов C to JVM. Я никогда не пробовал ни одного из них, но они звучат как интересное упражнение для построения.

Из-за своей тесной связи с языком Java JVM выполняет строгие проверки во время выполнения, предписанные спецификацией Java. Это требует, чтобы C компилировал байт-код для обеспечения своей собственной «слабой машинной абстракции», например, для создания скомпилированного кода, который использует массив Java для представления основной памяти (чтобы указатели могли быть скомпилированы в целые числа), и связывания библиотеки C с централизованным классом Java это эмулирует системные вызовы. Большинство или все перечисленные ниже компиляторы используют аналогичный подход.

4 голосов
/ 22 июня 2011

C, скомпилированный в битовый код LLVM, не зависит от платформы.Взгляните на портативный переносной клиент Google , они пытаются решить эту проблему.

У Adobe есть алхимия , которая позволит вам скомпилировать C для прошивки.

Есть компиляторы с C на Java или даже JavaScript .Однако из-за различий в управлении памятью они не очень удобны в использовании.

2 голосов
/ 20 января 2017

Веб-сборка пытается решить эту проблему, создавая стандартный формат байт-кода для Интернета, но в отличие от байт-кода JVM, веб-сборка является более низким уровнем, работая на уровне абстракции C / C ++ а не Java, так что это больше похоже на то, что обычно называют «ассемблером», к которому обычно компилируется код C / C ++.

2 голосов
/ 23 июня 2011

Как отмечает Анкур, C ++ / CLI может быть решением. Вы можете использовать Mono для запуска его в Linux, если у него нет собственных битов. Но если у вас уже нет кодовой базы, которую вы пытаетесь портировать с минимальными затратами, возможно, ее использование будет контрпродуктивным. Если это имеет смысл в вашей ситуации, вы должны использовать Java или C #.

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

2 голосов
/ 22 июня 2011

LLVM не является хорошим решением для этой проблемы. Каким бы красивым ни был LLVM IR, он ни в коем случае не является независимым от машины и не должен был им быть. Очень просто и действительно необходимо в некоторых языках генерировать целевой LLVM IR: например, sizeof (void *) будет 4 или 8 или что-то еще при компиляции в IR.

LLVM также ничего не делает для обеспечения независимости от ОС.

Одной интересной возможностью может быть QEMU. Вы можете скомпилировать программу для конкретной архитектуры, а затем использовать эмуляцию пространства пользователя QEMU, чтобы запустить ее на разных архитектурах. К сожалению, это может решить проблему с целевой машиной, но не решит проблему с ОС: эмуляция пользовательского режима Linux QEMU работает только в системах Linux.

JVM, вероятно, является лучшим выбором как для целевой системы, так и для независимости от ОС, если вы хотите распространять двоичные файлы.

1 голос
/ 23 июня 2011

Настоящая проблема заключается в том, что C и C ++ не являются независимыми от архитектуры языками. Вы можете написать вещи, которые являются достаточно переносимыми, но компилятор также жестко кодирует аспекты машины через ваш код. Подумайте, например, о sizeof (long). Кроме того, как упоминает Ричард, нет независимости от ОС. Поэтому если у используемых вами библиотек нет одинаковых соглашений и они существуют на нескольких платформах, тогда вы не сможете запустить приложение.

Лучше всего было бы написать код на более переносимом языке или предоставить бинарные файлы для платформ, которые вам интересны.

...