Chinaunix

标题: 每个程序员都应该学习使用Python或Ruby,你怎么认为? [打印本页]

作者: 无风之谷    时间: 2012-04-26 15:40
标题: 每个程序员都应该学习使用Python或Ruby,你怎么认为?
本期小话题:每个程序员都应该学习使用Python或Ruby,你怎么认为?

话题奖励:《梦断代码》五本。

如果你是个学生,你应该会C,C++和Java。还会一些VB,或C#/.NET。多少你还可能开发过一些Web网页,你知道一些HTML,CSS和JavaScript知识。总体上说,我们很难发现会有学生显露出掌握超出这几种语言范围外的语言的才能。这真让人遗憾,因为还有很多种编程语言,它们能让你成为一个更好的程序员。

■跟C/C++/Java相比 — Python/Ruby能让你用少的多的多的代码写出相同的程序。有人计算过,Python或Ruby写出的程序的代码行数只相当于相对应的Java代码的行数的五分之一。如果没有绝对的必要,为什么要花这么多时间写出这么多的代码呢?而且,有人说,一个优秀的程序员能维护的代码量最多是2万行。这不区分用的语言究竟是汇编,C还是Python/Ruby/PHP/Lisp。所以,如果你用Python/Ruby写,你一个人干的,不管是干什么,如果换用Java/C/C++,那都需要一个5人的小团队来干。
■跟VB/PHP比较 — 跟PHP/VB相比,Python/Ruby的是一种从设计上讲比它们好的不知多少倍的语言。PHP和VB分别是在开发网站和桌面应用程序上非常流行的语言。它们流行的原因是非常的易学。不懂计算机的人也很容易的上手。如果你用这些语言开发过大型的项目,你就会发现这些语言的设计是如此的糟糕。是朋友,他就不会劝你使用PHP/VB。
■跟Lisp/Scala/Haskell/Closure/Erlang相比 — Python/Ruby跟它们比起来显得相当的“主流”。确实,这些语言每种都有其很酷的特征,对于高级编程人员,了解这些语言能给他们对编程的思考带来实际的提升。但这些应该在你以后的职业生涯中才去决定学哪一两种。对于现在,Python/Ruby是在语言功能和实际运用之间平衡后的更好的选择。
■跟Perl相比 — Python和Ruby都受恩于Perl,在这两种语言异军突起前,Perl是最好、最大的一种动态语言。但现在,Perl已是明日黄花,越来越多的人转向Ruby/Python。我感觉Perl的面向对象机制有点做作,很不好用。通常认为,Perl一种比较难学的语言,因为它提供你了太多不同的方法去完成同一个任务,它的语法有点像密码,非常不直观 — 除非你对它掌握的非常好。总之,我感觉Perl是一种对于学生来说不是很合适的语言—除非你有特殊的理由去学它(例如,你有很多正则表达式要处理,这是Perl的闪光点)。
■跟sh/sed/awk/bash相比 — 如果你使用Linux/Unix,你可能需要做一些shell编程,甚至会编写一些不小的程序。但是,对于这些语言,一旦程序达到一定的行数,事情就会开始变得让你痛苦不堪,你最好是用Python去做这些事情。当然,做这种事情,Perl是最好的选择,Python排第二。(Ruby对于系统shell脚本不是很合适)。

你可以在Google上搜一下“为什么X比Y好” — 其中把X换成Python或Ruby,把Y换成另外一种语言 — 你就会发现,有无数的文章来说明它们为什么这么好。

如果你有选择你的毕业设计使用的编程语言的自由,你应该选择Python或Ruby,它们能让你在开发项目的过程中节省一半的时间(除非你要开发的是移动应用,这样你必须要使用Java或Objective-C)。

下面是xkcd上的一幅漫画,告诉你掌握Python后你会变得多么的强大:



文章转自:外文IT评论

作者: bruceteen    时间: 2012-04-26 15:42
除了 asm / c / c++ 其它都不会,也不想会
作者: zhaohongjian000    时间: 2012-04-26 15:56
应该会一门比较陈手的脚本语言,python和ruby都是不错的选择,但不见得一定是这两个里面选一个。
作者: 兰花仙子    时间: 2012-04-26 16:03
支持ruby,它的语法的确不错。
作者: ecjtubaowp    时间: 2012-04-26 16:31
python吧,很强大。
作者: wch100    时间: 2012-04-26 17:02
正在打算学学python,不知怎么入手,望各位牛人指点。。。
作者: tempname2    时间: 2012-04-26 17:34
回复 2# bruceteen


平时日常电脑使用中偶尔需要自己写程序来解决问题,这时会一两种脚本语言就很爽了。
作者: fergon    时间: 2012-04-26 17:58
已经给c++折磨的死去活来了,真的要学习python吗?
都说语言的本质是共通的,如果python能清晰地反衬出c++的一些基础概念,我倒是很愿意去学它。
但是,对于一些声称易学易用的语言,我是常怀戒心的,simple & easy 的表面下,其实是暗示你要具备了大量而必须的基础。想当年C语言也是“优雅而简洁”而著称的,但是后来如何?“拿着剃刀在滑冰场上跳舞” “拿着绳子去上吊” “到处充满陷阱"... 嘿嘿,现在还有人说C语言好学、容易的吗?
           

作者: yahoon    时间: 2012-04-26 18:28
本帖最后由 yahoon 于 2012-04-26 18:29 编辑

看用途了吧
web开发就国内而言肯定还是php最多
C,C++是系统级别的开发多
java是web service及企业级应用多
shell,powershell等脚本语言是运维用的多
至于perl,python,ruby 新兴的多用途胶水语言, 很热门,但是前途还很难说
正如现在的erlang 刚开始火,谁知道呢

至于学习应该不是门框,一通百通无非是变量,函数,类,库,框架如此而已
作者: sunny7476    时间: 2012-04-26 21:16
第一个正式学习的语言就是Python,这里的“正式学习”是指真正开始用一门语言做东西,在学校里开了《XXX程序设计》一门课并去上了但没自己做东西不算。

