Smalltalk 是一种非常紧凑的语言,并且仍然是最纯粹的面向对象语言之一。Objective-C 是 Smalltalk 和 C 之间的一种务实的折衷,这带来了一些非常实质性的差异。例如,在 Smalltalk 中,一切都是对象——甚至是简单的数字——并且对对象的每次操作都是通过消息发送来实现的。消息以相同的顺序进行评估,而与它们的名称无关。因此,例如以下内容:
8 + 9 / 23 + 16 * 8
以严格的从左到右的顺序进行评估,因为运算符“+”、“/”和“*”对语言没有特殊含义,它们只是传递给数字对象的消息。
Objective-C 将 Smalltalk 风格的对象添加到 C 中,但也是 C 的严格超集,保留了 C 的原始类型和内置运算符。因此,在 Objective-C 中,正常的数学运算顺序将应用于上面的表达式——首先进行除法和乘法运算,然后进行加法运算。
学习 C 对于彻底理解 Objective-C 是绝对必要的。Objective-C 是 C 的严格超集,并且尽可能明确地使用完全相同的语法和语义。它将对象的概念移植到 C 上,因为 C 能够保留指向事物的指针,而无需知道如何对事物应用任何操作。然后,它扩展了 C 语法以提供一种将消息发布到对象以及声明和实现对象可能接收的消息的方法。
许多 Objective-C 运行时的一般设计,尤其是与 Cocoa 结合使用时,直接来自 Smalltalk,包括选择器的概念、使用元类作为类实例的工厂、继承的层次结构和系统、模型-视图-控制器(Smalltalk 原创,尽管现在几乎无处不在)的划分以及标准集合和对象上定义的许多消息。
在我的脑海中,Smalltalk 的流量控制系统也有很大不同,并且有一个相似但微妙不同的“块”概念(尽管大多数较新的实现已经使两者保持一致)。Apple 实际上已经实现了块作为 C 级别的扩展,Objective-C 对象上的许多新方法都使用了该扩展。
总而言之,Goldberg Smalltalk-80 这本书写得非常好,易于阅读,语言非常简单,您只需两三章就可以学习整个语言。大多数复杂性都被运行时中可用的对象所吞噬,显然这些东西不会转移。对您的好处是,关于对象和运行时的意识形态内容最终与印刷中的细节非常分离。相反,C 使诸如流控制和算术之类的东西成为一种语言特性,这意味着在您真正感觉到自己知道发生了什么之前,需要更多的语法和阅读内容。
所以,总而言之:Smalltalk-80 书(紫色的)绝对值得一读,非常有用,但不一定完全相关。在任何情况下,学习 C 都是必不可少的;我对 K&R 的引用是为了比较。