@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有什么经验可以分享下?
11550 次点击
所在节点    iDev
39 条回复
jjgod
2011-01-18 17:48:51 +08:00
有兴趣了解 Objective-C message dispatching 细节的可以看这组系列文章: http://www.friday.com/bbum/2009/12/18/objc_msgsend-part-1-the-road-map/

从我使用了四年的经验说,Objective-C 语言和 Apple 的运行时库从来不是性能瓶颈,性能问题从来都是出在更高层的框架或者自己的代码上。
lianghai
2011-01-18 18:06:30 +08:00
这个主题本来就有点怪,加上好多人误解了楼主的意思……结果真是一片混乱。

大概大多数人都没楼主这么较真儿吧。既然 Objective-C 无疑是 Mac OS X / iOS 开发环境下的一等公民,还去讨论一些绝对客观的所谓优缺点,真折腾呀……我逃走了,忽略我吧。
mayokaze
2011-01-18 21:07:05 +08:00
@keakon 我是非常赞成讨论语言的,不过我没法认同短时间的浅尝辄止就对一种语言盖棺定论,有些东西你需要长时间实践才能领会其中精妙.你说编译器不能自动retain,可能你没把cocoa的内存管理法则搞清楚,回头看看autorelease吧,整个objc的世界内存管理就这么一种范式反而c++要更乱一些.

至于ruby不直观,一般认为ruby是最接近自然语言的,我想不出还能怎么直观,非要强制self或是强制indent才叫直观吗?至于某些黑魔法--"You are not expected to understand."
lesscome
2011-01-18 22:36:59 +08:00
同意 2# 6#
相比较c++,objc更加动态灵活,使得c++里的很多复杂问题简单化。
yanyanlong
2011-01-18 22:53:47 +08:00
"如果苹果当初只允许你用C++写,@fmfsaisai和@yanyanlong是否就觉得C++比Objective-C好了?"
@keakon 个人觉得语言没什么好坏之分.如果只允许C++那就用C++咯.我现在上班只写PL/SQL

如果你问我什么语言最重要,我认为是英语.(貌似跑题了.哈哈)
keakon
2011-01-18 23:28:46 +08:00
@jjgod 艰难读完,也许是我没理解透,没看出哪里能优化到比查询虚函数表更快,即便是在缓存的情况下,效率也不可能更高。

@mayokaze 很久没接触Ruby了,举一些我记得的吧:
1.函数默认返回最后一句表达式
2.if、case之类的语句也是表达式,并且有值
3.$、@、@@、=、?、!之类的变量名
4.%w、%q、%Q、%x等语法
5.<=>运算符
我的看法是能减少工作量的就省,但会导致看上去很生涩的就不该省。这点在初学和向不懂这门语言的人解释时非常重要。
你正在使用它,所以你记得它们是很正常的。可当你不再接触它,过个几年回头看看时,是否还记得$@是什么玩意?
ssword
2011-01-18 23:39:33 +08:00
1.函数默认返回最后一句表达式
2.if、case之类的语句也是表达式,并且有值
3.$、@、@@、=、?、!之类的变量名
4.%w、%q、%Q、%x等语法
5.<=>运算符
----------
又见语言圣战,没看懂ruby是怎么中枪的。1,2,3,5作为特性的语言我可以列出一打,楼主说自己两天学完lisp,也该心里有数。

我的看法是能减少工作量的就省,但会导致看上去很生涩的就不该省。这点在初学和向不懂这门语言的人解释时非常重要。
-------------
打算永远做新手的话当然重要。
Livid
2011-01-18 23:56:38 +08:00
NeXT 当年为什么要用 Objective-C 来构建系统,他们肯定有他们的道理。

我作为用户,我只能跟随他们的这个决定。

我没有用 C++ 写过什么大型软件,所以没有发言权。