先发点牢骚吧。大环境所致,用Python做东西,别人会说你不“正统”:
情节1:
“我要用Python写程序”
——“厉害的程序都是C/C++写的,。。。(此处不宜显示,省略)”。
“做相同的事情,Python用的代码比其他语言要少,能节省时间”。
——“年轻人不要怕吃苦,光想着偷懒”。

情节2:
“我这是Python写的,来学吧,Python会节省大量的时间!”
——“哦,我看看,。Python安装哪个版本啊?”
“先用2.7的”
——“……@#¥%……(安装中)没有像C#一样的官方IDE啊?”
“IDE只是个工具,(解释。。。)”
——“Python用到的库都要自己配,怎么界面还不能拖出来,还有那么多“界面库”(某位同学是这么称呼的)工具,选哪个啊?”
“有Python自带的tk,还有wxPython、PyQt、PyGTK。这些都有各自的所见即所得的界面设计工具”
——“什么乱七八糟的,不玩了,去看我的C#去。。。”

情节3:
(碰到一个用Python的,先聊了一会。。。捧了下Python)
——“你是用什么框架的,Django?”
“我是用Python做桌面的”
——“Python的长处是做网络的啊,做桌面的速度多慢啊。”
“(沉默,不知道怎么回答)”

     当然,这跟我处的环境有关,我一般接触不到纯粹以写代码为工作的人。而是一些为了完成一些目标,用一些程序来实现,看这些目标能否实现。他们认为,无法快速“拖”出窗口的语言,就不是简单易学的语言(微软“害人不浅”啊)。

    接触到Python的人,都会听说Python的代码量少,尽管Python的教材上有了暗含的例子,可是并没有直观的印象。这里就贴一段比较代码吧(Wiki上找到的,根据“合理引用“规则引用,版权归Wiki所有)。
归并排序的,C++代码
  1. void Merge(int a[], int b[], int low, int mid, int high)
  2. {
  3.     int k = low;
  4.     int begin1 = low;
  5.     int end1 = mid;
  6.     int begin2 = mid + 1;
  7.     int end2 = high;
  8.     while(begin1 <= end1 && begin2 <= end2)
  9.     {
  10.         if(a[begin1] <= a[begin2])
  11.             b[k++] = a[begin1++];
  12.         else
  13.             b[k++] = a[begin2++];
  14.     }
  15.     if(begin1 <= end1)
  16.         for(int q = begin1; q <= end1; q++)
  17.             b[k++] = a[q];
  18.     else
  19.         for(int q = begin2; q <= end2; q++)
  20.             b[k++] = a[q];
  21. }

  22. void MergePass(int a[], int b[], int seg, int size)
  23. {
  24.     int seg_start_ind = 0;
  25.     while(seg_start_ind <= size - 2 * seg)
  26.     {
  27.         Merge(a, b, seg_start_ind, seg_start_ind + seg - 1, seg_start_ind + seg * 2 - 1);
  28.         seg_start_ind += 2 * seg;
  29.     }
  30.    
  31.     if(seg_start_ind + seg < size)
  32.         Merge(a, b, seg_start_ind, seg_start_ind + seg - 1, size - 1);
  33.     else
  34.         for(int j = seg_start_ind; j < size; j++)
  35.             b[j] = a[j];
  36. }

  37. void MergeSort(int a[], int size)
  38. {
  39.     int* temp = new int[size];
  40.     int seg = 1;
  41.     while(seg < size)
  42.     {
  43.         MergePass(a, temp, seg, size);
  44.         seg += seg;
  45.         MergePass(temp, a, seg, size);
  46.         seg += seg;
  47.     }
  48. }

  49. int main()
  50. {
  51.     int a[] = {3, 5, 3, 6, 4, 7, 5, 7, 4};
  52.     MergeSort(a, sizeof(a) / sizeof(*a));
  53.     //输出
  54.     for(int i = 0; i < sizeof(a) / sizeof(*a); i++)
  55.         cout << a[i] << ' ';
  56.     cout << endl;

  57.     return 0;
  58. }
复制代码
对应的Python代码:
  1. def merge(l1,l2):
  2.     final=[]
  3.     while l1 and l2:
  4.         final.append(l1[0] <= l2[0] and l1.pop(0) or l2.pop(0))
  5.     return final +l1 + l2
  6. def mergesort(List):
  7.     mid=int(len(List)/2)
  8.     if len(List)<=1:return List
  9.     return merge(mergesort(List[:mid]),mergesort(List[mid:]))
复制代码
代码量的多少一目了然。
正如同楼主所说,关于Python和其他语言做比较的文章在Google上一大把,这里就不细说了。
就那一句:Python的确能节省你很多时间!!!

最后,还有一个小小的希望:希望PyPy能火起来。。。

作者: lkk2003rty    时间: 2012-04-26 23:10
其实会一些脚本还是很有必要的有时候用用它做些简单的工作能起到事半功倍的作用
ruby不会 觉得py挺好的至少 缩进的控制会让人养成注意格式的好习惯

作者: miao122333    时间: 2012-04-27 00:26
我学计算机的,单是程序编程都是英文,我又英语底子差,烦啊
作者: ooooldman    时间: 2012-04-27 09:36

  为什么。我支持 perl
作者: 无风之谷    时间: 2012-04-27 09:40
回复 13# ooooldman


    看到LZ的头像,怀念犀利哥。
作者: ecjtubaowp    时间: 2012-04-27 09:52
sunny7476 发表于 2012-04-26 21:16
第一个正式学习的语言就是Python,这里的“正式学习”是指真正开始用一门语言做东西,在学校里开了《XXX程序 ...


这个C++写的归并排序也太长了,根本没必要这么长,至少写出来不会比python多太多。
作者: 瀚海书香    时间: 2012-04-27 10:26
本帖最后由 瀚海书香 于 2012-04-27 10:27 编辑

