@Livid:能简要说下Objective-C语言本身有什么优点吗?

2011-01-17 23:41:13 +08:00
 keakon
初学Objective-C,只是把它的语法粗略看了遍。
从语法本身来说,它有的东西,除了property和category外,C++都有,只是换了下表达方式。
最大的“创新”是它的内存管理:它用了手动的引用计数来管理对象内存的释放。

我在某篇文章中看到,那篇文章作者很喜欢这种方式,他认为既比垃圾收集高效,又不会像C++那样麻烦。
可是在我看来,这种手动的引用计数似乎没有比C++好到哪去,不用时也得执行一次release。更奇怪的就是要用另一个指针指向它时,编译器还不能自己去加一,必须手动写个retain。
反观C++,因为有很多约定俗成的习惯,不需要每次引用都去更改引用计数,只需要它的维护者(可能是创建者,也可能是使用者,但同时只会有1个是)在不用时delete它,其他的使用者完全无需关注。

当然,我也没拿它写过程序,所以只是自觉上这么认为,不知道@Livid有什么经验可以分享下?
11351 次点击
所在节点    iDev
39 条回复
fmfsaisai
2011-01-18 01:26:23 +08:00
优点就是它能做app,别的语言不能做app
mayokaze
2011-01-18 01:50:57 +08:00
objc对象运行时保有类型元信息,可以动态更改原型等等,而cpp是基于VTable的玩不出一些动态特性
keakon
2011-01-18 03:48:28 +08:00
@mayokaze 原以为Objective-C会是很静态的语言,以至于我看category时还在怀疑是不是和JavaScript的prototype差不多的东西。查了下资料后发现本质上确实差不多,但这种运行时绑定的特性估计会让它比C++慢。

初看上去Objective-C 2.0更优秀些,不过推出来也都快5年了,还不能用于iOS开发,估计是性能或内存问题更严重吧…
keakon
2011-01-18 04:04:08 +08:00
发现我又扯到性能上去了,实际上还是一个平衡的问题。

例如C++使用虚函数表,看上去应该比动态类型语言的查询更快,但也丧失了覆盖静态方法的能力。再如template虽然提供了很好的性能,但复杂的语法与duck typing相比必然导致开发效率的低下。

不管怎么说,这几十年发展下来,电脑的速度快了不止千倍,人脑的速度和人类的寿命却没有这么明显的增长,所以就让一切更加动态吧…
mayokaze
2011-01-18 04:14:54 +08:00
@keakon 推特上回了,这里在说一下template吧,运行时是快了,对于编译调试那可真是梦魇
jjgod
2011-01-18 06:57:45 +08:00
@keakon: iOS 上现在用的就是 Objective-C 2.0,只不过不支持 GC 而已,事实上 GC 就是在 desktop 系统上的推广也都一直不好,Mac 下很少有启用 GC 的应用程序,习惯了 reference counting 的程序员都不喜欢用 GC。另外像 Android 上 GC 就是很大的一个拖慢性能的原因,这是 Google 的开发者承认的,尤其是在 GC 回收的时候,容易把渲染卡住。

Objective-C 的 message dispatching 做了很大量很复杂的优化,比如针对 x86, x86_64, arm 都有专门的跳转和缓存等等,和静态函数调用之间的效率差别基本上可以忽略不计了 -- 而且 Objective-C 并没有防止你把调用特别频繁的地方 inline。
keakon
2011-01-18 12:03:57 +08:00
@jjgod 在wiki上看到这个,难道是运行时还能进行优化么?
http://www.mikeash.com/pyblog/performance-comparisons-of-common-operations.html

关于GC,Android的实现好像粒度很大,而且与此同时必须停下所有线程来跑GC,所以必然会卡住渲染。

不过这些我还是等看完Objective-C的实现再研究吧,目前的问题是你们喜欢它吗,用它的好处是什么?
例如我喜欢Python和JavaScript,从语法上可以找到一堆优雅的地方,写起来也惬意和畅快,性能虽差但足以接受。而Objective-C有什么特别吸引人的地方?
yanyanlong
2011-01-18 12:07:46 +08:00
1楼正解。
Kai
2011-01-18 12:22:39 +08:00
@keakon 你可以使用它弄出一个很优雅的 App 出来,然后将这份优雅优雅地拿给更多的人享受(而不仅仅是自己)
roamlog
2011-01-18 12:27:26 +08:00
编程语言是用来解决问题的, 每种语言都有它的优缺点, 也有它的特定适应领域, 比如 c/c++ 可以 c/s 方面的东西, php/jsp/asp 等一般来说是用来做 b/s 方面的东西, 当然你也拿 php 去写 c/s 也许可以写出那么点东西来, 但肯定不是最佳选择.

每种语言都有它优雅设计的地方, 如果单纯从语法啊语言设计的优美与否而选择学什么语言的话, 那是在做研究.
CupTools
2011-01-18 12:31:15 +08:00
@roamlog 我用PHP写了Nameserver,WebServer(纯静态文件),还有MySQL proxy。反正C能做的事情,PHP理论上都可以做(PHP就是C -.=)
keakon
2011-01-18 12:43:50 +08:00
@roamlog 我想你误会我的意思了。

我希望的是语言能帮助程序员减少无谓的coding,避免潜在的问题。所以一开始接触内存管理时就觉得很奇怪,难道编译器自动retain一下会怀孕么?

