Objective-C 和 C++ 32位和64位的区别别有哪些?为什么苹果会选择前者

Objective-C 和 C++ 的区别有哪些?为什么苹果会选择前者?-土地公问答
Objective-C 和 C++ 的区别有哪些?为什么苹果会选择前者?
Objective-C 和 C++ 的区别有哪些?为什么苹果会选择前者?
这几天闲来无事在图书馆看obj-c的书,看了两天,给我的感觉是,这东西不就是加了面向对象的c吗,而且类的语法还那么古怪。这东西跟c++有什么本质区别?为什么苹果会选择obj-c而不是c++?
这么说吧,写objc的时候我可以边写一边感慨“这里要是CPP就简单了……”“这里要是CPP就不用重复了……”“这里要是CPP就可以直接静态化不用反复加载了……”……真写CPP的时候根本没时间去比较,都是一边写一边哭着问编译器“我他妈到底错哪儿了你说清楚啊!”
关于Objective-C 和 C++的区别这个文档有很详细的说明 http://mation/fichiers/cpp-objc-
两门语言虽然同是C的超集,但是它们实现面向对象特性的方法很不一样。个人觉得Objective-C中最重要的概念不是“对象”,而是“消息机制”,弄懂了“消息”基本就明白两者的区别了。
可以从历史角度看看。先看Objective-C1980年代初Brad Cox和Tom Love在公司Stepstone发明。1983 年,Cox 与 Love 合伙成立了 Productivity Products International(PPI)公司,将 Objective-C 及其相关库商品化贩售,并在之后将公司改名为 StepStone。1986年,Cox 出版了一本关于 Objc 的重要著作《Object-Oriented Programming, An Evolutionary Approach》,书内详述了 Objective-C 的种种设计理念。再看C++1983年,在C语言基础上贝尔实验室的Bjarne Stroustrup推出了C++1985年公布的的C++语言1.0版的内容中又添加了一些重要特征:虚函数的概念、函数和运算符的重载、引用、常量(constant)等。1989年推出的2.0版形成了更加完善的支持面向对象程序设计的C++语言,新增加的内容包括:类的保护成员、多重继承、对象的初始化与赋值的递归机制、抽象类、静态成员函数、const成员函数等。最后看Objective-C的主推乔布斯的NeXTSTEPNeXTSTEP Steve Jobs在1985年离开苹果计算机后所创立的公司。NeXT获得了Stepstone公司的Objective-C语言授权,并扩展了著名的开源编译器GCC 使之支持 Objective-C 的编译。并基于 Objective-C 开发了 AppKit 与 Foundation Kit 等等库,作为 NeXTSTEP 的的用户接口与开发环境的基础。第一个版本 年10月12日发布Objective-C的历史远比C++久,乔布斯1985刚从苹果公司撵出去,准备卷土重来二次创业。C++ 85年才出了乔布斯建立NeXTSTEP时,估计还不知道C++是个什么玩意,而Objective-C 83年就有比较成熟的商业产品了。要你肯定也选Objective-C,不会选C++。
IOS下的编译器clang是C++开发的:Clang and LLVM clang: a C language family frontend for LLVM. All of the LLVM tools and libraries are written in C++ with extensive use of the STL. 针对LS某些说苹果厌恶C++的人
首先是两者的应用范围, Objective-C主要的应用范围是写GUI程序, 而C++的应用范围要广的多.然后, 两者从编程语言的角度来说是完全不同的设计思路, 除了名字里都带个C之外, 基本没有什么共同点, Objective-C更偏向与动态语言, 比喻的话, 可以理解为需要写Type annotation的Python.Objective-C本身具有很多适合写GUI程序的特性, 比如说强调类与类组合而不是继承, 开放的Class, 利用Protocal做契约约束, 有反射的机制等等. 这些语言特性 相比较与C++, 在写GUI方面有很大的优势. 如果不信的话, 可以看看当年MS的COM, 很好的设计理念结果通过C++表现成什么样子.所以我觉得苹果选择Objective-C是因为很了解自己要选择的这门语言的应用范围, 不需要一个大而全的语言, 只需要一个方便写GUI的语言. 此外, Objective-C只是苹果在Cocoa/Cocoa touch层使用的语言, 主要面向第三方开发者, 所以简单易学生产效率高也是一个需要考虑的因素, 而Objective-C也很好的满足了这几个要求.
网上摘的:开发人员为何应该使用 Mac OS X 兼 OS X 小史by 徐宥 http:///28/why-mac-os-x-for-programmers/在内核层面,他们用了 Mach 这个为 BSD 设计的微内核。这个操作系统内核就是为了替换已经过时的 UNIX 内核而设计的,其中的一个核心设计哲学就是重新设计进程间通信;虽然现在基于微内核的操作系统已经不是什么潮流(为此 Linus 和 Tanenbaum 吵了一场著名的架),但在相比较于当时 UNIX 系统的内核(此时 Linux 还没出现的,UNIX 内核只有 BSD, Bell, SUN 等几套),Mach 算是一个高的起点。在这个内核上,Next 公司的工程师开始构建面向对象的基础系统。这套系统在 Smalltalk 中已经有了蓝图,因此这些工程师以 Smalltalk 为蓝图,先设计了一套基于 C 的语言,也就是 Objective C,照搬了 Smalltalk 的经典的 [对象 消息: 参数] 语法。(我个人不喜欢 Objective C 这个语言,Smalltalk 是一种纯面向对象的动态类型的语言,Next 公司当年完全有机会用 Smalltalk 语言的,如果用了 Smalltalk,现在的 Cocoa 框架还会更加漂亮,代码更加干净;用 Objective C 这个自创的语言,不知道是不是因为专利的考虑,反正 Objective C 这20年的所有创新,就是在慢慢的更像 Smalltalk 而已,Java 和 Ruby 这几年也是不断的从 Smalltalk 拿东西)。
Objective-C是C的扩展,设计思路上借鉴了Smalltalk的面向对象和消息机制的思想。从我个人使用过的面向对象语言来看Objc是对消息传递支持的最彻底也最显式的。其它的C++、Java、Python、Ruby都体现的不明显,更倾向于对象的封装和抽象。 Objc和C++基本上是两门语言,没有太大的关系。Objc本身是静态语言,编译后就是机器码,执行效率很高,但引入了很多类似Python、Ruby的动态特性,像动态类型推断,id,selector,block等特性,所以又非常灵活。用惯了Java或C++会觉得Objc的语法很怪,但是放空自己去学习这门语言的话,你会很快爱上它的消息式的编程风格,加上强悍的XCode,无论是写mac应用还是ios应用,都会非常得心应手。 学习Objc不需要有c的背景,倒是学Objc的时候顺手可以把C也学了或温习下,由于Ojbc是C的超集,所以在Ojbc环境执行C程序毫无问题。 关于苹果为什么采用Ojbc的问题,说明一下,其实不是苹果采用了Objc,而是乔布斯创建的Next公司的操作系统NextStep采用了Ojbc作为原生语言。NextStep是以Mach和BSD为基础,Objc是其语言和运行库,后来的事大家都清楚,苹果买了NextStep,乔帮主回归,NextStep也成了Max OS X的基础。以后发展越来越好,Objc反而成了Apple的当家语言,现在基本上是Apple在维护Objc的发展。 还有一点不要忘记,第一台万维网的Server就是一个叫蒂姆·伯纳斯-李的大牛在NextStep上写的,包括浏览器。所以,咱们得感谢Objc,要不然还不知道互联网会发展成啥样呢......
我来做一个偏向实现的回答吧C++的面向对象特性是由编译器支持的,而且与其说是对C的拓展不如说是一门拥有C语法和部分特性的全新语言,C++不断扩展的标准也和C产生了冲突,私以为C++注重的是功能性,即通过对语言特性的不断拓展和修改来创造出功能非常全面的语言。现在C++的功能已经非常全面复杂了,但是由于语言设计的思路导致到现在为止C++都还是一个非常偏向静态的语言,绝大多数的面向对象特性都在编译阶段由编译器进行了实现。(我对于C++了解甚少,道听途说,恳请各位大牛指正。)Objective-C的面向对象实现是拓展C的,C代码可以直接放在Objective-C程序里经过编译。而且Objc本身的OOP实现是使用C结构体模拟的。struct objc_class {CClass super_const char *long instance_struct objc_ivar_list *struct objc_method_list **methodLstruct objc_cache *struct objc_protocol_list *}以上代码是Apple早期的objc_runtime开源代码,现在可能实现略有不同,但大体相似。这样一个结构体存储了方法cache,方法链表,成员变量链表,超类等等信息。我们在objc里声明类的语法在编译器中会被转化成这种C代码。而诸如[bar foo];之类的发送消息语法,在编译阶段会被转换成一个对于objc_MsgSend方法的调用。比如objc_MsgSend(bar , @selector(foo));注意编译阶段的检查已经到此为止了,剩下的对象该怎么回应这个消息已经被推迟到了运行期。这个方法干了什么呢?它大体上上干了这么几件事情:1.查找bar这个objc_class结构体的cache里,看看有没有常用的被cache的方法,找到-&执行,没找到-&2.2.查找自己的方法链表里有没有这个方法,找到-&执行,如果常用就扔进cache里,没找到-&3.3.找到自己的超类结构体,重复1-2.注意刚才叙述的一切都是在运行阶段发生的,如果一直找到根类NSObject都没有,那就只能抛出一个异常,告诉runtime"我处理不了这个消息"而编译期间编译器是不知道的,clang会根据你导入的头文件来判断是否有这个方法,来阻止你编译,但是如果你发送perfromSelector消息来让一个对象处理消息或者直接使用objc_MsgSend发送,在编译阶段编译器是一无所知的。这样做有什么好处呢?首先结合objc的runtime可以实现很多动态特性,比如反射,因为在运行阶段对消息的处理都是动态的,所以可以更改对象处理消息的方式,或是将处理不了的消息抛给其它对象。还有诸如id类型 id是一个指向 objc_object 结构体的指针,该结构体只有一个成员isa,所以任何继承自 NSObject 的类对象都可以用id 来指代,因为 NSObject 的第一个成员实例就是isa引用自罗朝辉 (http://)坏处也有很多,比如错误使用或滥用动态特性会导致程序难以维护或产生不宜排查的错误。降低程序的可读性(当然善用也会提高可读性)而且维护一个runtime也需要性能上的开支,因此非常依赖性能的引用不适合使用Objective-C的特性。(如同各位大牛所言,用来写GUI程序很合适)ORZ貌似说的有点多有点跑题,本人可能理解不够深刻或有谬误,恳请各位指正。
这说明你看的不过是一本粗浅介绍语言入门开发的书。如果你想知道答案,建议你先看《 Master Mind in Programming 》里 Objective-C 和 C++ 设计者的 interview。如果里面有不懂的概念就停下来 Google。如果你有决心,也可以先用一个月看《 The Deisng and Envoluation of C++ 》之后再看 Objective-C 设计者的 interview。 看到问题修改了,我也增加一些内容。Apple 为什么选择了 Objective-C 具体原因不可能准确获知。不过 Jobs 本人似乎对 OO 有些了解。Apple 的程序员很厌恶 C++,曾经出过一个 Tech Notes 告诉 Mac OS X 开发者不要用 C++(后因为反对浪潮较大撤下)。这说明在 OO 方面,Apple 对 C++ 和 Objective-C 的异同应该很清楚。 我的一些分析,最近写了一篇:http://p=1895
现在一天到晚我都在想,其他语言怎么都这么怪!Android为什么不用oc,windows为什么不用oc?
首先,苹果当初扩展 C 的背景,是为了方便开发 GUI 程序。相比 C++ 而言,Objective-C 对 C 做的扩展并不多。它面向对象的方式,实现的是消息模型。动态灵活,适合实现 GUI 界面。而 C++ 的特性,着实丰富得可以说过于复杂了。它支持多种编程范式,包括面向对象。不过,与其说 C++ 的面向对象编程是 object-oriented,还不如说它是 class-oriented.题外话,C++ 的 QT 库实现了 signal/slot 动态消息机制,与 Objective-C 可以说是殊途同归。
还有点有历史原因的。ios来源于mac os x,mac os x来源于mac os classical 和NeXTSTEP. NeXTSTEP开发语言就是oc
苹果用 Objective-C 而不是 C++ 有历史原因也有编程语言本身的原因,就语言来说 Objective-C 比 C++ 更适合 GUI 编程。先说历史原因,苹果今天的 OS X 和 iOS 来源于一个叫 NeXTSTEP 的操作系统,这个系统是乔布斯被赶出苹果后建立了一个叫 NeXT 公司所开发的,后来苹果以收购 NeXT 的方式让乔布斯从新回到苹果,NeXTSTEP 被改造后成了大家熟悉的 OS X 和 iOS。 NeXTSTEP 使用了 Objective-C 作为编程语言也一直延续到今天,SDK 里很多类的前缀 “NS” 就是 NeXTSTEP 的缩写。NeXTSTEP 选用 Objective-C 是因为它诞生于 1980s, 面向对象编程是很新的概念,支持的语言很少,C++ 那时候虽然已经诞生但是还没有标准,各种 C++ 实现之间存在很大差异,而 Objective-C 是 StepStone 公司的产品,并且很成熟,选择Objective-C 成了很自然的事情。这是历史原因。再说说这两个语言的本质区别,以及为什么不选 C++。以苹果的实力让 SDK 支持一个编程语言是很简单的事情(比如 Swift),为什么苹果不支持 C++ 呢?毕竟用流行的语言更容易吸引开发者和降低开发成本。这是因为对于开发 GUI 程序来说 C++ 缺乏必要的特性,编写 GUI 程序需要一些动态特性,如果语言不支持这种特性那么就要先把这些特性实现出来。主要有两个特性:根据类型动名态创建对象,UI设计一般是由专业的设计师通过设计工具完成,结果是一个UI的描述文件,例如 iOS SDK 的 xib、MFC 的 dialog resource、QT 的 QML,然后程序读取这些描述文件生成UI,这要求语言要具备根据类型名字动态创建对象的特性。动态判断一个对象能处理的事件,GUI程序的运行是基于事件的,这就要求语言能动态的判断一个对象能响应哪些事件。这些特性 Objective-C 具备而 C++ 不具备,这就是他们的本质区别。MFC 为了能动态的根据类型名创建对象实现了 CRuntimeClass 和 DECLARE_DYNCREATE 宏,QT 用 QMetaObject 和 Q_OBJECT 宏还要结合特有的 preprocessor。在动态判断一个对象对事件的响应上 MFC 提供了 BEGIN_MESSAGE_MAP END_MESSAGE_MAP 这样的宏,然后需要手工的完成从事件到处理函数的映射,QT 为了能自动完成这个过程创造性的通过 preprocessor 给 C++ 增加了新的语法以支持 slot 和 signal!!!假如苹果也支持 C++ 恐怕又要在折腾出一套东西来。所以苹果选用 Objective-C 而不是 C++是一个正确的选择。其实苹果不是没选用大家熟悉的语言,只是这个语言是 Java,这个东西叫 Java bridge (Cocoa (API))。只是从 OS X 开始就废弃了。
对于面向对象的理解,相对于C++,objective-c更加强调的是对象间的消息传递。关于这点你可以搜一下objective-c的前辈smalltalk的发明者Alan Kay关于这方面的阐述。至于为何苹果选择objective-c作为开发语言,我想是因为应用程序都是事件驱动的,这符合objective-c的特性。
只说一点:Objective-C 是一种动态的、重度依赖运行时的语言。相比 C++,Objective-C 为运行时确保程序不崩溃提供了更多的回转余地。相同一个「发送错误消息」,Objective-C 可以允许你在运行时检测到错误,而 C++ 直接给你编译、链接时可能已经失败了;如果万一通过了链接,在运行时发生接口不匹配,程序的崩溃是根本无法处理和保护的。至于其他更根本的东西……这样的问题是没意义的。冻豆腐和喜之郎果冻之间是什么关系?
Masterminds of Programming(编程之魂)里有介绍:):)
我的理解是oc是独家语言,而c++有标准委员会,属于各操作系统的公共语言,想升个级什么的相当麻烦(自行升级相当于不兼容),不升级等委员会n年才讨论出一个新版本,市场根本不允许。如ARC功能在c++中不成熟,但在市场产品开发中相当重要,而java是别公司的不能用,c#是微软的也不能用,python性能太差,光用c开发成本太高,所以一直在发展在obj-c。虽然语法受历史影响有些怪,但这个控制权在于苹果,而swift就是为了弥补语法和吸引java,c#,python,vb等开发者的糖果。
学渣表示学了obj-c以后哭着考完C++笔试
说实话,学过不少语言,但是很少像objc这种语法如此反人类的。
Objective-C是一门在C的基础上加了一层非常薄的面向对象支持的语言;而C++是一门全新的计算机编程语言,几乎支持所有的市面上可见的编程范式,然后,它兼容C。
其它类似问题
其它人正在问的问题知乎问题:这几天闲来无事在图书馆看obj-c的书,看了两天,给我的感觉是,这东西不就是加了面向对象的c吗,而且类的语法还那么古怪。这东西跟c++有什么本质区别?为什么苹果会选择obj-c而不是c++?
答:Objective-C是C的扩展,设计思路上借鉴了Smalltalk的面向对象和消息机制的思想。从我个人使用过的面向对象语言来看Objc是对消息传递支持的最彻底也最显式的。Objective-C的类中定义的方法都是消息传递,而且类和消息之间是运行时绑定的,运行时编译器把消息发送转换成对objc_msgSend方法的调用。其它的C++、Java、Python、Ruby都体现的不明显,更倾向于对象的封装和抽象。&
Objective-C和C++基本上是两门语言,没有太大的关系。Objective-C本身是静态语言,编译后就是机器码,执行效率很高,但引入了很多类似Python、Ruby的动态特性,像动态类型推断,id,selector,block等特性,所以又非常灵活。用惯了Java或C++会觉得Objective-C的语法很怪,但是把心放空再去学习这门语言的话,你会很快爱上它的消息式的编程风格,加上XCode,无论是写mac应用还是ios应用,都会非常得心应手。
学习Objective-C不需要有c的背景,倒是学Objective-C的时候顺手可以把C也学了或温习下,由于Objective-C是C的超集,所以在Objective-C环境执行C程序毫无问题。
关于苹果为什么采用Objective-C的问题,说明一下,其实不是苹果采用了Objective-C,而是乔布斯创建的Next公司的操作系统NextStep采用了Objective-C作为原生语言。NextStep是以Mach和BSD为基础,Objective-C是其语言和运行库,后来的事大家都清楚,苹果买了NextStep,乔布斯回归苹果,NextStep也成了Max OS X的基础。以后发展越来越好,Objective-C反而成了苹果的当家语言,现在基本上是苹果在维护这门语言的发展。
还有一点不能不提,第一台万维网的Server就是一个叫蒂姆&伯纳斯-李的大牛在NextStep上写的,包括浏览器。所以,咱们得感谢Objective-C,要不然还不知道互联网会发展成啥样呢......
阅读(...) 评论()748被浏览161861分享邀请回答53159 条评论分享收藏感谢收起302 条评论分享收藏感谢收起查看更多回答Objective-C和C++混编的要点_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Objective-C和C++混编的要点
&&iPhone软件开发经验
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩1页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢249被浏览39792分享邀请回答161 条评论分享收藏感谢收起16015 条评论分享收藏感谢收起查看更多回答

我要回帖

更多关于 iphonex和iphone8区别 的文章

 

随机推荐