作者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)