2

我可以将 Objective-C 程序编译为 C 吗?

我很感兴趣是否可以这样做,以便可以使用其他 C 编译器对其进行编译。

我知道 GCC 可以编译 Objective-C。

4

2 回答 2

12

当然。例如,POC将 Objective C 编译为纯 C 代码,推荐使用它的方法是使用 gcc 编译该 C 代码。

当然,生成的 C 是不可读的混乱,主要由extern对 objc_runtime 调用的调用(通过生成的声明)组成,因此您需要将该运行时链接到已编译的代码。

还有一个 LLVM 后端,可以从任何前端生成 C 代码。因此,您可以插入clangObjective 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 前端附带的未命名功能集”有点拗口。

于 2013-05-21T23:41:52.440 回答
1

从技术上讲,是的,但它会非常难看。LLVM 有一个 C 后端——即它可以编译为 C——直到版本 3.1。已经努力恢复它,但我不能谈论他们的进展。还有一个 C++ 后端维护得更好,但不完全做同样的事情。

但是,您将遇到一个明显的问题,即在您的目标平台上没有任何 Foundation 库可用。不NSString,不NSArray,等等。一旦你找到了它们的工作实现,你也将找到一个工作的 Objective-C 编译器。

于 2013-05-21T23:43:43.793 回答