我不是反对使用Objective-C,毕竟我还没完全弄懂它,没什么发言权。可我想谁都不希望以复杂的方法去做一件简单的事吧。

回到你的观点,那么Objective-C和C++做C/S应用有什么差别呢?是什么让你觉得Objective-C更加适合app开发这个领域。

我也不想扯什么苹果限制只能用它开发app的事,这和语言本身无关。如果苹果当初只允许你用C++写,@fmfsaisai和@yanyanlong是否就觉得C++比Objective-C好了?
Kai
2011-01-18 12:55:32 +08:00
@keakon iOS 平台是可以用 C++ 开发的。
roamlog
2011-01-18 13:02:08 +08:00
@keakon 每门语言当初设计出来时都是为了解决一些特定需求的,更多的是作者当时自己遇到的或想解决的问题,他觉得目前市面上的工具不能满足他的需求,所以一门新语言就诞生了。

首先,一门语言不可能解决所有问题,也许有些语言确实可以解决非常多的问题,各个方面,但我认为那只是能解决,但不一定说能好好解决,或解决的比较好。

其次,语言作者在设计语言时,因为个人经验,学识及当时所处环境条件等因素的影响,虽然也许他们或多或少都有参考其它一些语言的设计和实现,但他们更多的是融入了自己的观点,他觉得这样设计更好,更优美,但这是比较主观的,所以会有很多人不同的想法,建议和意见。

再次,很多人在比较语言之间的差别时,都会有先入为主的问题,你觉得 a 在 A 语言中的实现方式比在 B 语言中的实现方式更优美,更好。有时候是存在这样的情况,但很多时候,得换个角度,或参考这门语言的设计理念、作者的思想和一些客观环境等条件,或放到一些特定环境里去讨论,你也许会发现其实 B 语言中这样实现也是不错,是有道理的。

最后,也许得把 object-c 放到苹果这个特定环境下来讨论会比较好,因为一些历史原因,以及这么多年不断发展的原因,也许你会发现在苹果电脑上使用 object-c 来开发 mac app 或 ios app,会更方便,更简单一些,因为它有 xcode,还有苹果系统本身内核封装的一些东西也对 object-c 来说会更友好和方便。

补充:以上码的字有班门弄斧原的嫌疑,随便看看就行,XD
keakon
2011-01-18 13:05:06 +08:00
@Kai 话是这么说没错,web app甚至只要写网页就行了,可是cocoa的原生语言就是Objective-C。
假如是在Windows上开发,你让Objective-C去使用MFC、WPF,我想也不是能不能的问题,而是傻不傻的问题。
所以这种方面的比较根本就不平等,而我只想关注语言本身的优点。
wccandww
2011-01-18 13:06:58 +08:00
CupTools
2011-01-18 13:11:07 +08:00
@keakon Java和Air跨平台呢,你看谁用。。
Kai
2011-01-18 13:24:58 +08:00
@keakon 关于 MFC、WPF,我想起来前几天看到的一篇文章 ^^

http://www.cnblogs.com/by1990/archive/2011/01/15/1936465.html
keakon
2011-01-18 14:54:14 +08:00
@roamlog 目前我就是不清楚这个历史原因。我不满足于别人都用这个,所以我也用这个。我想的是如果不好用,有什么地方可以改进;如果好用,有什么可以借鉴。


@CupTools 这两门语言我都不喜欢,遗憾的是用Java的人远多于Objective-C,仅管不是UI方面


@Kai 在MFC上浪费过1周左右的时间,然后就再也不去碰微软的东西了。说实话我就喜欢简单的东西,如果一门语言、一个框架或一个库我在一天之内不能基本掌握它(不去涉及较深奥的部分,只作了解),那我就很难下决心再去浪费时间了。

其中当然也有例外,例如初学C时,我也花了约1周的时间去学习基本的语法,可毕竟那时我只算是刚涉足编程。而C++也花了2周,可我也觉得很值。
之后在学Java、C#、PHP、Python、Ruby、JavaScript、Lisp、Lua、ANI和Go时,我没发现有一个需要超过2天的。在初步了解它们后,我才能知道它们的优劣之处,适合做什么,是否合我口味,以及是否值得继续学下去。其中Go让我很受伤,说实话仔细回味起来,除了语法奇葩点,就没太多优点了;当然Ruby才算是其中最复杂的,但至少功能很可爱,只是不喜它不直观的语法。

而在学Objective-C时我也很奇怪,宣称自己是C的超集,扩展出来的语法却让任何一个只懂C的程序员完全看不懂。举例来说,C的函数声明和调用已经是很通用的风格了,作为它的超集,Objective-C却让方法变成了消息传递,然后各种奇葩语法balabala。反正都看不懂,为什么不干脆摆脱C的束缚,更加特立独行一些呢?

我发这帖不是想找语言的岔,我只是想给自己一个学下去的理由,让我知道它还是有很多闪光点的。我纯粹就是想找个玩意打发时间,但我希望不是浪费时间。
keakon
2011-01-18 15:40:03 +08:00
发现一篇好文,Philosophy of Each Language这段大致能解明我的疑惑:
http://www.mactech.com/articles/mactech/Vol.13/13.03/CandObjectiveCCompared/

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/7356

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX