程式、編譯器和作業系統
參考書目《C++ primer》《編譯原理基礎》
在開始任意一門語言的學習之前,很多人習慣於使用一個“軟體”(如visual studio 2010),這個軟體的功能是你可以把你的“hello world”程式寫進去,點擊編譯,成功後運行,出現一個黑框,顯示“hello world”。很多人把這個過程當成一個習慣,但可能沒有想過,你寫的代碼和visual studio以及windows之間的關係。
但我覺得你還是需要簡單瞭解它們之間的邏輯關係和簡單的運行方式。此篇部落格中,我將會簡單的跟大家分享一下程式、編譯器和作業系統之間的關係,不對原理做深入的說明,只是告訴你他們是如何一起工作的。這三個內容每一個都是很深的方向,如果你真的想要瞭解,可以參考《編譯原理》及《電腦作業系統》。 程式(機器語言)
我們每天都在跟周圍的人說話,使用的就是語言。很經典的一句話是:人有人的語言,機器有機器的語言。 機器的語言就是程式。
人想要跟機器對話,讓機器去做人想做的事情,那你要懂機器的語言是怎麼說的,電腦的語言不就是0和1嘛(哭笑臉)。不過電腦剛剛問世的時候,確實是有人只用0和1進行編程的,很強大, 後來出現了彙編,算是電腦語言的一個很大的進步,但程式員還是需要按照機器指令的工作方式思考。後來次出現了C語言這些符合人類思維特徵的語言,但這些語言具有很高的抽象程度,你本身的思維邏輯需要夠強大,才能設計出好的機器語言。
看一段C++程式
int main(){ int a=0; int b=1; int sum=0; sum = a+b; cout<<"a+b= "<<sum<<endl; return 0;}
能看得出來,其實我們已經可以很容易的理解到這段代碼的含義,這就是程式的進步。
然而,上述這個程式電腦是不可能看懂的,為了能將人類思維寫出來的程式“翻譯”成機器能理解的程式,電腦領域的“翻譯官”—-編譯器(Compiler)被發明了,後邊會詳聊編譯器。
總之,要學好編程,你首先得有做一個翻譯的心理準備,而且你要具備強大的邏輯和抽象的思維。 編譯器(編譯器與IDE的關係)
說編譯器之前,還需要補充一個關於程式設計語言的知識,很多人聽說過編譯器,但沒有聽說過解譯器,其實這兩個東西是需要在一起討論一下的。
編譯器的運行過程是,給一個來源程式(程式員寫的)—編譯器編譯—產生目標程式,目標程式—資料輸入—程式運行輸出結果。這裡可以看出來來源程式和目標程式是很獨立的兩個階段。
解譯器的運行過程是,來源程式—翻譯一段—執行一段。
打個比方,編譯器就像翻譯一本書,翻譯完了,發給讀者看就行了,寫書的作者不需要在場;而解譯器相當於同聲傳譯,作者說一句,解譯器翻譯一句,同時還要有讀者在場聽。雖然這兩種翻譯方式不同,但需要注意的是,凡是可以採用編譯方式的地方,幾乎都可以採用解釋的方式。
程式設計語言有的時候會根據翻譯的方式不同分為編譯型語言(如C/C++)和解釋型語言(如JAVA/C#),語言和語言各有優勢,翻譯的方式也各有優勢。
說了這麼半天,有人會問,我怎麼從來沒有感覺到編譯器的存在,編譯器在哪。其實很多新手習慣了使用上邊說的“軟體”,這種軟體有個專業的叫法—IDE,整合式開發環境。
編譯器作為其中的一個工具被整合在IDE中了,因此你可能感覺不到,但如果在windows控制台下用javac編譯過java代碼,或者你在linux的命令列下編譯過程式,那個時候你就是直接使用了編譯器。
作業系統
在提到一些程式設計語言的時候,比如Java,有人會說這是一個跨平台的語言,其實說白了就是跨電腦系統。
從我目前的理解來看,在程式設計語言運行在一台電腦上時,它的很多代碼經過編譯器之後是可以直接控制硬體進行相應的運算的,但是既然你是在這個電腦系統上啟動並執行,你的輸入和輸出可能需要依賴作業系統(如windows下的圖形介面,.net或mfc)。
所以說作業系統與程式的緊密程度要取決你的程式所要實現的功能,如果你是做UI的,那麼你可能要深入瞭解windows系統的機制,如果你是做核心演算法,可能你並不需要在作業系統上花費太多時間。
當然,具體問題還要具體分析,因為本身作業系統就是一門學問,如何能讓你的程式更好的跑在系統上,需要你對他有足夠的瞭解。 如有問題可留言 或發送郵件到:lifeliyan@163.com