我可以将 Objective-C 程序编译为 C 吗?
我很感兴趣是否可以这样做,以便可以使用其他 C 编译器对其进行编译。
我知道 GCC 可以编译 Objective-C。
我可以将 Objective-C 程序编译为 C 吗?
我很感兴趣是否可以这样做,以便可以使用其他 C 编译器对其进行编译。
我知道 GCC 可以编译 Objective-C。
当然。例如,POC将 Objective C 编译为纯 C 代码,推荐使用它的方法是使用 gcc 编译该 C 代码。
当然,生成的 C 是不可读的混乱,主要由extern
对 objc_runtime 调用的调用(通过生成的声明)组成,因此您需要将该运行时链接到已编译的代码。
还有一个 LLVM 后端,可以从任何前端生成 C 代码。因此,您可以插入clang
Objective C 前端和 C 后端并构建自己的 ObjC-to-C 编译器。结果可能比POC 生成的更难读。
当然大多数人不想编译Objective C*,他们想编译“Objective C 4.0”。** POC 不会那样做;只有 clang 和 llvm-gcc 会(将来很可能只有 clang)。他们不只是想要一个 Objective C 运行时,他们想要 OS X 或 iOS 运行时,或者至少是 OpenStep,这又几乎意味着 clang、llvm-gcc 或 gcc。
最大的问题是,你为什么要这样做?您将需要有一个 Objective C 运行时来链接,并且您的 C 代码必须以与运行时的编译方式兼容的 ABI 方式编译,所以……我不确定你要做什么首先使用 gcc 或 clang 从 ObjC 编译为本机代码。
* 如布拉德考克斯 1986 年的书中和/或他 1991 年的后续行动中定义的语言。
** 请注意,Apple 明确决定不将其最新版本称为“Objective-C 4.0”……或其他任何语言。最后一个有名字或真正规范的版本是“The Objective-C 2.0 Programming Language”。但是 Apple 继续添加功能,“Objective-C 2.0 的 LLVM 4.0 前端附带的未命名功能集”有点拗口。
从技术上讲,是的,但它会非常难看。LLVM 有一个 C 后端——即它可以编译为 C——直到版本 3.1。已经努力恢复它,但我不能谈论他们的进展。还有一个 C++ 后端维护得更好,但不完全做同样的事情。
但是,您将遇到一个明显的问题,即在您的目标平台上没有任何 Foundation 库可用。不NSString
,不NSArray
,等等。一旦你找到了它们的工作实现,你也将找到一个工作的 Objective-C 编译器。