回复 1# 无风之谷
个人认为一个优秀的程序员,不过你是搞C的,还是搞C++的,还是asm的。都应该掌握一门脚本语言。
虽然你可能不会用它实现你的核心功能,但是使用脚本写一些测试用例或者对执行效率要求不高的地方还是非常方便的。
至于是那种脚本语言其实是次要的,当然非要分个优劣的话,个人的排名顺序是:
ruby,python,perl。之所以把ruby排在最前面,主要的ruby这门语言学起来非常方便,而且有大量的类库可以使用,另外就目前来说,ruby的活力应该是最旺盛的一个,当然跟这门语言相对来说比较新有关。python的优点在它庞大的类库上,而且数量比ruby的还要多。perl是一个比较传统的语言了,最近几年的发展有点缓慢。

   
作者: is03wush    时间: 2012-04-27 10:39
可惜python的IDE不怎么好用
作者: googny    时间: 2012-04-27 11:24
语言就是一把刀,内功深厚的高手,用树叶都可以杀人。
作者: 羲之遗韵    时间: 2012-04-27 11:47
perl是一个比较传统的语言了,最近几年的发展有点缓慢。

这就是你把perl排到最后的原因么?
作者: qq410029478    时间: 2012-04-27 12:26
这个题目注定要引来无数口水
应该改成"每个程序员都应该学习使用几种脚本语言"
编译型语言通常用来制造软件,脚本语言通常是用来使用软件
脚本语言有很多种,不仅包括Python、Ruby这样的通用编程语言,还包括很多特定领域的脚本语言,根据需要或兴趣去熟悉、掌握一堆脚本语言是每个程序员都应该干的事。
脚本语言都很容易调试,适合“边学边用”的学习模式,如果觉得不好或不适合自己,随时可以停。

作者: Reallsc    时间: 2012-04-27 12:26
那么如果想学Python或者Ruby,哪位朋友可以推荐几本好书啊?
我想学一点Python,因为以后的产线测试可以做一些自动化方面的工作。
那本以大蟒蛇作为封面的书,看过一部分,觉得写得太基础了。倒是适合没有计算机基础的人作为编程语言入门书。
国内的情况大多数,还是从C/C++学起,Python的初学者一般都是有一定编程基础的人,那么这种情况下该看什么书呢?
作者: qq410029478    时间: 2012-04-27 12:27
回复 18# googny


    大侠,醒醒,天亮了,把天龙八部从脸上拿下来吧
作者: starwing83    时间: 2012-04-27 12:51
很好……终于有个不是陈良桥的讨论了……我都快受不了了……

嗯,最近收到了Python科学计算,觉得很爽哈。Python的库的确很多,接口设计的还是挺不错的。不过这里还是要说明一些问题。

首先,Python和Ruby。我认为是属于某种“工业语言”或者“功利语言”的,在还没有功利的学习阶段就接触他们是不会太好的。一来,Python会让你很容易做出一些东西,却是通过别人写的模块去做出来的,这就意味着还是学生的你会变得很自满,会觉得自己好像会很多东西,但是底层到底怎么实现的你却不清楚。我自己的求学阶段看到了无数这样的例子,手上拿着一本《黑客X档案》,啥都能干,可是都是工具,缺了工具箱就啥都不是了那种。学习阶段的时候,千万别接触这样的功利语言,它会让你变得浮躁。用修真的例子来说,这就是可以增加功力的仙丹,但是如果你道行不够,法力再高也是没用的。境界依然提不上来。

如果是学习阶段,我建议学一些“无法立刻出产品”的语言。这些语言能让你沉下心来去学习。我真的觉得现在的学生太过于浮躁了。天天说“这个语言能做啥啊,学他干什么”,当然了解学习一门语言可以做什么是很好的。但是仅仅因为这门语言可以做什么就去学习,我觉得是浮躁的。最好的办法还是学习有启发性的语言。比如Scheme(配合SICP)、Haskell(可以锻炼自己的毅力,接触全新世界)、Lua(领略优美设计)等等语言。

这里倒不是说不去学Python/Ruby,他们毕竟是工业语言。当你参加工作了,有了压力了,你可以用这些语言进行快速的开发。但是这个时候你已经不是出于炫耀的目的去学习了,你是胸有成竹地去使用它。这才是正确的道路。

我希望学生们不是因为import foobar而fly起来,而是因为领略了foobar在设计上的精妙而fly,至于import,等到工作的时候再说吧。
作者: sunny7476    时间: 2012-04-27 13:49
回复 15# ecjtubaowp


    恩,谢谢指正,本代码转自wiki,代码我也看了,是多了一点,但即使简化一点也还是Python的两倍以上。
作者: OwnWaterloo    时间: 2012-04-27 13:54
回复 21# Reallsc

蟒蛇……  一开始以为是《Dive Into Python》: http://book.douban.com/subject/1440658/  400页……
原来是这本: http://book.douban.com/subject/1915868/  差点就1600页…… 这是闹哪样……

试试这个 —— 《A Byte of Python》: http://www.swaroopch.org/notes/Python
2.x与3.x都有,中文翻译也有(自己问谷娘要……)100页多一点点。

之后就以: http://docs.python.org/  (替换成你需要的python的版本)为主线。
用: http://www.python.org/dev/peps/  来着重了解各种被堆积起来的特性的产生动机。
有其他疑问就问谷娘,毕竟python还不算冷门,资料很多。

那些大砖头的书,讲实践的部分难以恰好符合自己的领域(能匹配当然最好),讲语言的部分差不多就是从上面列举的地方东抄西抄,不够原汁原味。

作者: slucx    时间: 2012-04-27 14:30
starwing83 发表于 2012-04-27 12:51
我认为是属于某种“工业语言”或者“功利语言”的,在还没有功利的学习阶段就接触他们是不会太好的。


真说到我心里了啊……
作者: 瀚海书香    时间: 2012-04-27 14:51
回复 19# 羲之遗韵
perl是一个比较传统的语言了,最近几年的发展有点缓慢。

这就是你把perl排到最后的原因么?

呵呵,个人的看法

   
作者: starwing83    时间: 2012-04-27 15:00
回复 25# OwnWaterloo


    OW你要加紧回帖哦,《梦断代码》这本书还是蛮好的,可以当做小说看,我记得我当时在书店就靠着书架看了一下午,绝对比得上某些YY小说了,看得人很兴奋的,哈哈~~我就是冲着这个来回帖的,嘎嘎。
