從PHP寫C語言是什么感受

寫C的原因

最近用PHP寫視頻加密,發(fā)現(xiàn)PHP加密很慢而且1M的文件需要100M的內(nèi)存,所以經(jīng)常爆掉系統(tǒng)內(nèi)存,真心悲劇。為什么會這樣的悲劇?按照算法的需求,要把文件內(nèi)容用zlib庫進(jìn)行壓縮一下,就能讓內(nèi)存暴增了。PHP里面的字符運(yùn)算還要調(diào)用pack函數(shù),將字符串轉(zhuǎn)化成整形數(shù)組,然后這里又耗掉了大部分的內(nèi)存。但是加密后,我還要寫入新文件呀,又要unpack回去,最重要的問題是PHP不能動(dòng)態(tài)釋放內(nèi)存?!不能動(dòng)態(tài)釋放內(nèi)存?!不能動(dòng)態(tài)釋放內(nèi)存?。?!(“可惡”的事情必須鄭重的強(qiáng)調(diào)),這樣子讓視頻文件需要比自己大100倍的內(nèi)存。想想一個(gè)視頻動(dòng)不動(dòng)就500M,讓我哪里去找個(gè)這麼大內(nèi)存的服務(wù)器。明顯,這樣太不合理了,為了優(yōu)化加密速度,想想大學(xué)當(dāng)年也是瞎寫了4年的C,C也更接近底層,明顯可以free掉內(nèi)存,而且PHP也是用C來實(shí)現(xiàn),正好有個(gè)機(jī)會重溫一下C,以后就可以寫PHP擴(kuò)展了。

PHP與C的一些區(qū)別

1、C語言我每寫一個(gè)變量的時(shí)候必須定義好變量的類型,PHP里面是隨意切換變量類型的。C每用一個(gè)變量前必須先定義好,PHP里面可以在任何地方$一個(gè)變量出來,隨心所欲太習(xí)慣了。正因?yàn)閺?qiáng)類型的問題,在PHP里面判斷兩個(gè)字符串是不是相等,直接用$a=="PHP"就可以。而C里面就要用到strcmp函數(shù)來進(jìn)行對比。

2、C聲明數(shù)組必須是定長的,因?yàn)镃是根據(jù)數(shù)組長度分配內(nèi)存空間的;但是對于PHP來說,為什么要先定義好數(shù)組長度呀,完全沒有這個(gè)需求呀,我們向來習(xí)慣數(shù)組動(dòng)態(tài)賦值后用count一下計(jì)算長度就可以了。

3、C語言的二維數(shù)組,多維數(shù)組也是要預(yù)先定義好的,但是PHP里面數(shù)組完全的各種嵌套呀,為什么要管數(shù)據(jù)的幾維數(shù)組的格式?多維數(shù)組滿足不了你的需求對吧,C里面還有結(jié)構(gòu)體呀,但是還是要預(yù)先定義好你數(shù)組的結(jié)構(gòu)體,PHP哪需要你管那么多,一個(gè)數(shù)組就可以完成滿足你各種數(shù)組結(jié)構(gòu)了,數(shù)組用的溜,就可以解決很多程序上的問題了。

4、C用到什么才加載什么庫。當(dāng)我寫入一個(gè)簡單的常見的函數(shù)floor的時(shí)候,居然會編譯不成功,提示沒有該函數(shù)的定義。給我的第一感覺就是不可能吧,C連這種基本的函數(shù)都沒有!Google之后,我才知道我是沒有include相應(yīng)的頭部文件,而PHP對于這些基礎(chǔ)的函數(shù)都是默認(rèn)加載進(jìn)去的。

5、PHP的有很多很方便而意義明確的函數(shù)。我要判斷文件和文件夾是否存在,PHP里面一般是用file_exists就可以。C用access函數(shù),函數(shù)中還有幾個(gè)選項(xiàng),分別代表不同的意義,作為需要才用到的原則,我自動(dòng)把暫時(shí)沒有用到的選擇參數(shù)給忽略了。

6、C語言函數(shù)是不可以直接返回?cái)?shù)組的。我找了半天才知道,C語言里面把數(shù)組作為參數(shù)傳給函數(shù)里面,直接就是傳地址的,即是數(shù)組的元素會因?yàn)楹瘮?shù)的里面的運(yùn)算而改變。那么問題又來了,我要怎么樣才可以返回一個(gè)變長的數(shù)組呢?神奇指針終于起到作用了,就是定義一個(gè)返回指針類型的函數(shù),把一個(gè)指針指向一個(gè)數(shù)組的首地址就可以了。這讓可是我糾結(jié)了大半天才找到的結(jié)果呀!PHP里面完全沒有必要這么繞,函數(shù)可以直接返回任何類型。

7、C語言編譯還要帶各種參數(shù)的。因?yàn)槲矣玫搅藌lib的庫的壓縮函數(shù),在編譯的時(shí)候因?yàn)槿鄙倭?lz參數(shù)而不通過。PHP最多也就是用到一些擴(kuò)展里面的函數(shù)的時(shí)候,提示沒有定義,把擴(kuò)展加載進(jìn)去就好了。一般的操作就是刷新一下網(wǎng)頁就OK了。

一點(diǎn)點(diǎn)感受

在折騰了一周多C語言后,終于把PHP的加密程序成功的轉(zhuǎn)化成了C語言。明明用PHP只是半天就寫出來的程序的呀?。?/p>

其實(shí)當(dāng)年學(xué)PHP的時(shí)候,就覺得PHP居然這么靈活,完全沒有C那么多約束呀!這些只是一些語言的特性,但是作為一個(gè)完全沒有學(xué)過C的PHPer來說,肯定會不習(xí)慣這些基本的區(qū)別。而PHP肯定比C語言具有更加低的學(xué)習(xí)成本,門檻也低。所以PHP可以更加容易吸引初入門的開發(fā)者。

C語言為什么快?因?yàn)樗懈鞣N制約,是非常嚴(yán)謹(jǐn)?shù)恼Z言,需要我們開發(fā)者付出更多的勞動(dòng)。其實(shí)PHP就像我們自己編寫C程序時(shí),在長期編碼中形成的一個(gè)公共庫。所以,我們必須明白PHP的靈活和方便,是以C背后做了更多工作為代價(jià)的。越是靈活,越是自由,我們在背后就越需要付出更多的汗水!

站在從社會發(fā)展角度來看,PHP比C語言高級一些。因?yàn)镻HP讓人更加“懶”,因?yàn)镻HP更容易也更加快產(chǎn)出一個(gè)產(chǎn)品。就像一個(gè)好UI設(shè)計(jì),能讓傻瓜不用別人教就可以自己弄懂。但是只有深入了解底層的原理,我們才可以設(shè)計(jì)出更加好的程序。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容