我看到了舊時的C語言疤痕……

aqee發表於2013-08-15

  一個月前,我正在寫一個簡單的應用,是用ruby去讀pdf檔案,不知道為什麼,檔案指標跑到了檔案開始地址的前面。我不明白為什麼會這樣。於是,像往常一樣,我到stackoverflow上發帖求助。得到的第一條回覆是:

“你的程式碼有C語言的味道….”

  有什麼??進一步的閱讀,我發現在ruby裡有一個很方便的IO操作包,根本不需要使用getc(這是我的習慣用法)——除非在一些特殊情況下。

  我想說的是,用一種新語言程式設計,在學會這種語言的正確語法前,你需要了解它的基本原理。當你說“我會XXX語言”時,你的意思並不是指知道它的語法。而是知道這種語言裡有更好的演算法實現方法和問題解決方案,否則,你學習這種新語言的意義在哪裡呢?!

  讓我們來分析一個問題,假設我們需要找到一個檔案的最後一行的開始處(這是我以前做過的一個任務)。

  像我這樣懂得一點C語言的人會這樣寫:

fseek(fp,-1,SEEK_END);
do {
   fseek(fp,-2,SEEK_CUR);
}while(fgetc(fp)!='\n');

  用ruby也能寫出類似的程式碼,讓你一個新學習ruby的C程式設計師來寫,他就會寫出這樣:

i) file.seek(-1,IO::SEEK_END)
   while file.getc != "\n"
       file.seek(-2,IO::SEEK_CUR)
   end

  但是,一個熟練的ruby程式設計師則會寫成這樣:

ii) buff = file.readlines
    file.seek(-(buff.pop).length,IO::SEEK_END)

    或

iii) lastline = Elif.open("file.txt") { |f| f.gets }
     file.seek(-lastline.length, IO::SEEK_END)

  對我來說,iii)是最好的實現方法,它能處理大型檔案,不管日後它增長到多大。這個Elif工具包把檔案切割成了很小的片段,把它們放到小的緩衝池裡,分析完後從緩衝裡清除掉。你可以看一下它的gem原始檔。如果你研究原始檔,你會發現,任何一個需要使用到的字串物件方法都使用的非常聰明。

  這只是一個簡單的例子,來說明改變思維習慣是如何能巨大的提高你的程式碼效率。我知道,作為一個新語言學習者,學會用新的語言風格和思維習慣程式設計是很困難的。我記得當老師在課堂上教我們組合語言時,很多人會先把作業用C語言寫成,然後再寫出彙編程式碼,因為他們更熟悉C語言。但是,如果你有了一定經驗,而你的程式中仍然有一些老的語言的痕跡,這說明你遇到了麻煩。

  所以,如果我學習一種新語言,過程會是:

  基本原理 –> 語法 –> Library/APIs

  英文原文:Old C scars, I see...

相關文章