作者StubbornLin (Victor)
看板i-enterprise
标题Re: [请益] 网路创业大部分的网站规划都是用PHP吗?
时间Thu Jan 14 20:49:04 2010
※ 引述《gpmm (银色)》之铭言:
: ※ 引述《StubbornLin (Victor)》之铭言:
: : 我有写一篇文章在说明如何比较程式语言
: : http://blog.ez2learn.com/2010/01/08/how-to-compare-languages/
: : 不过这里面只提到最核心的部份,还有很多像是可用资源、社群、商业资源
: : 等等更广范的问题,有空我会再另外写一篇文章来介绍
: 老实说,因为小弟对 Perl / Python 只略知皮毛,
: 所以没办法对您的文章通篇回应,
: 但是看到您的这篇「如何比较程式语言」,实在是忍不住笑了。
: 当我们在谈程式语言的可读性时,大多数指的并不是「语言」本身有多容易阅读,
: 而是指程式人员的撰写风格和程式逻辑。
你有没有修过程式语言(Programming Language)?
你有仔细读我的文章吗?
我说过有
你说的大多数,是指什麽情况?
你所说的是风格,风格的差别就只限於单一语言的比较
像这样
if(a==b) {
printf("a equals b\n");
}
if(a==b) {
printf("a equals b\n");
}
你自己都说你认为的可读性(Readability)是风格(programming style)了
那你硬要来跟我说的可读性搭在一起
不是张飞打岳飞吗?
我的文章的可读性是指跨语言的比较
语言的天性有些就使得他们难读
我随手找篇文章你可以读读看
"What Makes a Good Programming Language?"
http://0rz.tw/U0NKe
里面提到Objective-C的可读性
语言本身就有可读性的差别
如果你有修过Programming Language这门课就会知道
里面有一些章节是在讨论语言的可读性
你硬要拿错误的认知来嘲笑我的文章是你的自由
: 如果当我们将可读性误植在「语言」本身时,
: 会产生一个极其荒谬的情况 -
: 也就是语言的可读性,变成了你对於这个语言的熟稔程度的指标。
: 如果依照这个逻辑,当我们在使用 windows 时,
: 用滑鼠点选切换视窗的人,也会觉得这是比起键盘按 Alt-Tab 更好的技巧,
: 只因为这个「组合键」的操作,你无法在键盘上直接看到。
这也是张飞打岳飞
组合键只是加速你达成那样的功能
但是和可读性完全搭不上关系
你大不了不用组合键,用滑鼠慢慢点
可是写程式就不一样了
你老板要你维护的perl程式丢给你
程式码一行一行地写在里面
请问你可以大不了不读算了吗?
$| = 1;
你可以在没有看文件的情况下回答我这行的用意吗?
如果当初写的人没加注解
没有文件,那你只能查文件
好,那你可能会说这是看语言熟不熟来评断可读性
那我们设同样的条件,两个一样不熟的人来看同样的一份程式呢?
disableBuffering();
一个不熟你要查文件
一个不熟你光看名字就能猜到
你要不要跟我说这两个差别在哪?
当然,你会说,Perl也可以这样用函数来写
问题是Perl本身提供那些$$ $% $^ $&就会有人去用它们
再说有些情况非用这些不可
通常都是大量被使用,别人在程式里用到这些,你没有选择
你只能去读他们....,而且要读懂
这就是我所说的问题所在
###### 补充例子 #####
那个disableBuffering()的例子实在很糟
我另外找个例子
Perl版:
while (<$CHILD>) {
print $_;
last if ($_ =~ /^[\s\x00]*$/);
}
用Python的话
import re
for line in child.readlines():
print line
if re.match(line, '^[\s\x00]*$'):
break
Perl版你要知道的知识有:
1. <> 是读一笔资料
2. $/ 会影响<>读的东西是由什麽东西来分开的,预设是断行
3. last 是break的意思,也就是跳离回圈
4. last if 是当後面条件成立时跳离回圈
5. $_ 是<>每次读进来的资料所放的变数
6. =~ 是匹配用的语法
7. // 是用来表述regualr expression的语法
Python版你要知道的知识有:
1. import 是引入函式库
2. re 是regular express的函式库
3. for value in sequence: 是foreach的意思,一次从seq中取一个value
4. file.readlines() 是以行为单位回传一个list
5. re.match 是匹配regular expression的功能
6. break 是跳离回圈
7. Python的code block是由缩排来决定的
我想很清楚的是,perl你不懂语法,就是不懂
python版的可以猜,换成其它语言也一样
因为没有一个语言像perl做这麽多功能在语法上的...
--
Now.in 网路广播平台
http://now.in
哇咧咧 创意投票系统
http://walele.com
易记学 程式设计教学
http://ez2learn.com/
VICTOR's 个人Blog
http://blog.ez2learn.com/
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.252.72.249
1F:→ TonyQ:我修过程式语言,但我觉得这些并不你所说得客观,而是随着 01/14 20:53
2F:→ TonyQ:不同的人的撰写背景而主观的认知。可读性建立在你对这个语言 01/14 20:53
3F:→ TonyQ:的了解,甚至是一些背景知识的了解。当你先入为主在心中内置 01/14 20:54
4F:→ TonyQ:一个语言之後,其他的语言跟可写性可能就是个屁了吧xd 01/14 20:54
5F:→ gpmm:同 T 大所言,PL 是程设基础之一,小弟也修过,言尽於此吧 01/14 20:56
你即然有修过,又要拿programming sytle和readibility混在一起
我也没什麽好说的
6F:推 superpai:有空战语言 不如学怎麽把html写好一点.. 这可没得选了 01/14 20:57
7F:→ StubbornLin:那如果同样都不了解呢? 我说的是那样的假设 01/14 20:59
8F:→ StubbornLin:当然我没有实际研究的数据,所以你们觉得我不客观 01/14 20:59
9F:→ StubbornLin:如果同时找一些只写过C/C++ VB的人去读perl和python呢 01/14 21:00
10F:→ StubbornLin:我相信语言的天性 $$ $% 那种无从猜起和联响的语法 01/14 21:00
11F:→ StubbornLin:会让人难以理解 甚至要一直查手册才有办法了解 01/14 21:01
12F:→ StubbornLin:同样一个disableBuffering的功能 01/14 21:01
13F:→ StubbornLin:一个是就算不懂python读这几个字就可以理解意思的 01/14 21:01
14F:→ StubbornLin:一个是非得查手册才知道$| = 1是做什麽用的 01/14 21:02
15F:→ StubbornLin:你们要说这是主观对语言的了解吗? 01/14 21:02
16F:→ StubbornLin:大家都懂英文,但是不是大家都懂$| 01/14 21:02
17F:→ StubbornLin:差别就在这里 01/14 21:02
18F:推 superpai:通通都没有jquery阅读性好 01/14 21:03
※ 编辑: StubbornLin 来自: 111.252.72.249 (01/14 21:03)
19F:→ gpmm:我只想说,混在一起的人是您不是我 01/14 21:05
20F:→ gpmm:在您看来都是外面的人搞错了,那也无妨,就这样罢 01/14 21:05
21F:→ TonyQ:好一个可读性很差,我懂了,你网页中perl的范例的确可读性 01/14 21:15
22F:→ TonyQ:很差,有 while (<$CHILD>) 这种东西的code可读性 01/14 21:15
23F:→ TonyQ:或者是 my $first = <$CHILD>; 01/14 21:16
24F:→ TonyQ:还有&open_connection($URL, $remote_host, $remote_por 01/14 21:16
25F:→ TonyQ:这个范例的果然是适合拿来做可读性很差的范例。(搔头) 01/14 21:17
26F:→ TonyQ:难怪你会问有没有仔细读过你文章,我仔细看了两次才看到。 01/14 21:18
27F:→ StubbornLin:那是wordpress把<> escape掉的结果 01/14 21:22
28F:→ StubbornLin:如果你只剩这种方式来证明你的说法 那就这样吧 01/14 21:23
29F:推 TonyQ:我很严肃的说一句话,你要提引用资料,而且还要质疑别人有没 01/14 21:25
30F:→ TonyQ:有仔细阅读你的引用资料,那你就该对你的引用资料负责。 01/14 21:26
31F:→ TonyQ:至於提说法的是你,要证明的也是你,我只是质疑罢了。 01/14 21:27
32F:→ StubbornLin:好,那除了wordpress <>被escape掉的部份 01/14 21:29
33F:→ StubbornLin:你能不能除此之外的说法来质疑我? 01/14 21:30
34F:→ StubbornLin:当然你可以甚至拿我打错的任何一个字来质疑我 01/14 21:30
35F:→ TonyQ:我前三行就讲啦,你的背景和主观认知让你比较偏好於python 01/14 21:30
36F:→ StubbornLin:但是又如何? 那问题本身根本就没被讨论到 01/14 21:30
37F:→ TonyQ:like 的程式语言,但是对某些不这麽认知的人就不见得如此。 01/14 21:30
38F:→ TonyQ:我是认为你既然要讨论程式码的可读性,错误的程式码当然会影 01/14 21:31
39F:推 superpai:变数没有用$我就不会阅读了(扭) 01/14 21:31
40F:→ StubbornLin:我承认我偏好python,但是$|= 1; 和用函式库呼叫 01/14 21:31
41F:→ TonyQ:响判断,不过这倒是小事,你只要修正就好。 01/14 21:31
42F:→ StubbornLin:两个的可读性有主观到这个地部吗? 01/14 21:32
43F:→ StubbornLin:而且我也都说了,如果同样不懂perl python的人来看 01/14 21:35
44F:→ TonyQ:问题是,python 现在就没有这个函式,而perl 可以定义这函式 01/14 21:35
45F:→ StubbornLin:这样不客观吗? 都同样不懂perl和python 他懂C好了 01/14 21:35
46F:→ StubbornLin:问题是Perl那种写法被大量使用,你在每个perl程式 01/14 21:36
47F:→ StubbornLin:几乎都可以看见那种写法,我承认我举的那个例子不好 01/14 21:36
48F:→ StubbornLin:但是事实就是大量的perl程式都用那种写法 01/14 21:36
49F:→ StubbornLin:而且无可避免,而python是别无选择,因为琐碎的功能 01/14 21:37
50F:→ TonyQ:所以我说这跟背景的主观认识有差啊,像我刚刚看python code 01/14 21:37
51F:→ StubbornLin:都写在函式库里,你只能引用拿出来使用 01/14 21:37
52F:→ StubbornLin:这样一来就有"名称",函数名称 library"名称" 01/14 21:37
53F:→ StubbornLin:有名称就可以猜,但是Perl是符号,无法猜测是什麽 01/14 21:37
54F:→ TonyQ:最不习惯的是 if/for 後的 : 而且没有明确结尾的记号 01/14 21:37
55F:→ TonyQ:这就会影响到对我而言可读性的认知,这种事情是根据你的背 01/14 21:38
56F:→ StubbornLin:读资料有语法 <> 执行指令有语法 `` 正规匹配有语法 01/14 21:38
57F:→ StubbornLin:perl的问题就在於建立太多功能在语法上 01/14 21:39
58F:→ TonyQ:景来看的,每个语言本就会有他dirty的地方,但是都也有自我 01/14 21:39
59F:→ StubbornLin:还有更多冷门的语法,我写了好一阵子perl都还一直遇到 01/14 21:39
60F:→ TonyQ:修复的空间。 01/14 21:39
61F:→ StubbornLin:Python的code block是靠缩排来决定的 01/14 21:39
62F:→ StubbornLin:当然在没有这种背景知识下可能会觉得难读 01/14 21:40
63F:→ TonyQ:对我来讲我觉得这真是糟糕. XD 01/14 21:40
64F:→ StubbornLin:就很多方面确实是很主观的 01/14 21:40
65F:→ StubbornLin:但是,大量依赖$$ $% $^那种写法,和用函式库来取代 01/14 21:40
66F:→ StubbornLin:举个例子 $$是process的id 01/14 21:41
67F:→ StubbornLin:在python你要取得process的id就得这麽写 01/14 21:41
68F:推 superpai:没有{},变数没有$的语言阅读性=0 01/14 21:41
69F:→ TonyQ:说到没有$ , python 里面怎麽区分内建元素、关键字跟变数?.? 01/14 21:43
70F:→ TonyQ:只能倚赖code hightlight 了吗 01/14 21:43
71F:→ StubbornLin:import os; print os.getpid() 01/14 21:43
72F:→ StubbornLin:对,是的 但关键字不多 01/14 21:44
73F:→ StubbornLin:我举的这个例子,因为perl把pid做成符号 01/14 21:44
74F:→ StubbornLin:自然就较难懂,而python只能呼叫os.getpid() 01/14 21:44
75F:→ StubbornLin:就比较容易懂,我想这个很客观吧? 找写C的人来看 01/14 21:45
76F:→ TonyQ:刚刚观察到 import 的部份了,这样就比较没有内建元件的问题 01/14 21:45
77F:→ StubbornLin:找写C++、Java的人看,perl的符号都得查手册 01/14 21:45
78F:→ TonyQ:不过这种不需要对变数明确宣告的语言虽然有弹性,却容易造成 01/14 21:45
79F:→ StubbornLin:python是纯物件导向的语言,所以他大多功能都是 01/14 21:46
80F:→ TonyQ:变数撰写上的混淆的说。 01/14 21:46
81F:→ StubbornLin:以函式库或是函式来完成的,让语言核心的东西较少 01/14 21:46
82F:→ TonyQ:叫我写pyton也要查手册才知道keyword啊 XD 01/14 21:46
83F:→ StubbornLin:python使用未定义的变数会丢例外 01/14 21:46
84F:→ StubbornLin:我知道得查,但程度上就有差别阿 01/14 21:47
85F:→ TonyQ:怕是怕重复定义而不是使用未定义变数吧 01/14 21:47
86F:→ StubbornLin:我读perl查手册的频率可能是几行就一次 01/14 21:47
87F:→ TonyQ:这可是以前写asp的恶梦 XD 01/14 21:47
88F:→ StubbornLin:但python就很顺,同样都是我学过的语言 01/14 21:48
89F:→ StubbornLin:perl语法太杂、负担太大= = 读起来很痛苦 01/14 21:48
90F:→ StubbornLin:常见的语法还好,偶尔跑出一两个冷门的语法 01/14 21:48
91F:→ StubbornLin:更惨的是你在google打 perl <> `` ~=之类的是找不到的 01/14 21:49
92F:→ StubbornLin:除非你知道他是在perl里的那一个语法的项目中... 01/14 21:49
93F:→ StubbornLin:否则就头大了= = 01/14 21:49
94F:→ StubbornLin:对我来说,perl最糟的地方就是他做太多功能在语法中 01/14 21:49
95F:推 TonyQ:话说插个话 client, address = s.accept() 这赋值式意义?.? 01/14 21:50
96F:→ StubbornLin:把sequence拆开来 分别指派给左边的项目 01/14 21:51
97F:→ StubbornLin:perl我记得也有类似的写法 01/14 21:51
98F:→ StubbornLin:像是a, b, c = (1, 2, 3) 那a b c就会分别是1 2 3 01/14 21:51
99F:→ TonyQ:什麽什麽什麽 XD accpet 照经验应该是会接到一个client 01/14 21:51
100F:→ TonyQ:哦 看懂了 XD 你没解释我还真不知道这啥鬼 01/14 21:52
101F:→ TonyQ:其实我看过得code里面最让我觉得功能复杂的是ruby (汗 01/14 21:52
102F:→ StubbornLin:嗯 这类做成语法的东西没看过就很难懂或猜 01/14 21:53
103F:→ StubbornLin:perl就是因为建太多语法 不懂就真的无从猜起= =" 01/14 21:54
104F:→ StubbornLin:accept会回传一个socket和address 01/14 21:54
105F:→ StubbornLin:在函式库里是这样定义的 01/14 21:54
106F:→ StubbornLin:话说wordpress的<pre>里要怎样打该死的<和> = =" 01/14 21:54
107F:→ StubbornLin:它一直escape我的角括号= = 气死我 01/14 21:55
108F:→ StubbornLin:找到解法了 <pre>里加一个<code>包起来 01/14 21:59
109F:→ TonyQ:XD 01/14 22:01
110F:→ StubbornLin:ok 更新好了,角括号没有被escape掉了 01/14 22:07
※ 编辑: StubbornLin 来自: 111.252.72.249 (01/14 22:44)
111F:→ StubbornLin:补充一个例子 01/14 22:46
※ 编辑: StubbornLin 来自: 111.252.72.249 (01/14 22:47)
※ 编辑: StubbornLin 来自: 111.252.72.249 (01/14 22:52)
※ 编辑: StubbornLin 来自: 111.252.72.249 (01/14 22:56)