作者: Sevk    时间: 2012-04-27 18:19
提示: 作者被禁止或删除 内容自动屏蔽
作者: OwnWaterloo    时间: 2012-04-27 19:23
回复 28# starwing83

《梦断代码》是《dreaming code》吧?与python/ruby没关系的吧……
为什么讨论python/ruby得梦断代码……


如果有机会这书我也想顺手收藏啊,所以你鼓动我回帖对你没好处……


我倒是想回帖的,但要说服他人是件很难很难的事。
对不愿意相信的人,是不可能完成的任务。
对愿意相信的人,那是他本来就愿意。

作者: Sevk    时间: 2012-04-27 20:47
提示: 作者被禁止或删除 内容自动屏蔽
作者: sunny7476    时间: 2012-04-27 21:04
回复 31# Sevk


    代码是引自wiki上的,复制时也没发生错误。所有代码都亲测可行。请阁下指出错误在哪。
作者: Sevk    时间: 2012-04-27 21:32
提示: 作者被禁止或删除 内容自动屏蔽
作者: pmerofc    时间: 2012-04-27 21:33
提示: 作者被禁止或删除 内容自动屏蔽
作者: walleeee    时间: 2012-04-27 22:09
唉,又是语言贴
作者: wsxedcer    时间: 2012-04-27 22:47
回复 4# 兰花仙子


    仙子 都 不管 perl 了,跑 python 和 ruby 去了{:3_188:}
作者: walleeee    时间: 2012-04-27 23:26
回复 25# OwnWaterloo


讲实现原理的补充一本《python源码剖析》,中文python社区人写的,该书还有一个开源Python调试器项目
作者: walleeee    时间: 2012-04-27 23:33
回复 10# sunny7476


    我也希望pypy能持续生长
作者: 无风之谷    时间: 2012-04-28 08:49
回复 30# OwnWaterloo


    哈哈 是的,《梦断代码》读起来跟小说似的,蛮有意思的,虽说跟python ruby 无关吧,还是希望能送给网友读一下。
作者: yahoon    时间: 2012-04-28 11:23
回复 39# 无风之谷

看了前面的发言,感觉跟主题没太大关系

我觉得大部分的"程序员"(这里不是指我这类以ops为业,写着玩的选手)大学学习基本是以(C,C++,JAVA)入门的,说实在的,他们的学习门槛较高(相比Ruby,python等),而且上手的周期很长,基本上你看完C语言程序设计你也无法写出一个有完整功能的应用(例如GUI)

所以我觉得如果是程序员,资深的,看过数据结构,算法设计的,都是希望了解底层的实现的.

至于python和ruby我倒不觉得一定要学,我hw的同学曾经说他们部门某哥们只对tcl特别nb而成为明星.

要学的语言那么多, 对每个应用场景都不一样,例如现在写app,object-C用的多,那就多看本专业相关的趋势

别学嘀咕,哪个热追哪个,最后就是四不像了

python,ruby现在也只是炒的, 淡定


   
作者: starwing83    时间: 2012-04-28 11:33
回复 30# OwnWaterloo


    好吧,那我就只好自己来了……继续讨论一下Python和Ruby,当然还得带上《梦断代码》

最近在写一个Lua的模块,感觉一下子悟到了很多。现在的软件开发都是所谓的”黑盒子“,所谓的”模块封装“。包括Python在内的很多语言都是基于这一点来设计的。可是问题是,目前我只看到函数式设计能真正的”完全封装“,OO其实是不行的——你必须要发送消息,去和其他元素互动。而函数式是连时间在内可以把所有的部分都封装掉的。换言之,一个统一的封装界面可以操纵全部的细节,而这一点非函数式语言很难做到。

所谓的黑盒子,其实不是全黑的,它必须要有接口,一个复杂的模块,会导致接口极难设计,你需要暴露足够多的细节以满足所有的要求。一个简单的例子是ADT,要产生一个ADT你可能得调用ADT_t *ADT_new();但是这意味着没有暴露分配接口、同时也会导致ADT系统内的内存分配(而这和ADT是没有关系的),在积木原则里面,这种”没有关系“的细节理应抽出积木,但是在这里是不好抽出的。要抽出:ADT_init(ADT_t *adt);,你必须要暴露ADT_t的实现细节,或者至少是要暴露ADT的大小和对齐还有stride等等信息,这样的封装最终导致的结果是接口越来越难设计,或者是干脆无法满足具体的要求。封装本身是导致性能下降的一个主要因素,而且也有可能导致维护性的降低,南辕北辙。

解决方案是什么呢?是类似Python/Ruby式的方案:脚本语言提供平台,写很薄(比我以前想的还要薄)的抽象层单纯用于同步脚本和非脚本。是的,仅仅是同步,并不是封装。封装是由两边自己来决定的。这样的设计可以让脚本层面和底层层面都变得很好写。也就是说,好的软件设计不再是”积木式“或者”黑盒式“的,而是”层“状的。你可以暴露足够多的细节,也可以不暴露任何细节,你只需要从一个单纯的source获取数据,然后处理交给sink即可。也可以是双层的。这样不算是”盒子“,倒可以说是管道。我觉得初学者,特别是学习期的人用这种思想(而不是所谓封装、黑盒神马的)去思考问题,设计模块会更简单。关键还是在于上层和底层更加mix的交互。
作者: starwing83    时间: 2012-04-28 11:41
回复 30# OwnWaterloo


    不提说服,我们只讨论一下如果(我是说如果)你想要脚本语言进行设计(不只是Python/Ruby),要注意(或者学习)一些什么东西吧。这也是切题的对不对?

加油加油,我们都搞一本收藏好了~~
作者: starwing83    时间: 2012-04-28 11:42
回复 35# walleeee


    我们可以把预言贴变成非预言贴嘛 这里2b少(目前为止)怕什么
作者: wangsuyi640    时间: 2012-04-28 13:03
语言嘛,到底哪个好哪个坏,哪个更优,哪个更有必要学,每个人的想法肯定都是不一样的。
按照咱党的理论来讲,就是不同阶级有不同的立场。更何况我们这些程序员呢?(就跟以前的文人一样酸气都很重)

