1. 程式人生 > >下鄉掃盲C語言 Chapter 1

下鄉掃盲C語言 Chapter 1

list window 實時 查看 參數 template 應該 成功 上進

  這一章我們不講太深的東西,我只會解釋某些基本概念,這些基礎知識將對讀者的日後學習有很大幫助。

  實際上,我們要從VC6.0開頭。

0: VC 6.0?

  我有理由相信,絕大多數讀者的第一次上機實踐,第一個helloworld程序,都是在VC 6.0上進行的。國內大部分教材,老師的課件,也以其VC 6.0作為標準。很多學生會在很長的時間裏,堅持使用這個來自遙遠的1998年,早已被微軟遺忘的IDE。我將借用VC 6.0解釋一些基本概念。

  首先,VC 6.0是什麽呢?VC 代表 Microsoft Visual C++,是Microsoft公司推出的以C++語言為基礎的開發Windows環境程序,面向對象的可視化集成編程系統

。這段黑體字指出兩點,第一,VC是一個集成開發環境(Integrated Development Environment),IDE就是一個集成 代碼編輯器,編譯器,調試器,可視化工具 等一系列編程工具的軟件,不妨想象這是一個工具箱,裏面的工具應有盡有。第二,VC並不是為開發C語言應用設計的,甚至也不是為開發C++語言應用而設計的,它是為"以C++語言為基礎的開發Windows環境程序"而設計的軟件。

  VC只是一個兼容了ANIS C(C89)的工具,然而不幸的是,它既不適合用來開發一個僅使用C語言的應用,也不適合用來開發Windows程序。我們現在可以提一句,"6.0"這個版本號來自於VC 6.0包含的"MFC 6.0"(MFC: Microsoft Foundation classes),這是微軟過去用C++設計的,用來開發Windows程序的一些庫。不幸的是這個庫如今幾乎被開發者們拋棄了,現在有很多比它更新,更好的東西,何必浪費生命在MFC上呢。

  如今已經有了很多更新,更好的IDE,VC 6.0是徹底的過時了。

  如果電腦夠好,請換VS2017(很吃配置),VS支持ANSI C,並提供了一些擴展的函數,如果追求"純粹"的C語言,也可以選裝Clang插件。否則可以用codeblock+gcc(具體安裝,配置請自行搜索資料學習)。至於linux用戶,再見了您那。

1: IDE 是啥?代碼編輯器?編譯器?

  想理解為什麽編寫一個程序需要這麽多軟件,讀者必須回到遙遠的二十世紀,體驗一下如何過去的程序員是如何編寫程序的。接下來我將宣布一個好消息和一個壞消息。壞消息是,截止這篇博客發表的時間,人類還沒能成功地設計出時間機器。好消息是,我們還有linux。為了演示,筆者使用VMware Workstation安裝了一個Ubuntu虛擬機(Ubuntu 是 Linux的一種"發行版",具體細節過於復雜,但可以暫時認為這就是Linux),並將在控制臺模式演示如何只使用鍵盤來編寫,編譯,調試一個helloworld程序(Ubuntu實際上已經有了圖形界面,但我們只用控制臺模式做演示)。

  我們將使用三種工具,這三種工具在大部分Linux系統中都是預裝好的

  1. vi 代碼編輯器。就像Windows系統中的"記事本"程序,Linux系統也為我們提供了一種編輯單純文本的軟件,通常就是vi。我們需要用這樣的程序來編寫代碼。

  2.GCC 編譯器。 這個程序處理我們編寫的代碼,通過編譯和鏈接,把原本只是文本的代碼轉換為一個可執行文件。只有可執行文件才能運行。

  3.GDB 調試器。 有時我們希望能按步執行程序,查看某些變量是否符合預期。這時我們就用到調試器,調試器可以讓我們調試程序的運行,檢測錯誤,檢測代碼的效率。

  

第一步,登錄系統。

技術分享圖片

第二步,我們找一個文件夾來放我們的文件,我們登錄到linux控制臺時,控制臺的工作目錄是當前用戶的根目錄。使用 ls(list) 指令,列出當前用戶目錄下的文件和文件夾。

                        技術分享圖片

第三步,用 cd 指令進入文件夾(沒有截到圖),這個文件夾是隨便選的。

    cr@ubuntu:~$ cd Templates

第四步,用 touch 指令新建一個C語言源文件 helloworld.c。然後用 vi 來編輯這個新建的文本。(事實是,直接使用第二個命令,也可以新建一個文本的)

                        技術分享圖片

第五步, 編寫代碼並保存。

                        技術分享圖片

第六步,用gcc編譯,註意這裏使用了兩個可選的參數 ,‘-g‘ 表示應生成調試信息,-o 後緊跟 helloworld 表示輸出文件名為 helloworld(註意沒有後綴名。若不使用 ‘-o‘,輸出文件名為默認的a.out)

第七步,編譯完成,沒有錯誤信息。緊跟著,我們執行編譯出的helloworld,控制臺輸出"helloworld",程序無誤。

                        技術分享圖片

第八步,我們希望能單步運行程序,以調試和查看一些信息。我們使用gdb來調試helloworld

                        技術分享圖片

第九步,使用 list 命令,查看源代碼。我們在第三行設置一個斷點,使用 run 命令來執行程序到第一個斷點。隨後使用 next 命令按行執行,直到程序結束。

                        技術分享圖片

                        技術分享圖片

                        技術分享圖片

  任何一個讀到這裏的讀者都應該體會到了,在過去沒有圖形界面時,程序員們想要編寫一個程序是怎樣地困難。他們不得不用一個程序來編寫代碼(代碼編輯器), 一個程序來編譯代碼(編譯器), 一個程序來調試編譯後的程序(調試器)。如果他們想要一個圖表來看一看程序運行過程中,對內存,CPU的占用,他們就不得不額外寫一個程序,在控制臺用ASCII 字符來打印圖表。(可視化工具)。幸運的是,如今我們有了IDE,在大部分情況下,我們只要從頭到尾地使用IDE就可以了。但不幸的是,在特定環境下IDE反而不適用,例如,VS會在我們編寫程序時悄悄進行編譯,以提供實時的代碼提示,錯誤提示。然而當我們編寫的代碼量大到驚人的地步(某些商業軟件的源碼可遠超數十MB),這時直接在VS裏改動代碼,VS的編譯就會占用極大內存和CPU時間。所以,這時就需要先好編寫代碼,再編譯調試。我建議各位讀者不要只滿足於一個順手的IDE,最好對其它工具也了解一些。

2.代碼是怎麽變成程序的

  代碼只是單純的文字而已。如果我們打開一個txt,寫一個helloworld進去,它能執行嗎?不能,因為它只是一個文本,我們一向說,‘.c‘是源文件,‘.h‘是頭文件。但實際上,後綴名無關緊要,在windows系統中,後綴名只是向試圖打開這個文件的程序說明這個文件的類型。但事實是,你在VC 6.0裏新建的 ‘.c‘,實際上就是一個文本文件,它和‘.txt‘一點區別都沒有。(雖然我這麽說,但請讀者不要試圖直接在txt或者Microsoft Word裏寫代碼,這裏實際上還有編碼格式的問題)。我們可以用一句非常簡單的話回答標題的問題,代碼進到編譯器裏,出來就變成了程序。

  但編譯器做了什麽呢?它做了兩件事,一是編譯,而是鏈接。

  編譯的部分是,編譯器把你編寫的每一個 ‘.c‘ 編譯成一個 ‘.o‘(中間文件),將能處理的代碼都翻譯成匯編代碼。但特別的是,如果一個函數不是在某個源文件中定義的,卻在這個源文件使用了,編譯器就會去查看這個源文件的頭文件是否包含了這個函數的聲明,如果找到了,就在此做一個標記。稍後,是鏈接的部分,編譯器試圖將每個中間文件與他們依賴的其它中間文件鏈接在一起,並正確改寫之前做標記的地方,使整個程序中,每一個變量,每一個函數的聲明和定義都是完整的,每一次調用函數都符合聲明,否則就會編譯失敗。

  一旦程序的鏈接完成,編譯器就把它打包成一個可執行文件,在Windows中,你得到一個後綴名為‘.exe‘的PE文件(Portable Executable)。而在Linux中,後綴名是沒有意義的,可選擇的,所以你得到一個ELF文件(Executable and Linkable File)。操作系統會知道,如何適當地把這個exe加載到內存中去,按行執行匯編代碼。於是程序可以正確的執行。

這一章就到這裏,我希望讀者讀完這篇文章能對於一些概念有較生動的理解

1. IDE

2. 編譯器

3. 調試器

4. 編譯,鏈接

下鄉掃盲C語言 Chapter 1