0

Как преобразовать код C++ в C [закрыто]

13

Проблема с преобразованием C++ кода в C

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

У меня возникли следующие вопросы:

  1. Существуют ли инструменты для конвертации C++ кода и заголовочных файлов в C код?
  2. Нужно ли мне полностью переписывать код (т.е. придется удалить конструкторы и деструкторы, переместив соответствующий код в функции init() и deinit(); изменить классы на структуры, сделать существующие методы как указатели на функции в этих новых структурах и вызывать эти функции через указатели и т.д.)?
  3. Если я должен буду сделать это вручную, на какие специфические для C++ конструкции и семантику кода следует обратить внимание при конвертации из C++ в C?

Спасибо за помощь!

3 ответ(ов)

0

Да, действительно существует такой инструмент — компилятор C++ от Comeau. Он генерирует код на C, который не получится поддерживать вручную, но это не проблема. Вы будете поддерживать код на C++, а по необходимости просто конвертировать его в C на лету.

0

Хотя в C можно реализовать объектно-ориентированный подход (например, добавив параметр theType *this в методы и самостоятельно управляя чем-то вроде таблиц виртуальных функций для полиморфизма), это никогда не будет выглядеть удовлетворительно с точки зрения проектирования, и будет выглядеть неуклюже (даже с использованием некоторых хаков пре-процессора).

Я бы предложил хотя бы рассмотреть возможность перепроектирования, чтобы сравнить, как это будет работать.

В целом, многое зависит от ответа на ключевой вопрос: если у вас есть рабочий код на C++, зачем вам C?

0

Компилятор состоит из двух основных блоков: "фронт-энд" и "бэк-энд".

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

Бэк-энд компилятора берет промежуточную форму и затем преобразует ее в "целевой язык".

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

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

Таким образом, у нас есть следующая схема: C++ ---фронтЭнд---> someIntermediaryForm ---бэкЭнд---> C.

Вы можете ознакомиться с этими ребятами: http://www.edg.com/index.php?location=c_frontend (вышеприведённая ссылка лишь информационная и показывает, что можно сделать; они лицензируют свои фронт-энды за десятки тысяч долларов).

P.S. Насколько мне известно, компилятора C++ в C от GNU нет, и это меня удивляет (если я прав). Поскольку язык C довольно небольшой, а его внутренние механизмы достаточно примитивны, разработка компилятора C требует примерно одного человека-года работы (я могу это сказать из собственного опыта, так как сам писал подобный компилятор много лет назад, и он производит промежуточный код для [виртуальной] стековой машины). Наличие поддерживаемого, актуального компилятора C++ при условии написания компилятора C лишь однажды было бы действительно здорово...

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь