# 【知識精講】C++程序是如何開發的
## Part1
我們已經知道,程序語言可以分為**機器語言**,**匯編語言**和**高級語言** 三個層次——現階段我們人類開發者能夠直接編寫的是匯編語言和高級語言,絕大多數情況下用到的還是高級語言。
高級語言的語句是由一些英語單詞、數學公式等構成的——對于程序員來說,這些語句相對來說更淺顯易懂,但是機器本身卻只能識別 000 和 111 構成的二進制代碼(也叫**機器碼**)。那么,高級語言是怎么變成二進制代碼的呢?這中間就要有一個過程——需要一個“翻譯器”來幫助我們完成這些事情。
典型的機器碼如下圖所示——這里使用十六進制數表示二進制代碼:

## Part2
具體地說,我們自己用高級語言寫的程序,稱為高級語言源程序,而將其轉化成二進制代碼之后的程序,稱為目標程序——它已經是完全的二進制機器指令了,這個過程稱為編譯。那么,是不是有目標程序就能直接運行了呢?我們需要考慮到,如果一個程序比較大的話,那么它可能要有多個模塊來協作——就算是簡單地向屏幕上輸出一個“Aloha Oe”,你也依然需要調用系統庫里定義好的輸出功能模塊。
所以,我們需要把所有需要的模塊都合并在一起,才能構成一個可以執行的程序——這個就是程序的鏈接過程,鏈接完成之后,才會得到一個可以執行的程序。那么,你肯定要問:編譯和鏈接過程該怎么進行呢?有一些專門的軟件可以完成這個過程,這些軟件被稱為**編譯器(Compiler)** 和**鏈接器(Linker)**。
在編譯和鏈接的過程中,都會對程序中的錯誤進行檢查——只有代碼準確無誤的程序才能編譯成功。如果代碼本身有錯誤的話編譯器就會報錯,如下圖所示。但是需要注意的是,編譯通過,并不代表程序本身是完全正確的——你仍然需要通過調試,確認程序可以正確地運行,才能說你的程序是準確無誤的。

## Part3
除此之外,還有另一種與之類似的軟件,稱為**解釋器**——在介紹什么是“解釋器”之前,我們首先要知道“編譯型語言”與“解釋型語言”的差別。
所謂“編譯型語言”,指的是源程序的代碼寫好之后,編譯器直接把高級語言的源代碼編譯成二進制的機器碼,執行的時候直接運行機器碼就行了——這門課程學習的 C++ 語言,是一種典型的編譯型語言;而“解釋型語言”則與之不同,寫好的代碼不會馬上就被翻譯成機器碼,而是先保存成源程序的代碼文件——等到運行的時候,這些語句才會**由解釋器來一條一條地解釋執行**——很多腳本語言,比如 Python,都屬于解釋型語言。
一般而言,編譯型語言擁有更高的運行效率,而解釋型語言的可移植性更好——此外,還有一些介于兩者之間的語言,比如JAVA/C#,就是先編譯成某種“中間代碼”然后再交由不同平臺的虛擬機解釋執行的。
## Part4
整個程序開發的過程,可以分為這樣的一個流程:設計數據結構與算法->源程序編輯->編譯與連接->測試->調試。
在看到這個流程之前,有的同學可能會覺得,要開發程序,就一定需要專用的“編程軟件”(學名叫做集成開發環境(Integrated Development Environment),簡稱 IDE )才行,有的同學可能還見過 Visual C++ 6.0,或者 Dev-Cpp 之類的軟件。

一款經典的 IDE Code::Blocks
然而,所謂的 IDE ,其實就是把編輯器、編譯器和其他的一系列工具整合在一起的產物——毫無疑問,像 Microsoft Visual Studio 之類的先進的 IDE ,在開發很多大型軟件的時候,確實可以幾十上百倍地提高開發效率。但是實際上,IDE并不是編程活動的必需品——對于初學者來說,只要有用于寫代碼的文本編輯器,和用于編譯代碼的編譯器工具鏈,就已經足夠了。
## Part5
這門課程使用 GNU C++ Compiler 編譯器(也叫 g++ ),它可以在幾乎所有主流的操作系統上運行——為了便于練習,我們建議大家在自己的電腦上安裝和配置相同的環境,然后搭配一款自己喜歡的文本編輯器使用。
Linux 和 Mac OS X 用戶可以使用 Vim 或者 Emacs 等,Windows 用戶可以選擇系統自帶的記事本( Notepad )或者第三方的 Notepad++ 。此外,你還可以選擇 Sublime Text,Atom 或者 Visual Studio Code 等跨平臺工具。這些工具本身各有千秋,如果可能,你都可以試一試,找到你最喜歡、用起來最順手的那個(編輯器沒有“最好”,只有“最適合你”,千萬不要太糾結)。

