我可以将目标c程序编译成c吗?
我很感兴趣是否可以这样做,以便可以使用其他c编译器进行编译。
我知道GCC可以编译目标c。
答案 0 :(得分:12)
不确定。例如,POC将Objective C编译为纯C代码,推荐使用它的方法是用gcc编译该C代码。
当然,生成的C是一个难以理解的混乱,主要包括对objc_runtime调用的调用(通过生成的extern
声明),因此您需要将该运行时链接到已编译的代码。
还有一个LLVM后端,可以从任何前端生成C代码。因此,您可以插入clang
Objective C前端和C后端,并构建您自己的ObjC-to-C编译器。结果可能比POC生成的更难更多。
当然大多数人不想编译Objective C *,他们想编译“Objective C 4.0”。** POC不会这样做;只有clang和llvm-gcc会(并且将来很可能只会铿锵)。他们不仅需要Objective C运行时,他们想要OS X或iOS运行时,或者至少需要OpenStep,这几乎意味着clang,llvm-gcc或gcc。
最大的问题是,你为什么要这样做?您需要有一个Objective C运行时链接到,并且您的C代码必须以与运行时编译方式ABI兼容的方式进行编译,所以...我不确定您将要执行什么操作首先从objC编译到使用gcc或clang的本机代码。
*与Brad Cox 1986年出版的书和/或1991年的后续书中定义的语言一样。
**请注意,Apple明确决定不调用他们对“Objective-C 4.0”语言的最新修订版......或其他任何内容。具有名称或实际规范的最后一个版本是“Objective-C 2.0编程语言”。但Apple继续增加功能,而“Objective-C 2.0的LLVM 4.0前端”中出现的“未命名功能集”有点令人满意。
答案 1 :(得分:1)
技术上,是的,但它真的很难看。 LLVM有一个C后端 - 即它可以编译为C - 高达3.1版本。有efforts to revive it但我无法谈论他们的进展。还有一个C ++后端可以更好地维护,但不会做同样的事情。
但是,您会遇到一个明显的问题,即目标平台上没有任何Foundation库可用。没有NSString
,没有NSArray
等。一旦你找到了那些工作实现,你也会找到一个有效的Objective-C编译器。