Objective-C 编程 : Will Learning C and/or Smalltalk Help?

标签 objective-c c smalltalk

<分区>

Objective-C 是一种面向对象的编程语言,它在 C 编程语言中添加了 Smalltalk 风格的消息传递。我知道学习 Smalltalk 可能就像学习 Lisp 对一个人的知识有益一样,但我想知道学习 Smalltalk 特定的概念是否会帮助我更全面地理解 Objective-C,因为 Smalltalk 在其“起源”中的作用故事”。如果有,具体是什么?

假设一个人已经了解C编程,我们可以从Smalltalk中学到什么?显然,Objective-C 中有很多 C 中没有的概念(即消息传递、接口(interface)、协议(protocol)、动态类型、委托(delegate)、反射;它是面向对象的!),而是从 Smalltalk 派生的。

编辑:我在问题中添加了 C 编程语言,因为普遍的共识是学习 C 比学习 Smalltalk 更能利用时间(当涉及到 Objective 编程时-C).

最佳答案

Smalltalk 是一种非常紧凑的语言,并且仍然是最纯粹的面向对象语言之一。 Objective-C 是 Smalltalk 和 C 之间的务实折衷,这造成了一些非常实质性的差异。例如,在 Smalltalk 中,一切都是对象——甚至是简单的数字——并且对对象的每一次操作都是通过消息发送。无论消息的名称如何,消息都以相同的顺序求值。所以例如以下内容:

8 + 9 / 23 + 16 * 8

按照严格的从左到右的顺序求值,因为运算符“+”、“/”和“*”对语言没有特殊意义,它们只是传递给数字对象的消息。

Objective-C 向 C 添加了 Smalltalk 风格的对象,但它也是 C 的严格超集,保留了 C 的原始类型和内置运算符。因此,在 Objective-C 中,正常的数学运算顺序将应用于上述表达式 — 先进行除法和乘法,然后再进行加法。

学习 C 对于透彻理解 Objective-C 是绝对必要的。 Objective-C 是 C 的严格超集,并且明确地使用完全相同的语法和语义。它将对象的概念移植到 C 上,因为 C 可以保留指向某个事物的指针,而不知道如何对该事物应用任何操作。然后它扩展了 C 语法以提供一种向对象发布消息以及声明和实现对象可能接收的消息的方法。

许多 Objective-C 运行时的通用设计,尤其是与 Cocoa 结合使用时,直接来自 Smalltalk,包括选择器的概念、使用元类作为类实例的工厂、层次结构和系统继承、模型- View - Controller 的划分(Smalltalk 的原创,尽管现在几乎无处不在)以及在标准集合和对象上定义的大量消息。

在我的脑海中,Smalltalk 在其流量控制系统方面也有很大不同,并且具有相似但略有不同的“ block ”概念(尽管大多数较新的实现已将两者结合在一起)。 Apple 实际上已经将 block 实现为 C 级别的扩展,它被许多针对 Objective-C 对象的新方法所使用。

总而言之,Goldberg Smalltalk-80 这本书写得非常好,易于阅读,而且语言非常简单,您只需两三章就可以学会整个语言。大部分复杂性都被运行时可用的对象吞没了,显然这些东西不会转移。对您的好处是关于对象和运行时的意识形态内容最终与打印的细节非常分离。相反,C 使流程控制和算术之类的东西成为一种语言功能,这意味着在您真正觉得自己知道发生了什么之前,需要阅读更多语法和更多内容。

因此,总而言之:Smalltalk-80 这本书(紫色的)绝对值得一读,而且非常有用,但不一定完全相关。无论如何,学习C是必不可少的;我对 K&R 的引用是为了比较。

关于Objective-C 编程 : Will Learning C and/or Smalltalk Help?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4315266/

相关文章:

ios - 我可以使用 NSMutableArray insertObjects :atIndexes to insert multiple items in different order?

ios - 无法将链接器标志添加到 cocoa pod 规范

ios - Interface Builder 中的 Dead Outlets/Actions 错误

ios - 如何在 UITabBars 之间执行 segue?

c - 自动构建C项目

java - 用于java开发的Smalltalk列式类浏览器

c - 如何在 Linux 中向 scsi 设备发送特定命令?

清理c中的字符缓冲区

smalltalk - 真的是在 smalltalk 中传递消息吗?

compilation - 编译 'hello, world' GNU smalltalk