在Mac OS X 平臺下運行的 Visual Studio Code
最后,我們將向大家介紹如何在自己的電腦上編譯程序——學完一節代碼課之后,你試著在自己的電腦上編譯運行一下:
## Part6
首先,在文本編輯器中寫好代碼,然后保存——類似于 C 語言,所有 C++ 語言的代碼都是以`*.cpp`文件的形式保存在你的電腦上的。比如你寫了一個程序,想要命名為“AlohaOe”,那么這個文件的名字就是`AlohaOe.cpp`。接下來啟動你的操作系統自帶的控制臺(Terminal或者CMD),然后進入到文件所在目錄,輸入以下命令:
~~~
g++ AlohaOe.cpp -o AlohaOe
~~~
其中,第一個參數代表要編譯的文件,`-o`代表輸出,最后一個參數代表你想要讓編譯器輸出可執行文件的名字——這里你可以隨意更改。如果你的程序沒有錯誤的話,那么這條命令執行之后就不會返回任何提示——反之則會報錯并指出你的程序在哪里出了偏差。編譯完成之后就可以試著運行你的程序了——在命令行中輸入`./AlohaOe`或者`AlohaOe`就可以直接啟動你已經編譯好的程序。
- 教材介紹
- 《編程初學入門常識》
- 什么是程序語言
- 【知識精講】編程與編程語言
- 【選擇測試】編程語言分類
- 【知識精講】高級語言分類
- 【選擇測試】編譯與解釋
- 【選擇測試】程序員笑話-Java
- 熟悉鍵盤上用于編程的鍵位
- 【知識精講】認識你的鍵盤
- 【知識精講】中文和英文字符
- 【匹配測試】識別中英文符號
- 【選擇測試】中英文符號的影響
- 【伴隨編程】不要使用中文引號
- 【伴隨編程】不要使用中文分號
- 【伴隨編程】正確地輸入符號
- 【選擇測試】找出程序中的錯誤
- 初始工程師思維
- 【知識精講】二進制思想
- 【選擇測試】程序員笑話-湊整
- 【知識精講】閉合的邏輯
- 【選擇測試】程序員笑話-條件
- 程序員職業與生活
- 【知識精講】程序員的發展方向
- 【知識精講】程序員的裝備
- 【知識精講】程序員的健康
- 【選擇測試】做一名健康的程序員
- 《C++程序設計》
- 前言
- 【知識精講】編程與計算機科學
- 【知識精講】編程與軟件工程
- 【知識精講】如何學習編程
- 你好C++
- 【知識精講】你好,C++
- 【知識精講】C++程序是如何開發的
- 【知識精講】成為一名Power User
- 【伴隨編程】讓我們一起說你好
- 【知識精講】你的第一個C++語言程序
- 【伴隨命令】編譯、運行你的程序
- 【伴隨編程】將變量流式輸出
- 【選擇測試】變量的作用域
- 【知識精講】變量與數據類型
- 【匹配測試】C++語言的入門概念
- 【知識精講】在程序中學會換行
- 【選擇測試】正確地換行
- 簡單數學運算
- 【知識精講】重新認識基本運算
- 【選擇測試】運算符的理解
- 【伴隨編程】做一下簡單的運算
- 【伴隨編程】a 的 n 次方
- 【知識精講】數學函數
- 【伴隨編程】讓C++語言變成計算器
- 【伴隨編程】計算球的體積
- 【匹配測試】數學世界知多少
- 【知識精講】在程序中添加注釋
- 【選擇測試】正確地寫注釋
- 從伴隨輸入到變量地址
- 【伴隨編程】 一個數字復讀機器
- 【選擇測試】理解標準輸入輸出
- 【伴隨編程】一個加法計算器
- 【程序設計】A+B+C問題
- 【伴隨編程】簡單的I/O格式控制
- 【知識精講】地址與取地址符
- 【伴隨編程】看看我們的地址
- 習題一:面積與周長
- 【程序設計】矩形面積與周長
- 【程序設計】三角形面積與周長
- 【程序設計】圓形面積與周長
- 程序中的是與非
- 【知識精講】是非的表示與關系運算
- 【伴隨編程】驗一驗關系運算式
- 【選擇測試】關系運算式求值
- 【知識精講】如果的意義
- 【伴隨編程】分段函數求值
- 【知識精講】如果之后的如果
- 【伴隨編程】五則運算器
- 【選擇測試】分支的嵌套
- 【伴隨編程】問號表達式
- 【知識精講】是非之間的邏輯組合
- 【伴隨編程】判斷閏年
- 【程序設計】日期合法性
- 【知識精講】多路順序結構
- 【知識精講】在程序中學會縮進
- 【選擇測試】正確的縮進
- C++程序中的苦力
- 【知識精講】使用循環結構
- 【選擇測試】對比兩種循環
- 【伴隨編程】使用while循環
- 【填空測試】理解循環結構
- 【知識精講】自減和自增運算符
- 【伴隨編程】使用自增運算符
- 【知識精講】for循環
- 【選擇測試】for循環的使用
- 【程序設計】一大波好玩兒的程序
- 《代碼能力快速提升》
- 《基礎數據結構》
- 《搜索入門》
- 《動態規劃基礎》
- 《數論和基礎數學》
- 《圖和數基礎》