做者 謝恩銘,公衆號「程序員聯盟」。 轉載請註明出處。 原文:www.jianshu.com/p/7f84ae8c7…git
不知道爲何,一直對 C語言有一種很深厚的「情懷」(相似老羅對錘子手機的那種)。程序員
有太多也許,可是能夠確定的是:C語言是一門充滿魅力的編程語言。github
C語言的發明人,「C語言之父」 Dennis Ritchie 在 2011 年去世。很低調,沒有太多新聞報道。同年史蒂夫.喬布斯去世,各界報道鋪天蓋地(固然了,喬布斯也是很偉大的人)。編程
我想說:應該多記念那些低調付出的人。bash
Dennis Ritchie 除了 C語言這項偉大發明(Windows、Linux 和 macOS 操做系統,底層幾乎都用到了 C語言),還與 Ken Thompson 一塊兒研發了 Unix 操做系統(雖然大部分工做是 Ken Thompson 起步的,不事後來 Dennis 用本身發明的 C語言重寫了 Unix 操做系統)。微信
要知道,Unix 操做系統成爲了後來聞名中外的 Linux 操做系統的參考對象,Android 手機底層就是用的修改過的 Linux 系統。蘋果的 macOS 操做系統底層也是類 Unix 系統。咱們用的 iPhone 和 iPad 等的操做系統,底層大部分也是 C語言編寫的。編程語言
不爲了提升編程水平,光爲了感覺大師的風采,光爲了探尋一下咱們天天都在接觸的這門語言,也要學一下這位了不得的人物的傳世傑做:C語言。編輯器
在這個系統課程中,我將帶你們一塊兒探索 C語言的奇妙世界。工具
你也許據說過編程,也許你想要真正明白編程究竟是怎麼一回事。學習
用 C語言編程,是怎麼樣的呢?用 C語言做爲入門編程的第一門語言真的好嗎?咱們能用 C語言作任何事嗎?
這一課就是爲了回答上述可能顯得有點愚蠢但實際上很重要的問題。並且藉着這些問題,你在學完這一課後會找到你真正想要的答案。
在學同樣技術前先了解一下用它能作什麼,不是很好麼?
咱們從最簡單的問題開始:
什麼是編程?
編程意味着「編寫計算機程序」,這些程序能讓你的機器(通常來講是電腦)作你要它作的事情。
實際上,你的電腦裏充滿了各樣的程序:
上圖你們可能有點陌生,不過這是我那一輩(80 後)的人很喜歡玩的經典遊戲 Metal Slug(《合金彈頭》或稱《越南戰爭》),就是一個程序。
簡單來講,在今天的平常生活中,程序隨處可見。大到航空母艦、空間站;小到智能手錶、iPhone,裏面都有各類大大小小的程序。
程序幾乎可讓你用電腦作任何事情。你能夠本身編寫一個革命性的加密軟件,也能夠編寫一個 3D 格鬥遊戲。你的電腦能夠爲你作任何事(除了泡咖啡之類,不過將來應該能夠)。
注意了,我可不是讓你們如今就去寫一個 3D 格鬥遊戲,由於那太複雜了,會讓你手指抽筋的。咱們的課程會按部就班,一開始是最簡單的,可能只是實如今窗口裏顯示一段文字。
說來講去,C語言是什麼呀?
你的計算機(computer,也叫「電腦」)真的是一個奇怪的傢伙,這樣說已經算很給它面子了。咱們給它傳遞命令,只能輸送給它 0 或 1(由於電腦裏面有大大小小的數不勝數的晶體管,而它們被用來作「開關」,0 和 1 正好能夠用來表示「開啓」或「關閉」這兩個狀態,因此電腦最底層其實都是 0 和 1 這樣的二進制碼)。打個比方,我要讓電腦作加法:
「計算 1 + 2 等於多少」。我實際上輸給電腦的是(是我隨便寫的,我並不記得怎麼轉換這句話到二進制碼):
01010011101100110011110101
複製代碼
正如你看到的,這就是你的電腦所會的語言,被稱爲「二進制語言」。它也只會這門語言,能夠看到這門語言徹底不容易理解。
因此,咱們的第一個真正的問題來了:
怎麼纔可以用更簡單的語言來和電腦對話呢,難道只能用 0 和 1 嗎?
你的電腦既不講中文也不講英語。然而,即便最瘋狂的專家也不會真的要去用二進制碼來編寫程序,那簡直使人難以忍受。
因此,咱們的計算機學者們就想到:先用其餘簡單一些、便於理解的語言編寫程序,以後再把它翻譯成電腦的二進制語言。
最不容易的,就是要編寫這樣一個「翻譯」程序。幸好計算機學者們已經把這樣的翻譯程序寫好了,咱們也不必從新作了(着實鬆了一口氣)。因此咱們要作的就是告訴電腦:「我要作加法:1 + 2 等於多少」,這句話會被翻譯成電腦的二進制碼:
01010011101100110011110101
複製代碼
上面我在解釋時都是用的簡單的詞語,但要知道在計算機領域,每樣事情都有特定的術語。這個系列課程中咱們都將使用合適的術語。
這樣有好處,不只能夠顯得你比較「高大上」,並且當你有一天要跟另外一個程序員解釋一些原理,用專業術語纔好。雖然周圍的人可能會把你當「火星人」看,但大可沒必要理會。
上面咱們說過,咱們不可能用 0 和 1 來編寫程序,因此咱們使用「簡化的語言」,按專業術語應該被稱爲「高級語言」。
編程語言有幾個等級,等級越高就越接近於咱們人類的語言(好比英語)。高級語言使用方便,可是也有一些缺陷,以後咱們會看到。
下面列舉一些高級語言:
固然這裏只是列舉經常使用的幾種,要把全部高級語言列出來那得花很多時間。
除了剛纔的高級語言,另外一個咱們要記得的術語是:源代碼。所謂源代碼,就是你用高級語言寫出來的代碼。因此你得先寫出源代碼,而後再把源代碼轉換成機器能理解的二進制碼。
接下來再來學兩個術語:編譯器和編譯。編譯器指的是把源代碼轉爲電腦能理解的二進制碼的工具。這個轉換的過程,稱爲編譯。
對於每一種高級語言,都有對應的不一樣編譯器。固然,也不難理解,由於每種高級語言自己是不一樣的麼,咱們不可能用 C語言的編譯器去編譯 Java 的源代碼。
以後咱們還會看到,即便對於一種高級語言(例如 C語言),也存在好幾種不一樣的編譯器,有 Windows 的編譯器,GNU 的編譯器,等等。這些咱們會在下一課學到。
由編譯器編譯出來的二進制程序被稱爲可執行程序。因此對於 Windows 下的可執行程序,都有一個後綴名 .exe(就是 EXEcutable 這個英語單詞的前三個字母,表示「可執行的」)。
以前說過,高級語言有不少種。咱們應該在它們之中特別選擇一門來做爲入門編程的語言麼?
這是大問題。
咱們有以下選擇:
很高級的語言:很是容易使用,能夠說適合普羅大衆。其中,有 Python,Ruby,等。一般來講,用這些語言寫程序會比較快捷。然而它們常須要一些額外的文件(好比解釋器)才能執行。
沒有那麼高級的語言:這類的高級語言(C語言是一種),誠然不容易編寫。可是學習這樣的語言能夠幫助更深入地理解編程的原理和電腦運做的原理。以後你再要學一門新語言會很容易,你徹底能夠自學。
此外,C語言很是流行。大量咱們平常使用的軟件都是用 C語言編寫的。計算機學科也常常用 C語言做爲教授編程的語言。
你可能會問,有一個問題我不明白:「C語言和 C++語言有什麼區別呢?」
能夠說,C語言和 C++ 比較相似,都是使用很是廣的語言。爲了更好地說明它們分別是如何誕生的,咱們來講點歷史好了:
在電腦重達幾噸,大小像一大間屋子那樣的時代,計算機領域的前輩們開始發明一門編程語言:Algol。
技術不斷進步,他們又發明了一門新的語言:CPL,以後發展成爲 BCPL,後來被稱爲 B語言。
後來,終於發展成了 C語言。
又過了一段時間,人們想要在 C語言上加一些東西(一些改進,若是你非要這麼說的話)。這門新語言誕生了,就是 C++,是基於 C語言發明的。C++ 在 C語言的基礎上加了很多新的東西,使咱們能夠用不一樣的方式編程。
注意:這並非說 C++ 比 C 更優秀,只是可讓咱們用不一樣的方式編程。也不是說 C語言相比就是一門老舊的語言,不,C語言今天仍然很經常使用,它是咱們所用的 Windows,macOS,Linux,Unix 等操做系統的基礎,並且在嵌入式領域也是主要的編程語言。
這個問題可能困擾不少人。是否須要成爲有幾年研究經驗的數學家才能學編程呢?
答案是:毫不。學編程並不須要在數學方面有多大造詣,固然數學好對學編程也是大有裨益的(好比編寫 3D 遊戲,就須要有一些空間幾何知識)。其實最經常使用的也就是四則運算了:加、減、乘、除。
那編程有什麼難的呢?
誠然,不是那麼可怕。可是可能須要知道電腦工做的機制,爲了更好的理解咱們用 C語言作的事。
一個程序員通常有如下特質:
耐心:不少時候,你的程序不是第一次就能順利運行的,要堅持不懈。
邏輯意識:不須要有不少數學知識,可是要會思考。對於認爲編程垂手可得的人,對不起了。
冷靜:急躁起來也不能拿榔頭敲電腦啊。要讓程序運行,可不能這樣作。
簡單說來,學習編程沒有特別須要的技能。一個對數學一竅不通的人也能夠成爲很好的程序員,關鍵是要有耐心思考問題。不少人後來都發現本身愛上編程了,變得喜好思考。
爲了實現計算機程序,咱們須要用電腦懂得的語言來編寫程序。
有不少種編程語言,咱們能夠按等級來分。通常越高級的語言,越容易掌握,可是在最終的程序效能上可能會差一些。
咱們要一塊兒來學習的 C語言被認爲是高級語言裏偏低級的。它是全世界最著名和最經常使用的語言。
源代碼是一系列指令,用編程語言編寫。
編譯器是一個把咱們的源代碼轉換成二進制碼(0 和 1)的程序,轉換以後的二進制程序能夠被咱們的電腦執行。咱們在 Windows 操做系統裏常常遇到的 .exe 文件就是二進制文件,裏面可沒有源代碼。
編程並不須要很高深的數學知識,除非你的程序要調用一些數學公式,好比加密程序。可是,編程須要你有邏輯意識,而且有條不紊。
今天的課就到這裏,一塊兒加油吧!
下一課:C語言探索之旅 | 第一部分第二課:工欲善其事,必先利其器
我是 謝恩銘,公衆號「程序員聯盟」運營者,慕課網精英講師 Oscar 老師,終生學習者。 熱愛生活,喜歡游泳,略懂烹飪。 人生格言:「向着標杆直跑」