2014年4月1日 星期二

米是從那裏來的!?

‘米是從那裏來的?’

小孩子不假思索地回答:‘超級市場!’

若你嘲笑這小孩子,你可能也要嘲笑我,或更準確的說,你在嘲笑大部份programmers。

這話何說?現代的電腦語言,更不要說Framework,已做了很多很多東西,多得令很多programmers都認為一切事情都是理所當的。例如,對C programmer來說,內存管理是不可或缺的重要技術,特別是server程式,測試和評估memory leak,成了一個非常重要的課題,但今天很多程序員就連這個問題都未聽過!

要明白這個問題,先看看以下的例子。

for ($i = 0; $i < 100; $i++) {
$obj = new Obj();


}

以上是類似PHP的pseudo code,無需執著於語法的絕對正確性,很正常和普通是嗎?一點也不特別。

細心想一想,這裏叫用了new Obj()一百次,每次系統都要生成Obj的實作(instance),即是要在內存留下一百份Obj的內存空間。

但是,由於每次生成的Obj都是賦值到同一變數,簡單來說,當$i等於2時生成的Obj的指針便會覆蓋第一次生成的指針,亦即不可能再使用第一次生成的Obj了!在同一時間,實際可用的就祗有一個instance,亦即是說,當執行完這段後,佔用了一百個instance的內存,但可用的就祗有一個!

對於C來說,這是邏輯錯誤,就是memory leak,問題是不會即時出現的,而是當program執行了一段時間(特別是server application),佔用內存便越來越大,最後便因內存耗盡而死亡。這便是為甚麼很多時都要重啟(restart),重啟就是暫時解決memory leak的一個辦法。

不過,對php來說,這種寫法並沒有問題,理由是php會自動回收這些內存,不單是php,Java,C#,Python,Ruby等等的現代語言都不用擔心這個問題,至於它們用甚麼方法回收,有機會再詳細討論罷!但我想說的重點是,內存管理問題永遠存在,祗不過問題會由programmer去處理,還是由系統處理而已,世界是並不存在免費午餐的!

在應用程序員(application programmer)的角度,當然不希望花時間去做這些系統的工作,很多時不單是‘不想’而是‘不懂’!這就等如常人到超市買米好了,米確實來自超市!但有些人,總是希望直接向農民買米,甚至是自己去種米。同樣,對系統有興趣的人,仍會偏愛自己去做這些工作。

有不少業界人士都認為,現在除系統和硬件程序員仍會用外,其他如商業系統已鮮有用C開發,因而應在大學課程內取消C,或最少不應列為必修課。

對此我不敢苟同。真的,我也有十多年沒有把C用在工作上。但C是個根基,祗有結實的C經驗,才會真正明白很多編程的基本概念。這就等如,我曾花了不少時間研究sorting和searching,但我真正自己寫searching已是廿多年前的事了!有database還去做這些事!但這些時間花得很有價值,若欠缺了這基礎,很多問題都是不會弄得明白的!

到超級市場買米沒有問題,不單是沒有問題,而且可能是生活的一部份,但完全地確信米就是來自超級市場,這就有點…