干着不同的工作,写着不同的Code,总感觉自己用的最好的(谁不感觉自家的孩子好呢?)。

本人做为一个Cer(嵌入式), 还是对python很是推崇的,从在学校起一直在用。 不敢诳论其功能性有多强,但是至少其实用性还是很强的,不管是在windows还是Linux(资深SHELLer你可略过)中,能方便你很多工作。这也是大多脚本语言的优势所在吧。

其实现在很多程序员排他性很重,想我学了这个,已经能解决问题了,为什么还要知道那个? 确实,语言这东西都是相通的,会了一个,其他都是触类旁通的,你尽可以有你的坚持。

但python相对其他语言来说还是比较容易上手的,如果你想在这里谈论它的好坏,建议你不妨先试试它? 或许一见钟情呢?)
作者: walleeee    时间: 2012-04-28 14:48
回复 43# starwing83


也是。这个也算是比陈二货好多了。
作者: OwnWaterloo    时间: 2012-04-28 15:03
回复 41# starwing83


嘿嘿,貌似你现在也偏向"其实不必像OO(你研究的论文里那种)那样绝对封装"了嘛
也不必层层紧锁。

至于size/alignment/stride,这种机械的细节我觉得还是应该交给工具去搞,比如有考虑这个问题的语言。
不过C一开始就把最后一个丢了,C++也没有加上,而其他还会考虑到如此底层的语言就很少了。。。

作者: OwnWaterloo    时间: 2012-04-28 15:05
回复 42# starwing83

我也这样想,也准备这样做。
但在某口水战中消耗了过多的精力……
估计得五一后了……

作者: OwnWaterloo    时间: 2012-04-28 15:07
回复 39# 无风之谷

没别的意思,就是有点好奇问一下
因为听《软件随想录》——这书还是CU送的  ——里提到《梦断代码》其实是一个悲催的真实故事
作者: 无风之谷    时间: 2012-04-28 15:11
回复 48# OwnWaterloo


    确实是一个很悲催 很悲催的 真实故事。。
作者: AD8018    时间: 2012-04-28 16:20
OwnWaterloo 发表于 2012-04-28 15:07
回复 39# 无风之谷

没别的意思,就是有点好奇问一下


http://snowman.blog.51cto.com/307956/80194

Chandler!!貌似去年还抓来用的,不太好用,
远没Pim Essential好用。对我来说,不晓得它怎么回事,明明就是个SunBird嘛,搞那么庞杂难用。

反正就是很CodeBlock的感觉,大而不精。


作者: 千年老狼    时间: 2012-04-28 17:09
回复 34# pmerofc


    python解毒?
作者: OwnWaterloo    时间: 2012-04-28 17:52
回复 50# AD8018

关于梦断那个软件,还有类似codeblock这样的东西。
我自己,怎么说呢…… 也有一种恐惧…… 功能、需求、实现等等复杂到一定程度之后该怎么办。。。
尤其是梦断提到那种"大构想、全功能"的软件,更是容易让复杂的超出控制。。。 心慌。。。


PS:虽然与python/ruby无关,至少与梦断代码有关。。。 应该不算完全歪楼吧。。。
再PS:这个应该不是你的博客吧?

作者: AD8018    时间: 2012-04-28 18:02
回复 52# OwnWaterloo

我的博客在CU,只是为了给另一个产品增加链接 保密

言归正传,关于恐惧,的确有的,
现在也越来越不愿追求可移植性,
按里程碑式能出一版又一版的产品,就是最希望做到的。无论给自己还是客户,都是减少开发疲倦的好办法。
作者: googny    时间: 2012-04-28 18:04
回复 22# qq410029478
   不懂你在说啥。


   
作者: _Rayx    时间: 2012-04-29 09:33
每个程序员都应该学习使用Python或Ruby,你怎么认为?

python是一门强大的语言,现在发展也非常快,语法简法,通谷易懂,一个从没学过python的人看到python代码的时候很大部分都能知道这段代码是做什么的,不像perl语法迷宫一样,很可能连自己写的代码都不能知其意。这与其设计哲学里的“简单”相符。

学习python能让人有一种做什么事都应当简单化的思想,在C/C++系的语言里语法的简洁性确实不能与python相比,不过它们也有着自己的优点,如灵活,效率。据我了解也有不少公司在使用python了,如测试方面,自然语言处理等等。

在学校的时候(至少国内的学校)是这样,一般教的只有C/C++,JAVA,多的一门可能是C#,其余专业可能教的是VB,只可能在教linux的时候教一下shell编程。学习python/Ruby/Lisp这些都差不多算是课外学习了,所以其在学校的认知度并不算太高。而进入工作后,没有必要,相信学python这类语言的人也少。

而学习python确实能给人耳目一新的感觉,当然前提是你没接触过类似的语言。可能别的语言很长一段代码才能表达的用python一句话就搞定了,真的就是“简单”。但我并不认为所以有一定要学python/Ruby. 首先最重要的还是项目,项目使用什么好,就学习什么。随着能力的提高,想接触一门新的语言思想了,很推荐学习python,学习它的设计哲学,并将其哲学带入其它语言中,所谓要”精一懂三“吧,精通一门语言,懂其它三门不同的语言。

对于ruby不太了解就不评判了,不过既然这里将python/ruby放在一起,估计就是相通的。

作者: 铸道的汉子    时间: 2012-04-29 17:54
java也不错啊
作者: Shell_HAT    时间: 2012-04-29 19:26
学习Python中...
作者: _Rayx    时间: 2012-04-30 13:27
在学习了除C系语言之外的语言,看到不同的语法,对自己提高也挺有帮助的。
作者: xiangziluotuo    时间: 2012-04-30 18:04
看到高手们对语言理解这么深刻,只好来凑个热闹了。。。
作者: starwing83    时间: 2012-04-30 23:28
回复 58# _Rayx


    我必须要说明一下,学语言绝对不是学习“语法”,而是“对语法的选择”。比如什么是函数式语言呢?说白了,就是“不提供赋值操作”的语言。对语言侧重点的理解偏差,是语言学习者乃至语言书籍编写者(@陈良乔)的一个重大的困难。事实上,语言本身,和语言的“实现”,是完全不相关的。C语言和VS2010、Python和CPython乃至Jython,都是不相关的。语言讲究的是“取舍”,是对特性集合的选择,而语言实现讲究的是“理解语言的选择所代表的含义,以提供高效的实现”。