在我看来,编程语言只是完成项目的很多个因素中的一个,而且不是最重要的那个。
chloerei
2011-01-19 00:54:01 +08:00
(Ruby娘,你怎么了!你怎么中枪了!……

LZ还没接触到Ruby的Metaprogramming部分嘛 http://book.douban.com/subject/4086938/

语法什么的只是长相, 我和Ruby交往两年才发现她的内涵跟别的姑娘有什么不同。
mayokaze
2011-01-19 01:16:25 +08:00
@keakon ruby是批着smalltalk皮的lisp,请深刻理解这句话,至于你列出这些特性以此证明ruby不直观,我只能说"呵呵"了.
@Livid 我没记错的话OBJC是当年没法选smalltalk才退而求其次的选择. 另外对我来说编程语言不只是拿来完成项目的工具.
@yanyanlong 语言当然有好坏,这跟什么语言可以用来干什么事无关,"所有命令式编程语言都是图灵完备,所以大家都一样"这种说法我认为才是不负责任的.
keakon
2011-01-19 02:14:15 +08:00
@ssword 我并没否定Ruby这门语言,前面已经说了,它有我欣赏的地方,但也有我不喜之处。我花了半个月时间去学习它,最终还是觉得有更适合我的语言,仅此而已。
感情这东西本来就是主观的,每个人都有自己的理解,我不喜欢你喜欢的歌手,你多半并不会为此感到受伤和中枪。

那个“2天”并不是“学完”,而是尝试了解整个语言的概览。要说完整的学习过程,C++我花了3年,然后停滞了。Python学了2年,仍在继续。可在有所了解之后,往后的学习过程都只是慢慢去深入和拓展而已,我并未在此过程中对某门语言有颠覆性的认识和看法。换句话说,第一印象是很难颠覆的。

语言可以有特性,但我不喜欢晦涩的特性。列表里很多Ruby的特性我没列出来,因为我确实喜欢,例如block,所以你应该看得出什么是我不喜的。
是否新手和我的看法无关,我讨论的是语言是否直观,最直观的当然是自然语言,无需解释。如果一门语言能很容易地让外行人看懂,这便说明它直观。
举例来说,C++中类的成员默认就是私有的,可我看到过的大部分代码规范里都要求显式地写上private关键字。我想基本上初学者也知道它是私有的,可为什么要写上它呢?
同样,你写不写注释对编译器来说完全不在乎,可你为什么还得写上?

换句话说,与其让其他人剥夺我肆意撒野的权利,我宁愿一开始就不给我这个自由。Ruby尝试着去满足更多人的需求(里面能看到不少语言的影子),这或许是很多人喜欢的,但很可惜这种大杂烩不是我想要的。但这只是我喜不喜欢的问题,没有碍着你喜欢的自由。

Lisp并非不直观,相反它很容易懂。真要举例的话应该是perl,充斥着大量的符号,尝试理解它经常会浪费数十分钟的时光。


@Livid 查资料没查出来,只说是把C改造成能用smalltalk风格的对象,也就是消息传递方式吧…
具体有什么好处并不清楚,我还是自己研究吧,问别人总会惹来不必要的争执,倦了。
Los
2011-01-19 02:32:52 +08:00
作为旁观者,至现在V2EX给我的感觉似乎不是很适合的深入讨论编码型的技术,探讨性的技术问题很容易给强制改变为对立性问题,而且,这里深入技术层次的人应该不多,更多应该是设计型的人员。
ssword
2011-01-19 03:07:00 +08:00
@keakon 笑~是否直观也是个主观的问题呢。既然强调“第一印象”,大段大段的文字也很无力。反正我都有第一印象了,我觉得不直观就是不直观。这很无敌的。

“换句话说,与其让其他人剥夺我肆意撒野的权利,我宁愿一开始就不给我这个自由。” 这样该喜欢haskell吧?放心,那种程度的强类型压根不给你撒野的机会,不过我怀疑你能否花两天时间学个大概,不过你可以保证在两天内判断出自己是不是喜欢它,再留一个新的“第一印象”。

“Lisp并非不直观,相反它很容易懂。”你列的1,2,3,5让ruby中枪的同时也让lisp中枪了。另,我一直很好奇说“lisp可读性高”的同学到底有写过多少lisp代码,如果有同学能给出数据的话不胜感激。

“最直观的当然是自然语言,无需解释。” 错,自然语言有二义,形式语言没有。

因为有强大的“第一印象”所以解释毫无必要,上帝的归上帝凯撒的归凯撒,over。
ps: 这贴进水深火热的话我会很开心的。
mayokaze
2011-01-19 03:11:07 +08:00
1.函数默认返回最后一句表达式 //ruby并不碍着你多打一个return
2.if、case之类的语句也是表达式,并且有值 //是否C里面赋值表达式有返回值也不够直观?嗯,ruby也没碍着你写成python那样
3.$、@、@@、=、?、!之类的变量名 //前三个无解,这是为不声明直接使用付出的代价,你当然可以认为强制声明和强制写self是更先进的方式,后三个你可以自行规避.
4,5 这只是快捷方式,你同样可以选择你认为更直观的另一种编码风格.

一条条看下来好像除了第三条其他都不是问题啊,莫非要别人所有人编码风格都一样才算是直观?

关于ruby的讨论最后总要归于"太方便了,我不习惯""太灵活了,所以不好""特性太丰富了,不够直观""范式太多样了,难以阅读".
keakon
2011-01-19 12:29:41 +08:00
@Los 其实国内大多数论坛都不适合讨论,稍微列举一些我反感的现象吧:
1. 不思考,想当然,随大流。
2. 经常以含沙射影或直接的人身攻击来争论与人格或生物无关的问题。
3. 无法包容主观异见。似乎全世界男人都必须喜欢他的女友,在和其他女人比较时,必须以他的判断标准,必须认为他的女友是最好的。
4. 在辨析不同观点时存在受迫性阅读障碍。具体表现是不去理解对方所要表达的核心思想,而是直接定位到不同观点,不分析上下文,进行断章取义的曲解以满足自己的观点。

所以我只简单回复一下,与Objective-C无关的不想再扯了。

直接从百度百科上copy下来的,我语文不及格,什么意思我看不懂:
直观(perceptual intuition),通过对客观事物的直接接触而获得的感性认识。
1.用感官直接接受的。
2.形容事物的属性容易辨识。

是否有二义与是否直观没有直接联系。对某些人来说,数学公式并不直观,因为他们可能看不懂某些奇葩的符号,但数学公式是无二义的;同时他们认为语文课文直观易懂,仅管每个人读它时都有自己的理解和认识。

请认清“撒野”是个贬义词,我这里代指我认为不好的coding风格(我主观上的)。如果给我选择,我希望废弃@end,这加重了我的书写负担;我不喜欢隐式return,这是我认为的撒野。对其他人来说,也许和我的看法正好相反,也许认为这根本不重要,可我的标准关你什么事?
我在接触Python的过程中,越来越感受到实现同一件事,在Python允许我做的方式中,简短的方式几乎总比冗长的更优雅,但它不会为了更短而丧失语义上的直观。因为这就是Pythonic,它在不知不觉中就会推荐你使用更简单而直观的方式。我不想说另一门语言如何如何,至少它不符合我的审美观。所以也不必向我这么肤浅的人灌输你的审美观,我没兴趣,也没妨碍和攻击任何人的审美观。

我从来没有说过“lisp可读性高”,而是说“很容易懂”。它的语法非常单纯,知道基本语法后,没什么读不懂的,不会被什么特殊符号和关键字迷惑。
然而易懂并不代表可读性高。四则运算很容易懂吧,我写几百个数进行运算,中间夹杂着各种括号,你认为它可读性高吗?我想至少我不会,人类会以自然段、语句等单位对语义进行拆分、认知和理解,而括号不适合人去定位和拆分,只是对编译器而言可读性高而已。

最后还是那句话,请尊重和尝试理解他人判断的标准,我不会无端抱怨一些肤浅的不满,有精力的话可以看看下文:
http://www.keakon.net/article/918
所以不要像个没人要的姑娘缠着甩她的男人一样,哭着问“为什么不要我,是不是我穿得太花哨了,是不是我性格太随意了,告诉我我哪点不好,我去改啊”。你不需要改变自己,只是需要找到欣赏你的人。
Los
2011-01-19 13:00:51 +08:00
我喜欢看一些“哇,这语言这特性很帅,原来可以这样简单的(一个方式)解决这个问题”,
但却实在不喜欢看X语言跟X语言对比的文章,对语言喜好立场不同,作者都会在分析时强加入自己大量的主观意见(这个其实会误导新手,不是好事)。
一种语言可以找到它一百个优点也可以找到它一百个缺点。
每个人的脑袋都不一样,对事物的接受不一样,而选择语言时候,只找好自己的就行。


PS:我是ruby选择者,其实是选择了它整个社区社区的凝聚力当然,语法之类的问题不是问题,这个从来不是难点。
mayokaze
2011-01-19 13:27:06 +08:00
花两年时间学习python,然后用两个月时间自我否定(不含贬义)ruby这很容易做到
就像花三年时间学习c++各种内存管理范式,对于objc的内存管理,只看了个开头就迫不及待自我否定掉一样
交流语言是好的,异见才是交流的价值,我认为技术交流语气有时候过激一点可以理解,相反太过恭谦的讨论无异外交辞令,对事不对人,不记仇就是好的
不过交流的前提是平等,一旦有人把自己提升到上帝视角那么我认为就再也讨论不出什么有价值的东西了
本篇最后一次回复
-完-
lianghai
2011-01-20 00:41:53 +08:00
作为一个旁观者,我挺喜欢 @Los 的观点。
不过,或许大多数人都没能和 @keakon 一起在这个问题的探讨上找到那个让 @keakon 兴奋和感兴趣的共鸣频率。
lilo
2011-01-20 03:27:58 +08:00
我本来很支持@keakon的,以为你只是讲说Python在易读性上比Ruby好。结果我顺着你链接看了你写的那篇为什么选择Python而不是Ruby,我发现你得出的结论是Ruby语言各个方面没有Python好,这我又混乱了。

脚本语言那么多,像Python和Ruby能发展到这么大,我认为很大一个原因是语言本身设计的很好。Python和Ruby都做到了有一个明确的主旨,并完全按照它来进行发展。Python的大家都知道,目标是简洁易读,做任何事情都只有一种方式;Ruby官网上就有一句宣传语,"A Programmer's Best Friend"。Ruby强调的应该是一个有一定水平的程序员编码过程中,通过使用Ruby能够获得精神上的愉悦,可以让你写的很开心,所以他有很多相同效果的函数像size/length给你选,所以几乎用上了所有的符号让你写出自己感觉很爽的代码。

到这个地步其实就是个选择问题。Ruby和Python这两个实在太有代表性了,因为正好是两个方向。再广点说程序语言都是工具,你会的越多就越容易找到最适合你当前问题的工具。单会Python和单会Ruby是一个层次,两个都掌握的一样好那好像就又是一个层次了。

最后,中文论坛里冷静的讨论就是扯淡,无论是在哪里。果断转去Reddit吧。

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

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

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

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

© 2021 V2EX