Java Language Specification或C++ Standard
的Objective-C等价物是什么?(我只是在寻找一份(官方的)权威文件,该文件将解释该语言的细微之处。我现在将跳过原因:)
答案 0 :(得分:13)
您链接到的文档的附录A是对所有语言功能的描述,这是我们与规范最接近的(附录B曾经是语法规范,但是它们已经明确地从后来删除了该文件的版本。)
从未有过Objective-C的标准化,并且它始终受到单一供应商的控制 - 最初是StepStone,然后是NeXT计算机许可它(并最终购买了IP),最后苹果消耗了NeXT软件。我希望在Apple的标准化过程中没有什么动力,特别是因为没有人指责ObjC是一个标准化可以缓解的反竞争平台。
答案 1 :(得分:12)
没有。您提供的链接是唯一的“官方”文档,它本质上是散文描述,而不是严格的语言规范。 Apple员工建议这对于大多数用途来说已经足够了,如果您需要更正式的东西,您应该提交错误报告(!)。遗憾的是,正在运行的笑话是Objective-C标准是由编译器能够编译的任何内容定义的。
许多人认为Objective-C要么是C.恕我直言的“严格超集”或“超集”,对于'经典'Objective-C(或Objective-C 1.0),我会认为这是一个真实的陈述。特别是,我不知道任何没有映射到等效的“普通C”语句的Objective-C语言添加。从本质上讲,这意味着Objective-C的添加是纯粹的语法糖,并且可以使用C标准来推断细节。我不相信对于启用了GC的Objective-C 2.0来说这是完全正确的。这是因为需要专门处理指向GC管理内存的指针(编译器必须根据指针的细节插入各种障碍)。由于GC指针类型限定符(例如__strong
)在__attribute__(())
内实现为gcc
,这意味着void *p;
和void __strong *p;
为similarly qualified pointers
根据C99标准。这可能导致的问题,甚至编写以确定性方式运行的程序的能力,要么是不言而喻的(请咨询您当地的语言律师或编译器作者以获取更多信息)。
不时出现的另一个问题是C语言相对于Objective-C语言继续发展。 Objective-C可以追溯到1980年代中期,这是ANSI-C之前的标准时间。请考虑以下代码片段:
NSMutableArray *mutableArray = [NSMutableArray array];
NSArray *array = mutableArray;
这是合法的Objective-C代码,由该语言的官方散文描述定义。这也是面向对象编程背后的主要概念之一。然而,当人们从“C99的严格超集”的角度考虑这些陈述时,就会遇到一个巨大的问题。特别是,这违反了C99的strict aliasing rules
。标准等级语言规范将有助于澄清此类冲突的处理和行为。不幸的是,因为不存在这样的文档,所以对这些细节存在很多争论,并最终导致编译器中的错误。这导致gcc
中的错误一直追溯到版本3.0(gcc bug #39753)。
答案 2 :(得分:1)
Apple的文档是关于你将获得的最好的。与许多其他语言一样,Objective-C没有正式的标准或规范;相反,它主要通过其规范实现来描述。
答案 3 :(得分:1)
答案 4 :(得分:0)
Apple(现在)使用llvm.org项目的clang。
在此上下文中定义了一些语言元素
e.g。 Objective-C文字 - > http://clang.llvm.org/docs/ObjectiveCLiterals.html
但我没有找到所有元素的清晰概述。
---更新 -
Apples clang的来源(作为开源)在这里: http://opensource.apple.com/source/clang/