举个例子,为什么函数式语言不提供“赋值”呢?原因很简单,如果提供赋值,下面的语句:

  1. a = b;
  2. b = a;
复制代码
的两行就必须按照这个顺序去写,否则含义不一样,上面的写法是b = a = b; 即让a的值与b相同,如果写成:

  1. b = a;
  2. a = b;
复制代码
含义就会变成b = a,即让b的值与a相同,完全相反了。

函数式设计者发现,赋值是唯一一种因为语句的顺序改变,而导致程序的含义发生变化的语法构造(自加,自减本质上其实都是赋值),于是他们去掉了赋值,所得到的是语言构造不因写作的顺序而发生含义改变

注意到,这其实也是OO的目标之一(在不修改程序,仅仅追加组件的情况下,扩充程序),这也是OO会倾向于加入函数式方法的一个原因。另一个原因是,函数式为了能够在省略赋值之后,依然能够表达各种(特别是变化的)程序结构,发明了很多极其内聚和通用的操作。这也是所谓“函数式复兴”的原因之一。

学习语言,并不是一个摸索过程,摸索过程应该仅仅出现在学习第一门语言中,学习语言,应该是一种“印象”过程。你对Python的印象是什么?会极大地决定你会怎么去用Python,本质上让自己对语言的理解,和语言设计师们对语言的理解相同,这就是学习语言的过程,陈良乔先生明显没有理解到这一点,而是采取特别具象的方式,以及特别主观的方式去教育语言,而这是不行的。

前文已经说过了,Python倾向于“优美”(做一件事情只有一种方式),而Ruby倾向于“自由”(程序员可以做到自己想做到的所有事情,以一种特别简单的方式),这才是语言学习的精髓所在,虽然这两门语言因为作者的理论功底原因,没有完成设计的目标,但是我们依然要从这个目标出发,才能切合语言本质,不仅仅是将语言学会,还要用好。
作者: _Rayx    时间: 2012-05-01 10:02
回复 60# starwing83


    非常同意你的观点,可能我说语法有点不太贴切,语法应该要从语义层次来理解的。

    大师们设计语言之前肯定对之前出现过的语言各方面的特性都进行了取舍,使新语言具有自己的特色,也就是所谓的设计哲学。

作者: 2gua    时间: 2012-05-02 08:13
Ruby & Python,在应用领域是重叠的,剩下的就看自己喜欢哪种语法格式,二选其一就好。
作者: hevake_lcj    时间: 2012-05-02 08:48
我当前只会汇编、C、C++,将来还要学好SHELL、perl、java,我想够了。从底层到上层都齐了。
作者: OwnWaterloo    时间: 2012-05-02 14:43
starwing83 发表于 2012-04-30 23:28
回复 58# _Rayx

函数式设计者发现,赋值是唯一一种因为语句的顺序改变,而导致程序的含义发生变化的语法构造(自加,自减本质上其实都是赋值),于是他们去掉了赋值,所得到的是语言构造不因写作的顺序而发生含义改变。

  1. (and a b)
  2. (and b a)
复制代码
有赋值么?含义相同么?


starwing83 发表于 2012-04-30 23:28
回复 58# _Rayx

注意到,这其实也是OO的目标之一(在不修改程序,仅仅追加组件的情况下,扩充程序),这也是OO会倾向于加入函数式方法的一个原因。

不修改程序,仅仅追加组件的情况下,扩充程序 —— additive?
说这是OO的目标之一,没意见。

但"这其实也是OO的目标之一"中的"这"是什么?函数式?省略赋值?顺序无关?
就最后一条还勉勉强强…… 前两者与additive有神马关系啊……


PS:貌似没有提这书是英文版还是中文版诶……
AD那个帖子你也应该看见了……
作者: 追忆的风筝    时间: 2012-05-02 16:05
回复 10# sunny7476

很好的解释。
   
作者: starwing83    时间: 2012-05-02 17:05
本帖最后由 starwing83 于 2012-05-02 17:14 编辑

回复 64# OwnWaterloo


    (and a b)和(and b a)语义的确不一样,但是这是一个“瞬时”的不一样,这里主要说明的是程序的含义不会因为其操作数据的顺序而发生改变(类似多线程那种),不知道怎么形容所以直接说的是“顺序改变”。我觉得你应该懂我啥意思。

后面的“也”说的是顺序改变。

就算是中文版的,稍微收藏一下也好呗~~

UPDATE:我想到说法了。是这样的,如果没有赋值,那么程序里面就没有状态,自然不存在状态“改变”,程序的状态本身不会发生变化,就无所谓“执行顺序”这么一说,程序其实是由展开的操作序列组成(即所谓正则序执行),在这种情况下,是不可能出现关于状态错误的问题的(因为本来就没有状态的改变,要么一开始就是错的,要么就不是错误的),采用归纳法或循环不变式的方式很容易证明程序的正确性。而在加入赋值之后,程序本身有了状态,自然也有了对状态的维护,就导致了对同一状态修改顺序的不同导致的改变。

以(and a b)和(and b a)为例,它们的结果不同,但是在不引入赋值时,它们的值决不可能同时出现在一个对象中作为这个对象的状态,而引入赋值会导致这一点没法保证,给证明程序正确(其实是指维护性)带来困难。
作者: pitonas    时间: 2012-05-03 14:17
每个程序员都应该学习使用Ruby,我认为!!
作者: r2007    时间: 2012-05-03 19:01
python非常棒
作者: beyondfly    时间: 2012-05-03 22:45
python现在已经相当的火了
作者: 幻の上帝    时间: 2012-05-04 17:16
回复 10# sunny7476

无语,这哪里对应了……
要比好歹把main去掉吧。
而且上面的代码写得很渣,就算不用标准库无脑都能缩掉一堆无用代码……
作者: 幻の上帝    时间: 2012-05-04 17:26
回复 60# starwing83

这是语义问题。语法上可以换汤不换药。

