Может ли объект C скомпилировать C?

63
5

Могу ли я скомпилировать объектную программу c в c?

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

Я знаю, что GCC может скомпилировать цель c.

спросил(а) 2021-01-25T17:23:41+03:00 5 месяцев назад
1
Решение
159

Конечно. Например, POC компилирует Objective C в обычный C-код, и рекомендуемый способ его использования заключается в компиляции этого C-кода с gcc.

Конечно, сгенерированный C - это нечитаемый беспорядок, состоящий в основном из вызовов (через сгенерированные объявления extern) для вызовов objc_runtime, поэтому вам нужно связать эту среду выполнения с вашим скомпилированным кодом.

Также существует бэкэнд LLVM, который генерирует код C из любого интерфейса. Таким образом, вы можете подключить clang Objective C frontend и C backend и создать собственный компилятор ObjC-to-C. Результат, вероятно, будет еще более нечитаемым, чем то, что генерирует POC.

Конечно, большинство людей не хотят компилировать Objective C *, они хотят скомпилировать "Objective C 4.0". ** POC этого не сделает; только clang и llvm-gcc будут (и в будущем, скорее всего, только clang). И они не просто хотят работать с Objective C, они хотят OS X или iOS runtime, или, по крайней мере, OpenStep, что в значительной степени означает clang, llvm-gcc или gcc.

Большой вопрос: зачем вы это делаете? Вам нужно будет использовать среду выполнения Objective C, и ваш код C должен быть скомпилирован таким образом, чтобы ABI-совместимый с тем, как была скомпилирована среда выполнения, поэтому... Я не уверен, что вы собираетесь получить преимущество над просто компиляцией из ObjC в собственный код с gcc или clang в первую очередь.

* Как и в языке, определенном в книге Брэда Кокса 1986 года и/или в его последующей работе в 1991 году.

** Обратите внимание, что Apple явно не решила назвать свои последние версии языком "Objective-C 4.0"... или что-то еще. Последняя версия с именем или реальной спецификацией была "Язык программирования Objective-C 2.0". Но Apple продолжает добавлять функции, а "неназванный набор функций, который появился с интерфейсом LLVM 4.0 для Objective-C 2.0" - это немного глоток.

ответил(а) 2021-01-25T17:23:41+03:00 5 месяцев назад
63

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

Однако у вас будет очевидная проблема, что ни одна из библиотек Foundation не будет доступна на вашей целевой платформе. Нет NSString, нет NSArray и т.д. После того, как вы нашли рабочую реализацию тех, вы также найдете рабочий компилятор Objective-C.

ответил(а) 2021-01-25T17:23:41+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема