Можно ли скомпилировать C ++ в независимый от платформы код? Почему бы и нет? - PullRequest
1 голос
/ 02 октября 2009

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

Ответы [ 6 ]

14 голосов
/ 02 октября 2009

Это действительно возможно, см., Например, LLVM .

8 голосов
/ 02 октября 2009

Конечно. Имейте в виду, что стандарт C ++ определяет только поведение: что должно произойти при выполнении этой программы. Это не определяет, как это должно быть реализовано.

Код C ++ может быть скомпилирован в промежуточный формат и добавлен в JIT для машинного кода, или его можно интерпретировать или как угодно.

5 голосов
/ 02 октября 2009

Это тривиально, и большинство компиляторов уже делают это. gcc компилируется в RTL (язык передачи регистров), который затем транслируется в целевой ЦП.

Аналогично, управляемые C ++ и C ++ / CLI компилируются в .NET.

Наконец, вы можете рассмотреть тезис Church Turing , который является утверждением эквивалентности языков программирования, поэтому C ++ может быть скомпилирован / переведен на ваш любимый платформо-независимый язык (скажем, Perl, lisp, C-- и т. Д.).

4 голосов
/ 02 октября 2009

Исходный код C ++ (с некоторыми ограничениями) является независимым от платформы байт-кодом.

Почему это не так?

Действительно, процедура компиляции "байт-кода" - это просто копирование. Виртуальная машина, на которой выполняется «байт-код», - это компилятор C ++ и скрипт-обертка. Да, он делает некоторые вещи, которые напоминают компиляцию в машинный код - но это детали реализации.

Вот реализация Linux такой виртуальной машины C ++:

#/bin/sh

tmp=`mktemp`
g++ $1 -o $tmp && $tmp $2 $3 $4 ...

Это отвечает на вопрос? Я думаю, это так. Насколько конкретен вопрос. Потому что это ясно объясняет теоретическую возможность компиляции C ++ в байт-код. Практические реализации также существуют, например, LLVM.

3 голосов
/ 02 октября 2009

Да, это технически возможно. Немного плагин для бывшего работодателя, но вот реализация именно этого: http://antixlabs.com/products/antixgamedevelopmentkit/. Процесс упаковки, грубо говоря, C / C ++ -> (компилятор) -> LLVM -> (бэкэнд) -> сделанный на заказ байт-код -> почтовый файл. Это не зависит от платформы. Как только он появится на устройстве пользователя, «player» преобразует сделанный на заказ байт-код -> (переводчик для этого устройства) -> собственный файл эльфа -> (загрузчик / компоновщик) -> исправленный код.

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

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

C ++ даже не имеет стандартного графического интерфейса, а среды C ++ гораздо более фрагментированы, чем Java. Как вы говорите разработчику приложений для Windows, разработчикам мобильных телефонов, разработчикам смарт-карт и разработчикам бэкэндов на фондовой бирже, что им необходимо отказаться от существующего набора инструментов в пользу независимого от платформы механизма развертывания C ++? Они не И это еще до того, как вы приступите к написанию ОС и драйверов устройств на C или C ++, смешанных со сборкой. Просто невозможно создать стандартную среду для поддержки всех из них.

2 голосов
/ 02 октября 2009

Проект Parrot будет иметь компиляцию и выполнение байт-кода c ++ parrot Visual Studio может компилировать C ++ как байт-код Управляется C ++

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...