作者: sunny7476    时间: 2012-05-04 20:33
回复 70# 幻の上帝


    感谢你的关注。我的本意只是想说明完成相同的任务,Python的代码量会少一点。想给大家一个直观的印象,而不是讨论算法的实现,这个C++代码也不是最优实现。

关于你提出的两个看法。
第一,为什么在这个算法实现中将C++程序main也计算在内,原因是这里进行对等比较,Python的代码可以进行单独输出。而C++的代码没有main入口,无法进行单独的输出。而且,在网上的C/C++算法中,大部分情况下是将main包含在内的。

每个Python脚本都有一个__name__属性,当直接执行这个脚本时,那么__name__将等于__main__,也就认为其有一个main程序,这个main程序就是脚本本身。这就是Python的优势之处。

第二,关于此处C++归并算法的代码长度,这里的归并算法只使用了<iostream>,但在代码中连include及using namespace都没有包含在内。相反,Python代码已经是完整的代码了。

诚然,此处归并算法的C++实现是很长,还有更好的实现。正如我在文中注明的那样,这个C++实现代码及下面的Python代码都是转自wiki相同的页面,我并没有说这是最佳的C++实现。再者,在不使用标准库的归并算法中,正常格式的C++代码再短,估计也有Python代码的3倍以上吧(30+行)。


作者: sunny7476    时间: 2012-05-04 20:35
回复 60# starwing83


    顺便说下,你写的非常好!
作者: 幻の上帝    时间: 2012-05-05 10:46
回复 72# sunny7476

第一,环境支持代码包括UI在内不应该算作算法实现,这个有问题么?
在“可以运行的程序”中,大多数情况下,C++和python的代码长度的确不在一个层次上。但是你考虑过没有,C++适应多少环境,python又能适应多少?
第二,说过这段代码的罗嗦的原因不只是复用得烂了。目测不看算法都能缩掉1/3。

作者: rubyish    时间: 2012-05-05 12:10
这真让人遗憾
作者: 幻の上帝    时间: 2012-05-05 12:11
本帖最后由 幻の上帝 于 2012-05-05 12:25 编辑

回复 10# sunny7476

python代码对应的C++代码也太挫了点……
替静态类型擦屁股的确得多费点劲,但也不至于这么罗嗦。瞎写了个:
  1. template<typename T>
  2. list<T> merge(list<T> l1, list<T> l2){
  3.         list<T> final;
  4.         while(!l1.empty() && !l2.empty())l1.front() < l2.front() ? (final.push_back(l1.front()), l1.pop_front()) : (final.push_back(l2.front()), l2.pop_front());
  5.         return final.splice(final.end(), l1), final.splice(final.end(), l2), final;
  6. }
  7. template<typename T>
  8. list<T> mergesort(list<T> l){
  9.         if(l.size() <= 1)return l;
  10.         auto mid(l.cbegin());
  11.         advance(mid, l.size() / 2);
  12.         return merge(mergesort(list<T>(l.cbegin(), mid)), mergesort(list<T>(mid, l.cend())));
  13. }
复制代码
对应的main:

  1. int main(){
  2.         auto l(mergesort(list<int>{3, 5, 3, 6, 4, 7, 5, 7, 4}));
  3.         for_each(l.begin(), l.end(), [](const int& i){cout<< i <<' ';});
  4.         cout << endl;
  5. }
复制代码
再补个用list::merge的:
  1. template<typename T>
  2. list<T> mergesort(list<T> l){
  3.         if(l.size() <= 1)return l;
  4.         const auto mid(next(l.cbegin(), l.size() / 2));
  5.         auto ll(mergesort(list<T>(l.cbegin(), mid)));
  6.         return ll.merge(mergesort(list<T>(mid, l.cend()))), ll;
  7. }
复制代码
(嘛……缩进莫名其妙乱了,再编辑一下好了。)

作者: sunny7476    时间: 2012-05-05 15:11
回复 74# 幻の上帝


    你写的C++代码的确费心了,水平很不错,这也是我目前见过最短的归并实现了,这个我承认,不过也有20多行(各自代码风格不一样,且使用了最新的C++11的标准库)。如果你说这是你瞎写的,那是我见识不够广,没话可说。不过此代码不适合用来给别人介绍归并算法。

至于我们争论的地方,其实中心点就一个,你也说出来了,那就是“大多数情况下,C++和python的代码长度的确不在一个层次上”,这一句就可以了。其他的都在话题之外。
作者: wxlfh    时间: 2012-05-06 10:24
难道 Perl 很差吗?似乎这里的人对 Perl 不屑一顾。
作者: hisptoot    时间: 2012-05-06 21:30
perl还行,可以玩单行脚本
作者: starwing83    时间: 2012-05-07 09:44
回复 77# sunny7476


    您不会数数么…………

不用stl的只有13行,用merge的只有7行,对应python却有9行,而且是在没有大括号的情况下(大括号单占一行很亏的)。别说不能用C++11,难道你工作的时候不允许用Python3.2?就算是这样难道你不喜欢新的Python?也别说不用stl,有本事python也别用[]啊append啊什么的,这和stl是平等的关系。

最重要的是,代码行数实际上和写代码的速度完全没有关系,如果要我说,在摈弃了编码速度的考虑下(对于打字还成为其编码瓶颈的人来说,行数越多更利于练习打字),编码的复杂度才是最最影响效率的。求圆周率的四行代码看过吧?我相信这四行你写一天也未必能搞出来。如果写无脑代码我相信任何程序员1000行/天都是小case。就这个代码,我以一个Python和C++的使用者的眼光看,最好写的是那个长长的C++,完全不必动脑,其次是Python,你得想很多东西,包括那个怪异的+l1,我相信在没有l1.copy()的年代里这个苦逼用法也并不是每个人都知道的。最后才是那几个超短的C++程序,虽然比Python短,单书写起来绝对更费脑子。

记住,代码行数绝不代表写这些代码的速度!!
作者: sunny7476    时间: 2012-05-07 11:09
本帖最后由 sunny7476 于 2012-05-07 11:11 编辑

