2013年9月23日 星期一

C語言程式設計閒聊(0)程式開發環境閒聊-總論

由於去年曾經當過大一程設助教,藉此重新審視了複習了一次C語言的教學流程,和自己當初學習的狀況不同的是,重新以一個相對有經驗的 Programmer的觀點重新審視會有著許多不同的看法,去年時就想整理出來給自己做個記錄也分享給其他人,但總因為時間分配上的關係無法如願。所以今 年雖然不再是助教,但想根據今年程設上課的進度來補充自己對該部分的看法。

這一系列文章基本上都是我個人的閒聊,不代表任何課程的官方看法。

通常在一開始教學程式設計時,開發環境的建立是首要的課題,尤其剛從高中畢業且從未接觸過程式開發的新手來說,這個部分會是入門的第一個小門檻,而實際會遇到的狀況其實會根據授課教師與助教的Demo要求會有各種不同可能會遇到的小困難,我們以下分別討論。

要談程式開發環境,首先必須先釐清撰寫程式本身到底是在做什麼?

首先,在電腦上運行的是machine code,是由01組成的二進位編碼,非常人所能理解。而我們在撰寫程式時使用的是較接近人類自然語言的程式語言,故撰寫程式這件事情就是:「把你的運算邏輯以程式語言撰寫出來」,並把它存成一個檔案(例如:test.c)。但是這個test.c並不是真正的machine code,而從.c檔變成真正machine code的過程就是編譯流程,在經過編譯流程之後就會變成真正電腦看的懂得可執行檔(以Windows系統為例,他就會變成test.exe)

所以,從你寫一個HelloWorld.c,到你真的到螢幕上看到他的執行結果。需要「撰寫程式碼」與「編譯」的兩道步驟(編譯的部份可以細分成許多步,但對初學者來說只需要知道是透過「編譯」的行為,將「程式碼」(test.c)轉換成「可執行檔」

通常程式設計師在開發的時候分為兩派,一派是透過一套整合性的開發環境(IDE,Integrated Development Environment)來把程式碼編輯和編譯流程整合在一個環境裡,這樣的好處是要寫程式的時候只要開這套軟體就可能開始寫了。
另外一派則是透過專門給程式設計師用的文字編輯器編輯程式碼,並將編輯好的程式碼存成test.c,再自行選用編譯器來將其編譯成可執行檔。

我個人的使用經驗,其實「IDE」和「編輯器+編譯器」在一般使用上各有優劣,IDE對比較上層的開發比較有利,而「編輯器+編譯器」的開發方式對底層工程師要做細部調教比較方便。

以我自己現在開發C語言程式的習慣,除非在撰寫與OS提供的API高度相依的(例如winsuck winsock) 之類的狀況不得不用該OS自帶的IDE外,其實大多數開發的時候是在純文字編輯器上先撰寫好程式,再自行透過編譯器編譯後,透過自己撰寫的 Makefile去產生出可執行檔。會這樣使用的原因主要是IDE所附之編譯環境,IDE不時就會自己增加或修改一些編譯參數的設定,甚至自己產生出一些 有問題的Makefile,對我來說與其去花時間使用IDE所產出的bug,還不如自己掌握整個編譯流程,以便根據自己的需求做延伸。

不 過對於剛入門的新手來說,因IDE而起的bug並不多,使用IDE來撰寫對大部分人的入門門檻較低,也因此許多程設課程會使用IDE做開發。現代IDE可 以提供的功能相當的多,包含關鍵字自動補完、除錯工具整合、即時監控測量程式運行時期情形等,其實有些時候使用IDE也是不錯的選擇,尤其是利用 Java、ObjC、C#等高階語言配合OS提供的API開發視窗程式設計時,幾乎都是使用IDE來開發的。但純就C語言來說,IDE可以利用範圍比較 少,故有些老師會不建議使用IDE,但對我個人而言,只要你能自己解決因使用IDE而產生的bug的話,那使用IDE並無不妥。

不論「IDE」或是「編輯器+編譯器」的使用,我個人認為都需要有下列幾點需要注意的
  • 程式編輯
    • 程式碼上色
      • 這真的很重要,不然辨識度會超低的
    • 自動排版
      • 首先,程式碼排版真的很重要,不然你連自己的程式碼都看不懂
      • 但是有時候臨時要加一些東西,你又不想一行行縮排的時候
      • 這時候,身為一個現代良好的編輯器,他要有自動幫你縮排的功能才行
    • 自動補完
      • 自動補完指的有兩個部分,其一是指把先前自己宣告或函式庫定義的變數、函式名稱自動補完。
      • 其二是指只需輸入極少的關鍵字,就可將常用的Code Piece直接補完的功能。
      • 這兩種自動補完對現代的程式設計師相當的重要,尤其當你開發大型程式時,現代主流的命名方式是希望你以變數、函式名稱就可以代表其含意,而盡量降低註解的撰寫。在這樣的思維下,變數與函式名稱不免會命名的很長,因此選用一個能夠幫你自動補完的編輯器是相當重要的
      • 或開發較高階的語言(如Java、ObjC、C#)的時候,許多系統提供的API等名字你不可能全記得,所以非常需要自動補完的功能來輔助
  • 編譯與除錯(在IDE時此部份包含於IDE中,若是選用編輯器+編譯器的作法則可自行選用適合的Compiler和Debugger配著用)
    • 編譯器選用 
      • 你可以自行選用你要的編譯器與其版本(這很重要,因為以後你有可能遇到在某個版本以前才編的過的程式碼Orz)
      • 可以讓你自行下參數直接餵給Compiler
    • 除錯器整合
      • 寫程式有bug很常見,但是要如何debug就是一門藝術
      • 故IDE必須要提供方便的方式來整合除錯器讓你除錯
      • 沒辦法讓你好好除錯的IDE就果斷扔了他吧!
尤其是近年來軟體開發工具的發展,比較先進的開發工具上述幾點都已經做的不錯(well,至少對我來說我覺得還不錯啦),故若能選用符合現代強大的開發工具,對你之後的開發會有相當的助益

接下來,會對各種開發環境會需要知道的事做介紹,以及提供自己對該環境的個人評價

沒有留言:

張貼留言