【C++教程】01.基本概念
第一章 基本概念
前言
這一章或許會比較枯燥,想直接實際操作C++編碼的可以直接跳過。此文章有許多個人心得,非原則性的說法見諒,如有常識性的錯誤,歡迎提出。
1.計算機與二進制
眾所周知,計算機和數學密切相關,屬于一門科學。如物理、生物和化學一樣,通過邏輯定義來解釋世間的事物。就說物體的運動規律吧,前有亞里士多德提出“力是物體運動的原因”,后有牛頓提出“力是改變物體運動的原因”,再有愛因斯坦說“世界不存在力,質量造成時空彎曲,從而形成了物體的運動軌跡”。所以計算機實際是一種,以二進制為基礎形成的邏輯方式。計算機所顯示的圖像、音頻、文本,皆是由二進制所表示;數據通過電線傳輸通過電信號的高低形成了二進制序列;數據在硬盤上存儲也是通過改變磁碟的磁性來實現的,最終識別磁性轉化為二進制序列。所以對計算機和二進制的理解,是非常重要的,或許在C語言老師講的時候并不會認識到這一點是多么的基礎和重要。
所謂進制就是表示數字的方法,滿幾進一位。比如常用的十進制,也就日常生活用到的,0-9來表示數字,如果人有12個手指,或者能夠很方便的使用腳趾,可能現在使用的就是12進制或者20進制。計算機的基礎是二進制,也就是只有0和1兩個數字。之所以采用二進制,是由于電路便于識別高低電平,半導體的硬件特性可以組合形成邏輯運算。比如代碼中的邏輯與、邏輯或、邏輯非運算,在電路中可以用晶體管組合形成,玩過《我的世界》的同學應該知道在游戲里面可以通過紅石電路實現簡單的數值計算。現在的CPU集成的晶體管數量已經在100億的數量級了,所以額外說一句,在代碼中糾結一個加法和乘法的效率區別,對于新手來說是沒有必要的,反而是錯誤的。
下面來計算一下幾個常用的值,1位二進制可以表示0或1,也就是1位二進制可以表示2個值。如果我們要表示2這個數字,就必須進一位,用兩位二進制表示,也就是10。所以表示3的二進制為11,表示4的二進制為100。那么不難得出二進制位數和可表示值的數量關系:
其中N為可表示值的范圍,n為二進制的位數。那么8位二進制可表示的值數量為2的8次方,也就是256。由于0占一個位置,所以8位二進制表示從0開始的數字,就可以表示[0,255]。如果用一半表示負數那么就是[-128,127],當然以上只是常用的表示范圍,要是自己想的話也可以表示[1,256]或者[10000,10255],反正只能區分256個值而已(注意這里中括號表示的是閉區間,如果是開區間則用小括號表示,和數學上的概念一致)。
8位二進制就稱為一個字節,關于數字和類型的大小后面的章節再詳細介紹。
2.編譯原理和圖靈機
當老師講到編譯原理的時候,編譯器經過了N個階段,最終才生成了可執行程序,這個時候我們已經迫不及待了,對程序編譯的過程毫不感興趣,實際上這一階段也需要理解一下。
我們所鍵入的C++代碼是我們能夠看懂的(或許久了也看不懂了),而計算機只能識別二進制,所以編譯器即是一個將高級語言(C++)的代碼按一定規則,轉化為機器可識別的機器碼的工具。也就是高級語言->匯編語言->機器語言的過程。幸好編譯器幫我們實現了這些功能,不然學編程必然是門檻極高的一件事。可是現在由于底層堆疊的層數太多,導致碼農叢生,這也就不奇怪了。不理解計算機的原理,不接觸C語言,我覺得應該難以成為高手,當然除了只是簡單利用編程進行一些計算和研究的人,沒有必要研究那么透徹。再底層一些的工作也就是接觸匯編與操作系統,做CPU相關的研發。不過國內的發展順序和國外恰好相反了,一開始的計算機通過卡片打孔來輸入數據,也就是機器語言,后面為了方便人理解和編寫,就有了匯編語言。最初的操作系統也由匯編語言寫成,而匯編語言不夠結構化,才有了高級語言。由于程序規模越來越大,也就有了更多的框架與結構,比如C++,以面向對象編程思想和方法進行開發。而腳本(虛擬機)語言為更上一層的事物,它并不直接編譯成機器語言,而是直接調用已編譯好的機器碼,比如Java與C#。
但是萬變不離其宗,所有在計算機上執行的程序都是一層一層向下調用,最后通過二進制的邏輯運算,CPU等硬件的處理,最終依賴了真實世界的法則。
圖靈和馮諾依曼被稱為計算機之父,圖靈提出的圖靈機就像現代計算機理論上的執行方式。程序像一條長紙帶,紙帶上記錄了符號,機器通過讀取當前紙帶位置的符號來做運算將結果記錄到紙帶上,并且移動紙帶到特定位置。而馮諾依曼計算機則是圖靈機的工程化實現,構成了現代計算機的核心理論。其實你只要用心想一想,自己面對的顯示器、手機所呈現的內容,到底是如何由一些芯片電路驅動的,就會覺得計算機實際上是一種理論與實踐的結合,軟件只不過是硬件上的抽象理論,而硬件才實現了軟件所需的功能。就像汽車華麗的外表掩蓋了內部的機器運作,如果要研究如何制造汽車,光關注于軟件層面的理論,那是萬萬不得行的,所以學習編程語言當然也需要稍微理解背后的原理。至于開發國產CPU,實現操作系統,發明一門編程語言,實現計算機硬件一整套的生產,這些事情就需要天才的您來完成了,我的能力有限。
3.層級結構
層級結構是非常常用的計算機結構,無論是硬件與軟件,層次都很明顯。就像堆積木一樣,從最底層的內容不斷積累才形成了現在的計算機體系。就說硬件層面上的數據保存吧,最基本的是硬盤->內存->CPU,由于數據最終需要通過CPU處理,硬盤和內存的二進制數據就需要想辦法傳輸給CPU,由于(機械)硬盤通過磁盤保存數據,讀取數據需要硬盤里的磁頭高速旋轉來讀取數據,所以等硬盤的數據傳遞給CPU就太慢了。內存作為主要的數據緩存,以不同的硬件實現來保存數據,并且可以快速的傳遞給CPU,當然缺點就是容量更小,且斷電不能保存。而CPU實際還帶有高速緩存,也就是CPU之內的“內存”,速度更比內存快,但容量也更小。CPU的高速緩存一般分3級,最常用的數據放置到一級緩存,這樣就能最快的讀取。如果放不下就只能往后排,最后就只能放到內存。內存如果也放不下,程序的編寫者就需要動態的加載數據到內存,當然用時從硬盤加載到內存就會很慢了。這也是為什么有些游戲需要加載時間,下面舉例:
小明點開一個程序,這時程序(就像一張紙條)從硬盤讀取到內存,再從初始位置執行,通過CPU的運算,改變處理的位置,并改變程序在內存中的數據。這樣就是程序執行的基本過程。當然這只是大概的邏輯,其中細節就太多了。每一個細節都被無數程序員研究過,所以咱們就不研究那么細節了。
當然上面的層次還可以附加,比如大家所說的“云計算”、“云游戲”。其實原理就是數據通過網絡保存在其他電腦上,或者通過其他電腦處理數據,自己只輸入數據和接收結果。而“分布計算”是通過網絡連通許多的電腦來一起計算。
通過網絡用其他電腦保存數據,就可以代替硬盤的作用,當然就可以視做硬盤之下的一個層次。
軟件上的層次也很明顯,如第二節所說的,最基本的是機器識別的機器語言,然后是匯編語言,然后是高級語言。而軟件開發時,操作系統提供了API接口隱藏了與硬件的交互,讓一般的程序員不需要和硬件打交道。再之上有通用的類庫,比如解析png、jpg格式的圖像庫,使用字體的freetype庫,3D開發的DirectX庫,這些可以算一個層次。再之上就是游戲引擎、UI界面庫等。有些游戲提供mod功能,也如同微信小程序,是在應用之上提供的開發功能,也可以算一個層次。這些就像一整條產業鏈,作為個人很難每一個都精通,當然也很難撼動現有的體系。要從頭做起,也是不太可能的事情。
4.計量單位
咱們終于可以說一些比較客觀的東西了,一些有固定定義的內容~
首先1位二進制,這個叫1位,如同一個開關可以表示兩個狀態,也可以叫做1bit。
8位叫做1個字節,也就是1byte。而我們經??吹降腒B單位,即是kilobyte(千字節)。但是在程序員眼里1024才是整數,所以實際上1KB = 1024byte。
所以:
除了字節的常用說法外,還有字的說法,也就是WORD,這個實際是兩個字節。DWORD是Double WORD的縮寫,所以實際是4個字節?,F在常用DWORD表示顏色,在各種顏色代碼里我們可以看到0xffff0000或者#afafaf之類的寫法,實際這就是占4個字節的十六進制數字。
5.C++是什么
C++如同數學一般,是定義的一套規則。至于編譯器如何編譯是編譯器的事情,與C++無關。你只需要按照我規定的語法行事即可。所以C++是跨平臺的,無論什么操作系統都可以使用,不過這個也要看你如何使用,如果在Windows平臺使用VS編譯器,并且使用WindowsSDK提供的API,那么就是依賴了平臺。不過依賴平臺是必須的操作,就像你在中國混就得按中國的規矩來。一般的做法是為不同的操作系統寫不同的代碼,不依賴操作系統的代碼就可以不變。
C++的前身是C語言,C語言由貝爾實驗室于1972年研發出來。最開始C++名字叫c with class,也即是帶類的C語言。所以C++基本是兼容C語言的,不過卻多了很多語法。而且C++的標準(也就是語法規則)在不斷的更新,最新的是C++ 20版本,不過對于新手來說可以不用關心這些。
在2010年的時候我在新華文軒買了我的第一本C++書,不過接下來好幾年都沒看明白,直到高三的時候有了些感覺。為何我要選擇學C++呢,因為我看到網上說C++比較適合做游戲,于是就入了坑?,F在我認為C++確實是游戲行業的不二選擇(或許國內不是),C++也比較適合大型軟件的開發,最重要的原因是我認為如果不會C語言,就不太可能成為高手,不會面向對象也難以跟上時代。雖然Java、C#和許多腳本語言比C++簡單很多,也能夠開發很多有用的軟件。但是吧,要深入研究計算機編程,學C++應該是比較好的。
結語
本章大概說了一些基本常識,如果不太理解應該是很正常的,很多詞匯我并沒有具體解釋,一下子就會犯迷糊。不要由此失去了學C++的信心,這只是一個大概的論述。
總結
以上是生活随笔為你收集整理的【C++教程】01.基本概念的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 定点定时抛物效果实现
- 下一篇: 【C++教程】02.环境配置