回复 80# starwing83


    在我说明他的行数时,我已经注明是根据风格的不同得到不同的计算结果。单一的算法实现,这里我是把main加进去,并按大括号另起来计算的(若您的观点不同,我尊重,我实在不想争这些。。。)。重要的是我哪句话说了“不能用C++11”的,我只是点明了他写的代码使用了C++11的功能。

您在第二段内容的观点我完全同意,我在77楼的开头也说了,他写的那三段代码很优秀(不过他还谦虚的说是“瞎写”的)。但您的语气好像是我将代码的行数与代码的技术含量简单的归纳成一个正比关系一样,请问你是从哪里得出我有这样的观点的?

谈到“比拼”的话题,很容易就走入极端。没想到一个想说明“Python通常情况下比C++短”的观点中一段“逻辑简单而书写繁琐”的代码会引起C++使用者的关注,然后尽力缩短C++的长度(语言的比较就此打住,这个观点在许多论坛上都发动一场结果是谁也不服谁的圣战)。这本书——《梦断代码》中,其中也有Guido的一句话,说Python的代码在通常情况下会比C++短3倍,5倍,甚至10倍(这是我回想的,可能与原话有点出入)。我的观点就是认同Guido的这个观点,他默认的前提应该是相似的代码复杂度(说清楚,不然又被制造出什么观点来了)。

我认同你在帖子里关于代码书写速度与行数的观点,但不要为了表达某种观点而事先假定别人持某种观点!
作者: pmerofc    时间: 2012-05-07 11:36
提示: 作者被禁止或删除 内容自动屏蔽
作者: yangliu9420    时间: 2012-05-07 11:58
在某些人看来Python的缩进让人用起来很不爽,当然也是某些人喜爱他的原因。

虽然Python的模块多,但是好些模块的代码风格也各不相同,如:有的模块的函数名采用驼峰式的命名风格,有的就不是。

哎,Python让我是即喜欢也讨厌。

一直听说Ruby也很不错,于是前天跑去图书馆借了本《The ruby way》来看看,


作者: _Rayx    时间: 2012-05-07 14:08
哈哈,对不懂行的人来说,代码行数不都是钱么!!!!
钱啊!!!!!
作者: KanonInD    时间: 2012-05-07 14:09
本帖最后由 KanonInD 于 2012-05-07 14:24 编辑

回复 76# 幻の上帝


    要是形参可以声明为auto就好了。例如:auto mergesort(auto ls) 和 auto merge(auto lsA, auto lsB)
作者: 幻の上帝    时间: 2012-05-07 15:13
回复 85# KanonInD

如果是auto的原意,对于函数是没办法的。因为auto需要在编译时确定具体类型。不过倒是可以考虑作为简化函数模板的语法……
另外我想explicit最好可以在每个形参上用。(虽然可能更乱。)

作者: 幻の上帝    时间: 2012-05-07 15:21
回复 81# sunny7476

“瞎写”其实不是谦虚……
上面那个是直接照着python版本一口气写的,能保证语义一一对应算法正确性就没问题,也就没特别验证过。
下面一个版本倒是稍微费了点心思尽量写短一点,不过也没想过有没有更短的。


作者: sunny7476    时间: 2012-05-07 17:10
回复 87# 幻の上帝


    以后还多向你们学习学习。
作者: fallening_cu    时间: 2012-05-08 06:10
楼主啊,我这边有个算卫星轨道的程序,C++的,在楼下的大型机上运行,大概三个月能够算出2020年左右的发射窗口。改用python  之后能够在 2020 年之前算完么?
作者: fallening_cu    时间: 2012-05-08 07:03
另外一个 merge sort
  1. template<typename IT> void merge(IT begin, IT middle, IT end, IT res)
  2. {
  3.         IT a = begin, b = middle, r = res;

  4.         while (a < middle && b < end)
  5.                 if (*a < *b) *r++ = *a++;
  6.                 else *r++ = *b++;

  7.         while (a < middle) *r++ = *a++;
  8.         while (b < end) *r++ = *b++;
  9.         while (begin < end) *begin++ = *res++;
  10. }

  11. template<typename IT> void mergesort(IT begin, IT end, IT res)
  12. {
  13.         int s = end-begin;
  14.         if (s > 1)
  15.         {
  16.                 IT middle = begin+s/2;
  17.                 mergesort(begin, middle, res);
  18.                 mergesort(middle, end, res);
  19.                 merge(begin, middle, end, res);
  20.         }
  21. }
复制代码

作者: 无风之谷    时间: 2012-05-09 14:28
回复 9# yahoon


    说的不错~!
作者: 无风之谷    时间: 2012-05-09 14:28
回复 62# 2gua


    瓜哥在这方面应该有很多可以分享的吧?呵呵
作者: 无风之谷    时间: 2012-05-09 14:30
回复 78# wxlfh


    Perl是一门很好的语言。。所以Perl版很火爆嘛
作者: airland    时间: 2012-05-09 15:10
Python的确能节省你很多时间!!!  严重同意。
作者: MagicBoy2010    时间: 2012-05-09 15:21
完了,前几天刚买了本perl语言入门,现在就被说成是昨日黄花了,看来大家都喜欢内裤啊,要不为什么评价一个语言都看内裤多不多呢?

打算学那什么Ruby了,因为我至少要掌握一门脚本语言不是。
作者: MagicBoy2010    时间: 2012-05-09 15:24
starwing83 发表于 2012-04-27 12:51
很好……终于有个不是陈良桥的讨论了……我都快受不了了……

嗯,最近收到了Python科学计算,觉得很爽哈 ...


感觉这哥们讲得非常靠谱
作者: airland    时间: 2012-05-09 15:33
回复 95# MagicBoy2010


    额 我记得LZ 掌握好几门语言来着。。。
作者: airland    时间: 2012-05-09 15:34
我也买了本python的书,好好看看 哎。苦逼
作者: 无风之谷    时间: 2012-05-09 15:46
呵呵 大家可以多关注下社区的活动,现在社区还有不少 ruby和python的书,会在活动中慢慢送给大家的。。
作者: highhand    时间: 2012-05-09 15:51
回复 1# 无风之谷


    我认为都应该看一下,掌握其中一门语言。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2