1
fmfsaisai 2011-01-18 01:26:23 +08:00
优点就是它能做app,别的语言不能做app
|
2
mayokaze 2011-01-18 01:50:57 +08:00
objc对象运行时保有类型元信息,可以动态更改原型等等,而cpp是基于VTable的玩不出一些动态特性
|
3
keakon OP @mayokaze 原以为Objective-C会是很静态的语言,以至于我看category时还在怀疑是不是和JavaScript的prototype差不多的东西。查了下资料后发现本质上确实差不多,但这种运行时绑定的特性估计会让它比C++慢。
初看上去Objective-C 2.0更优秀些,不过推出来也都快5年了,还不能用于iOS开发,估计是性能或内存问题更严重吧… |
4
keakon OP 发现我又扯到性能上去了,实际上还是一个平衡的问题。
例如C++使用虚函数表,看上去应该比动态类型语言的查询更快,但也丧失了覆盖静态方法的能力。再如template虽然提供了很好的性能,但复杂的语法与duck typing相比必然导致开发效率的低下。 不管怎么说,这几十年发展下来,电脑的速度快了不止千倍,人脑的速度和人类的寿命却没有这么明显的增长,所以就让一切更加动态吧… |
6
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。 |
7
keakon OP @jjgod 在wiki上看到这个,难道是运行时还能进行优化么?
http://www.mikeash.com/pyblog/performance-comparisons-of-common-operations.html 关于GC,Android的实现好像粒度很大,而且与此同时必须停下所有线程来跑GC,所以必然会卡住渲染。 不过这些我还是等看完Objective-C的实现再研究吧,目前的问题是你们喜欢它吗,用它的好处是什么? 例如我喜欢Python和JavaScript,从语法上可以找到一堆优雅的地方,写起来也惬意和畅快,性能虽差但足以接受。而Objective-C有什么特别吸引人的地方? |
8
yanyanlong 2011-01-18 12:07:46 +08:00 via iPhone
1楼正解。
|
10
roamlog 2011-01-18 12:27:26 +08:00
编程语言是用来解决问题的, 每种语言都有它的优缺点, 也有它的特定适应领域, 比如 c/c++ 可以 c/s 方面的东西, php/jsp/asp 等一般来说是用来做 b/s 方面的东西, 当然你也拿 php 去写 c/s 也许可以写出那么点东西来, 但肯定不是最佳选择.
每种语言都有它优雅设计的地方, 如果单纯从语法啊语言设计的优美与否而选择学什么语言的话, 那是在做研究. |
11
CupTools 2011-01-18 12:31:15 +08:00
@roamlog 我用PHP写了Nameserver,WebServer(纯静态文件),还有MySQL proxy。反正C能做的事情,PHP理论上都可以做(PHP就是C -.=)
|
12
keakon OP @roamlog 我想你误会我的意思了。
我希望的是语言能帮助程序员减少无谓的coding,避免潜在的问题。所以一开始接触内存管理时就觉得很奇怪,难道编译器自动retain一下会怀孕么? 我不是反对使用Objective-C,毕竟我还没完全弄懂它,没什么发言权。可我想谁都不希望以复杂的方法去做一件简单的事吧。 回到你的观点,那么Objective-C和C++做C/S应用有什么差别呢?是什么让你觉得Objective-C更加适合app开发这个领域。 我也不想扯什么苹果限制只能用它开发app的事,这和语言本身无关。如果苹果当初只允许你用C++写,@fmfsaisai和@yanyanlong是否就觉得C++比Objective-C好了? |
14
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 |
15
keakon OP @Kai 话是这么说没错,web app甚至只要写网页就行了,可是cocoa的原生语言就是Objective-C。
假如是在Windows上开发,你让Objective-C去使用MFC、WPF,我想也不是能不能的问题,而是傻不傻的问题。 所以这种方面的比较根本就不平等,而我只想关注语言本身的优点。 |
18
Kai MOD |
19
keakon OP @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的束缚,更加特立独行一些呢? 我发这帖不是想找语言的岔,我只是想给自己一个学下去的理由,让我知道它还是有很多闪光点的。我纯粹就是想找个玩意打发时间,但我希望不是浪费时间。 |
20
keakon OP 发现一篇好文,Philosophy of Each Language这段大致能解明我的疑惑:
http://www.mactech.com/articles/mactech/Vol.13/13.03/CandObjectiveCCompared/ |
21
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 的运行时库从来不是性能瓶颈,性能问题从来都是出在更高层的框架或者自己的代码上。 |
22
lianghai 2011-01-18 18:06:30 +08:00 via iPhone
这个主题本来就有点怪,加上好多人误解了楼主的意思……结果真是一片混乱。
大概大多数人都没楼主这么较真儿吧。既然 Objective-C 无疑是 Mac OS X / iOS 开发环境下的一等公民,还去讨论一些绝对客观的所谓优缺点,真折腾呀……我逃走了,忽略我吧。 |
23
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." |
24
lesscome 2011-01-18 22:36:59 +08:00
同意 2# 6#
相比较c++,objc更加动态灵活,使得c++里的很多复杂问题简单化。 |
25
yanyanlong 2011-01-18 22:53:47 +08:00
"如果苹果当初只允许你用C++写,@fmfsaisai和@yanyanlong是否就觉得C++比Objective-C好了?"
@keakon 个人觉得语言没什么好坏之分.如果只允许C++那就用C++咯.我现在上班只写PL/SQL 如果你问我什么语言最重要,我认为是英语.(貌似跑题了.哈哈) |
26
keakon OP |
27
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,也该心里有数。 我的看法是能减少工作量的就省,但会导致看上去很生涩的就不该省。这点在初学和向不懂这门语言的人解释时非常重要。 ------------- 打算永远做新手的话当然重要。 |
28
Livid MOD NeXT 当年为什么要用 Objective-C 来构建系统,他们肯定有他们的道理。
我作为用户,我只能跟随他们的这个决定。 我没有用 C++ 写过什么大型软件,所以没有发言权。 在我看来,编程语言只是完成项目的很多个因素中的一个,而且不是最重要的那个。 |
29
chloerei 2011-01-19 00:54:01 +08:00
(Ruby娘,你怎么了!你怎么中枪了!……
LZ还没接触到Ruby的Metaprogramming部分嘛 http://book.douban.com/subject/4086938/ 语法什么的只是长相, 我和Ruby交往两年才发现她的内涵跟别的姑娘有什么不同。 |
30
mayokaze 2011-01-19 01:16:25 +08:00
@keakon ruby是批着smalltalk皮的lisp,请深刻理解这句话,至于你列出这些特性以此证明ruby不直观,我只能说"呵呵"了.
@Livid 我没记错的话OBJC是当年没法选smalltalk才退而求其次的选择. 另外对我来说编程语言不只是拿来完成项目的工具. @yanyanlong 语言当然有好坏,这跟什么语言可以用来干什么事无关,"所有命令式编程语言都是图灵完备,所以大家都一样"这种说法我认为才是不负责任的. |
31
keakon OP @ssword 我并没否定Ruby这门语言,前面已经说了,它有我欣赏的地方,但也有我不喜之处。我花了半个月时间去学习它,最终还是觉得有更适合我的语言,仅此而已。
感情这东西本来就是主观的,每个人都有自己的理解,我不喜欢你喜欢的歌手,你多半并不会为此感到受伤和中枪。 那个“2天”并不是“学完”,而是尝试了解整个语言的概览。要说完整的学习过程,C++我花了3年,然后停滞了。Python学了2年,仍在继续。可在有所了解之后,往后的学习过程都只是慢慢去深入和拓展而已,我并未在此过程中对某门语言有颠覆性的认识和看法。换句话说,第一印象是很难颠覆的。 语言可以有特性,但我不喜欢晦涩的特性。列表里很多Ruby的特性我没列出来,因为我确实喜欢,例如block,所以你应该看得出什么是我不喜的。 是否新手和我的看法无关,我讨论的是语言是否直观,最直观的当然是自然语言,无需解释。如果一门语言能很容易地让外行人看懂,这便说明它直观。 举例来说,C++中类的成员默认就是私有的,可我看到过的大部分代码规范里都要求显式地写上private关键字。我想基本上初学者也知道它是私有的,可为什么要写上它呢? 同样,你写不写注释对编译器来说完全不在乎,可你为什么还得写上? 换句话说,与其让其他人剥夺我肆意撒野的权利,我宁愿一开始就不给我这个自由。Ruby尝试着去满足更多人的需求(里面能看到不少语言的影子),这或许是很多人喜欢的,但很可惜这种大杂烩不是我想要的。但这只是我喜不喜欢的问题,没有碍着你喜欢的自由。 Lisp并非不直观,相反它很容易懂。真要举例的话应该是perl,充斥着大量的符号,尝试理解它经常会浪费数十分钟的时光。 @Livid 查资料没查出来,只说是把C改造成能用smalltalk风格的对象,也就是消息传递方式吧… 具体有什么好处并不清楚,我还是自己研究吧,问别人总会惹来不必要的争执,倦了。 |
32
Los 2011-01-19 02:32:52 +08:00
作为旁观者,至现在V2EX给我的感觉似乎不是很适合的深入讨论编码型的技术,探讨性的技术问题很容易给强制改变为对立性问题,而且,这里深入技术层次的人应该不多,更多应该是设计型的人员。
|
33
ssword 2011-01-19 03:07:00 +08:00
@keakon 笑~是否直观也是个主观的问题呢。既然强调“第一印象”,大段大段的文字也很无力。反正我都有第一印象了,我觉得不直观就是不直观。这很无敌的。
“换句话说,与其让其他人剥夺我肆意撒野的权利,我宁愿一开始就不给我这个自由。” 这样该喜欢haskell吧?放心,那种程度的强类型压根不给你撒野的机会,不过我怀疑你能否花两天时间学个大概,不过你可以保证在两天内判断出自己是不是喜欢它,再留一个新的“第一印象”。 “Lisp并非不直观,相反它很容易懂。”你列的1,2,3,5让ruby中枪的同时也让lisp中枪了。另,我一直很好奇说“lisp可读性高”的同学到底有写过多少lisp代码,如果有同学能给出数据的话不胜感激。 “最直观的当然是自然语言,无需解释。” 错,自然语言有二义,形式语言没有。 因为有强大的“第一印象”所以解释毫无必要,上帝的归上帝凯撒的归凯撒,over。 ps: 这贴进水深火热的话我会很开心的。 |
34
mayokaze 2011-01-19 03:11:07 +08:00
1.函数默认返回最后一句表达式 //ruby并不碍着你多打一个return
2.if、case之类的语句也是表达式,并且有值 //是否C里面赋值表达式有返回值也不够直观?嗯,ruby也没碍着你写成python那样 3.$、@、@@、=、?、!之类的变量名 //前三个无解,这是为不声明直接使用付出的代价,你当然可以认为强制声明和强制写self是更先进的方式,后三个你可以自行规避. 4,5 这只是快捷方式,你同样可以选择你认为更直观的另一种编码风格. 一条条看下来好像除了第三条其他都不是问题啊,莫非要别人所有人编码风格都一样才算是直观? 关于ruby的讨论最后总要归于"太方便了,我不习惯""太灵活了,所以不好""特性太丰富了,不够直观""范式太多样了,难以阅读". |
35
keakon OP @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 所以不要像个没人要的姑娘缠着甩她的男人一样,哭着问“为什么不要我,是不是我穿得太花哨了,是不是我性格太随意了,告诉我我哪点不好,我去改啊”。你不需要改变自己,只是需要找到欣赏你的人。 |
36
Los 2011-01-19 13:00:51 +08:00
我喜欢看一些“哇,这语言这特性很帅,原来可以这样简单的(一个方式)解决这个问题”,
但却实在不喜欢看X语言跟X语言对比的文章,对语言喜好立场不同,作者都会在分析时强加入自己大量的主观意见(这个其实会误导新手,不是好事)。 一种语言可以找到它一百个优点也可以找到它一百个缺点。 每个人的脑袋都不一样,对事物的接受不一样,而选择语言时候,只找好自己的就行。 PS:我是ruby选择者,其实是选择了它整个社区社区的凝聚力当然,语法之类的问题不是问题,这个从来不是难点。 |
37
mayokaze 2011-01-19 13:27:06 +08:00
花两年时间学习python,然后用两个月时间自我否定(不含贬义)ruby这很容易做到
就像花三年时间学习c++各种内存管理范式,对于objc的内存管理,只看了个开头就迫不及待自我否定掉一样 交流语言是好的,异见才是交流的价值,我认为技术交流语气有时候过激一点可以理解,相反太过恭谦的讨论无异外交辞令,对事不对人,不记仇就是好的 不过交流的前提是平等,一旦有人把自己提升到上帝视角那么我认为就再也讨论不出什么有价值的东西了 本篇最后一次回复 -完- |
38
lianghai 2011-01-20 00:41:53 +08:00
|
39
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吧。 |