为什么在可可环境之外没有广泛使用Objective-C?


24

Objective-C具有良好的面向对象,简单,优雅和(作为C的超集)低级功能的特点。似乎是很多人在Go中寻找并尝试找到的C ++的简单,现代的替代品。但是它仅用于可可和NextSTEP后环境,即使在这种情况下,由于历史原因,它也被视为负担,而不是最佳选择。

为什么它没有被更广泛地使用?有什么问题?


5
“历史原因”是指“很多图书馆”

@vartec您没有被迫这样做。例如,请参见MonoTouch,它是C#。哦,然后您有了Apple关于Objective-C,C和C ++的规则,对吗?他们已经放弃了。
右对齐

Answers:


28

IMO,Objective-C的问题并不仅是巨大的缺点,还包括次要的缺点(尤其是早期的缺点)和缺乏明显的优势。

Objective-C是C的纯超集,因此C 代码可以轻松过渡到Objective-C。心态要使用的Objective-C,然而,从C心态不同一个不少。从C到Objective-C的过渡对于代码来说很容易,但是对许多程序员而言却根本不容易。AC程序员不能轻松地在Objective-C中选择一些新的便利功能并几乎立即获得更高的生产率-他需要学习很多新的“东西”,才能完全掌握。

C ++使某些代码的转换更加困难,但是对于大多数程序员而言,转换却容易得多。习惯于处理代码的每个细节的C程序员仍然可以在C ++中达到他们想要的程度。C ++还使使用某些新功能(例如,添加ctor来自动初始化结构的成员)变得容易,而无需真正改变思维方式。许多面向对象的纯粹主义者推动了思维方式的根本改变,但是许多C程序员却在没有做任何事情的情况下转而使用C ++(至少从现在开始,而且常常是从事物的外观上)。

对于大多数C程序员来说,C ++ 看起来也更为熟悉。它增加了一些新的关键字,但是(尤其是在早期)代码仍然看起来相当熟悉。尽管它具有“纯粹的超集”状态,但是大多数Objective-C代码对于大多数C程序员而言似乎都是陌生的。就C语言中的工作方式而言,很多C ++也很容易解释和理解。切换到Objective-C的地方很多,您所能说的就是“只是相信我,而忘记您认为的一切。 ”

Objective-C中的许多设计决策也使其(比)C ++慢一些,特别是在处理器速度慢,内存有限等相对较旧的机器上。无论对与错,它在很大程度上也被视为单一公司的产品, C ++可供所有人和所有人免费使用。

所有这些导致C ++在早期就被足够快地采用,以至于它相当快地达到了“临界质量”,因此(除其他事项外)它已经成为许多项目的显而易见的选择,因为它已经是广泛使用的,众所周知的数量。

Objective-C从未达到这一点。实际上,当苹果公司通过将它几乎逼迫任何想要为其系统开发的人来复兴它时,它正逐渐淡出人们的视线。苹果的市场份额还不足以使其真正达到临界数量,只是更大的利基市场。仅在苹果这样做的地方/因为它是“默认”选择。

我还要补充一点,至少在我看来,Objective-C的类似于Smalltalk的对象模型意味着,实际上,它比C ++更直接成为Java的竞争对手。是的,它仍然具有C的基础,是的,您仍然可以在不使用单独的语言的情况下编写低级代码-但是纯C和真正的Objective-C的差异足够大,以至于它像单一语言而不是两种完全不同的语言,碰巧两者都是由单个编译器处理的(尽管这很方便,两者无需JNI之类的东西就可以相互通信)。


优秀的历史回顾。我首先在90年代的白色盒子NextSTEP机器上用Objective-C编码,并且已经在大学里接受过C ++的教学,但我讨厌Objective-C的怪异语法。因此,我很欣赏您在这里说的很多话。
Mark Booth,

谢谢,这显然是我想要的答案。里奇(Ritchie)使C使团队合作成为可能;“ C有古怪的缺陷,并取得了巨大的成功”;这句话的意思是您必须制作一种简洁的语言,以便许多人可以理解它,但这并不意味着它必须是一种“很棒的”语言。没有人愿意抱怨objc,因为没人喜欢它。“有些人会抱怨的语言,而没人会使用的语言” bjarne stroustup。至少通过Windows能够使计算机行业发展,即使有企业集群的支持,我希望苹果公司失败是因为他们不关心开发人员。
jokoon

很抱歉,但是即使成为开发人员也意味着您必须学习新知识,但这并不意味着您就必须忘记已经知道的一切。我听说objc的Messenger功能是通过一些优化的ASM代码实现的。真是一团糟,你怎么能告诉开发者理解这一点?驱动程序和内核开发人员呢?Mac只是用来驱动的凯迪拉克,它们只是昂贵的昂贵商品,因此您可以只查看电子邮件,观看DVD。是否想为该产品添加一些软件?祝你好运。忘记所有现有的软件,并做苹果方式TM。
jokoon

+1,出色的解释!
2013年

11

好吧,基本上,从现在开始,Apple便成为了Objective-C的推动力:

  • 尽管最后一个版本实际上已被放弃,但是Objective-C 2.0实际上开始越来越与某些核心基础类/协议联系在一起,这意味着,语言功能和框架之间存在着内在的联系,我想起了NSFastEnumeration。,这是对象正确响应for in循环所必需的。这意味着语言与平台之间的联系越来越紧密。
  • 几乎没有可可替代品。反过来,可可又开始越来越依赖OSX功能。从技术上讲,您可以在具有任何核心框架的任何OS上运行Objective-C实现,但是对于其他任何平台,实际上并没有太多新东西。

就目前而言,Apple可以完全控制Objective-C并根据其需求来驱动该语言,而在这个星球上,没有任何组织对在非Apple设备上运行Objective-C感兴趣,这足以提供一个最初的标准库和工具包,甚至可以与.NET / Mono,C ++或Java所呈现的生态系统相媲美。


3
有GNUStep。他们试图跟上苹果的发展,尽管我已经有一段时间没有检查他们做得如何了。
Per Johansson

1
还有Cocotron。
ysdx

1
在撰写此答案时,实际上不可能在非Apple平台上运行Objective-C 2.0。无论如何,在那之后做了很多努力,现在我们可以期望使用GNUstep在FreeBSD上相当流畅地运行Objective-C 2.0。
伊尼尔(Eonil)2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.