
作者 謝恩銘,公眾號(hào)「程序員聯(lián)盟」(微信號(hào):coderhub)。
轉(zhuǎn)載請(qǐng)注明出處。
原文:http://www.itdecent.cn/p/7f84ae8c7ef5
內(nèi)容簡介
- 開宗明義
- 什么是編程?
- 總結(jié)
- 第一部分第二課預(yù)告
1. 開宗明義
不知道為什么,一直對(duì) C語言有一種很深厚的“情懷”(類似老羅對(duì)錘子手機(jī)的那種)。
- 也許因?yàn)?C語言是很多前輩諄諄教誨說一定要學(xué)一下的一門編程語言;
- 也許因?yàn)?C語言自 1972 年誕生以來歷經(jīng)數(shù)十年依然獨(dú)領(lǐng)風(fēng)騷,位列編程語言排行榜前三;
- 也許因?yàn)閹缀跛胁僮飨到y(tǒng)(Windows、Unix、Linux,macOS,Android、iOS,等),底層都有大量的 C語言代碼;
- 也許因?yàn)?C語言在嵌入式領(lǐng)域是主要的編程語言;
- 也許因?yàn)樵谥T多編程語言中,C語言的入門是比較難的;
- 也許因?yàn)樾枰?5 到 10 年的時(shí)間,你才能說自己精通了 C語言;
- 也許因?yàn)閷W(xué)好了 C語言,一般就能輕松入門其他語言。
有太多也許,但是可以肯定的是:C語言是一門充滿魅力的編程語言。
C語言的發(fā)明人,“C語言之父” Dennis Ritchie 在 2011 年去世。很低調(diào),沒有太多新聞報(bào)道。同年史蒂夫.喬布斯去世,各界報(bào)道鋪天蓋地(當(dāng)然了,喬布斯也是很偉大的人)。
我想說:應(yīng)該多紀(jì)念那些低調(diào)付出的人。
Dennis Ritchie 除了 C語言這項(xiàng)偉大發(fā)明(Windows、Linux 和 macOS 操作系統(tǒng),底層幾乎都用到了 C語言),還與 Ken Thompson 一起研發(fā)了 Unix 操作系統(tǒng)(雖然大部分工作是 Ken Thompson 起步的,不過后來 Dennis 用自己發(fā)明的 C語言重寫了 Unix 操作系統(tǒng))。
要知道,Unix 操作系統(tǒng)成為了后來舉世聞名的 Linux 操作系統(tǒng)的參考對(duì)象,Android 手機(jī)底層就是用的修改過的 Linux 系統(tǒng)。蘋果的 macOS 操作系統(tǒng)底層也是類 Unix 系統(tǒng)。我們用的 iPhone 和 iPad 等的操作系統(tǒng),底層大部分也是 C語言編寫的。
不為了提高編程水平,光為了感受大師的風(fēng)采,光為了探尋一下我們每天都在接觸的這門語言,也要學(xué)一下這位了不起的人物的傳世杰作:C語言。
在這個(gè)系統(tǒng)課程中,我將帶大家一起探索 C語言的奇妙世界。
2. 什么是編程?
你也許聽說過編程,也許你想要真正明白編程到底是怎么一回事。
用 C語言編程,是怎么樣的呢?用 C語言作為入門編程的第一門語言真的好嗎?我們能用 C語言做任何事嗎?
這一課就是為了回答上述可能顯得有點(diǎn)愚蠢但實(shí)際上很重要的問題。而且借著這些問題,你在學(xué)完這一課后會(huì)找到你真正想要的答案。
在學(xué)一樣技術(shù)前先了解一下用它能做什么,不是很好么?
我們從最簡單的問題開始:
什么是編程?
編程意味著“編寫計(jì)算機(jī)程序”,這些程序能讓你的機(jī)器(一般來說是電腦)做你要它做的事情。
實(shí)際上,你的電腦里充滿了各樣的程序:
- 計(jì)算器是一個(gè)程序;
- 文本編輯器也是一個(gè)程序;
- 你的聊天軟件(QQ,微信,等)也是程序;
- 你玩的游戲也是程序。

上圖大家可能有點(diǎn)陌生,不過這是我那一輩(80 后)的人很喜歡玩的經(jīng)典游戲 Metal Slug(《合金彈頭》或稱《越南戰(zhàn)爭(zhēng)》),就是一個(gè)程序。
簡單來說,在今天的日常生活中,程序隨處可見。大到航空母艦、空間站;小到智能手表、iPhone,里面都有各種大大小小的程序。
程序幾乎可以讓你用電腦做任何事情。你可以自己編寫一個(gè)革命性的加密軟件,也可以編寫一個(gè) 3D 格斗游戲。你的電腦可以為你做任何事(除了泡咖啡之類,不過未來應(yīng)該可以)。
注意了,我可不是讓大家現(xiàn)在就去寫一個(gè) 3D 格斗游戲,因?yàn)槟翘珡?fù)雜了,會(huì)讓你手指抽筋的。我們的課程會(huì)循序漸進(jìn),一開始是最簡單的,可能只是實(shí)現(xiàn)在窗口里顯示一段文字。
說來說去,C語言是什么呀?
編程,用什么語言呢?
你的計(jì)算機(jī)(computer,也叫“電腦”)真的是一個(gè)奇怪的家伙,這樣說已經(jīng)算很給它面子了。我們給它傳遞命令,只能輸送給它 0 或 1(因?yàn)殡娔X里面有大大小小的數(shù)不勝數(shù)的晶體管,而它們被用來做“開關(guān)”,0 和 1 正好可以用來表示“開啟”或“關(guān)閉”這兩個(gè)狀態(tài),所以電腦最底層其實(shí)都是 0 和 1 這樣的二進(jìn)制碼)。打個(gè)比方,我要讓電腦做加法:
“計(jì)算 1 + 2 等于多少”。我實(shí)際上輸給電腦的是(是我隨便寫的,我并不記得怎么轉(zhuǎn)換這句話到二進(jìn)制碼):
01010011101100110011110101
正如你看到的,這就是你的電腦所會(huì)的語言,被稱為“二進(jìn)制語言”。它也只會(huì)這門語言,可以看到這門語言完全不容易理解。
所以,我們的第一個(gè)真正的問題來了:
怎么才能夠用更簡單的語言來和電腦對(duì)話呢,難道只能用 0 和 1 嗎?
你的電腦既不講中文也不講英語。然而,即使最瘋狂的專家也不會(huì)真的要去用二進(jìn)制碼來編寫程序,那簡直令人難以忍受。
所以,我們的計(jì)算機(jī)學(xué)者們就想到:先用其他簡單一些、便于理解的語言編寫程序,之后再把它翻譯成電腦的二進(jìn)制語言。
最不容易的,就是要編寫這樣一個(gè)“翻譯”程序。幸虧計(jì)算機(jī)學(xué)者們已經(jīng)把這樣的翻譯程序?qū)懞昧?,我們也沒必要重新做了(著實(shí)松了一口氣)。所以我們要做的就是告訴電腦:“我要做加法:1 + 2 等于多少”,這句話會(huì)被翻譯成電腦的二進(jìn)制碼:
01010011101100110011110101
一些術(shù)語
上面我在解釋時(shí)都是用的簡單的詞語,但要知道在計(jì)算機(jī)領(lǐng)域,每樣事情都有特定的術(shù)語。這個(gè)系列課程中我們都將使用合適的術(shù)語。
這樣有好處,不僅可以顯得你比較“高大上”,而且當(dāng)你有一天要跟另一個(gè)程序員解釋一些原理,用專業(yè)術(shù)語才好。雖然周圍的人可能會(huì)把你當(dāng)“火星人”看,但大可不必理會(huì)。
上面我們說過,我們不可能用 0 和 1 來編寫程序,所以我們使用“簡化的語言”,按專業(yè)術(shù)語應(yīng)該被稱為“高級(jí)語言”。
編程語言有幾個(gè)等級(jí),等級(jí)越高就越接近于我們?nèi)祟惖恼Z言(比如英語)。高級(jí)語言使用方便,但是也有一些缺陷,之后我們會(huì)看到。
下面列舉一些高級(jí)語言:
- C
- C++
- Java
- Swift
- Python
- JavaScript
- PHP
- Go
當(dāng)然這里只是列舉常用的幾種,要把所有高級(jí)語言列出來那得花不少時(shí)間。
除了剛才的高級(jí)語言,另一個(gè)我們要記得的術(shù)語是:源代碼。所謂源代碼,就是你用高級(jí)語言寫出來的代碼。所以你得先寫出源代碼,然后再把源代碼轉(zhuǎn)換成機(jī)器能理解的二進(jìn)制碼。
接下來再來學(xué)兩個(gè)術(shù)語:編譯器和編譯。編譯器指的是把源代碼轉(zhuǎn)為電腦能理解的二進(jìn)制碼的工具。這個(gè)轉(zhuǎn)換的過程,稱為編譯。
對(duì)于每一種高級(jí)語言,都有對(duì)應(yīng)的不同編譯器。當(dāng)然,也不難理解,因?yàn)槊糠N高級(jí)語言本身是不同的么,我們不可能用 C語言的編譯器去編譯 Java 的源代碼。
之后我們還會(huì)看到,即使對(duì)于一種高級(jí)語言(例如 C語言),也存在好幾種不同的編譯器,有 Windows 的編譯器,GNU 的編譯器,等等。這些我們會(huì)在下一課學(xué)到。
由編譯器編譯出來的二進(jìn)制程序被稱為可執(zhí)行程序。所以對(duì)于 Windows 下的可執(zhí)行程序,都有一個(gè)后綴名 .exe(就是 EXEcutable 這個(gè)英語單詞的前三個(gè)字母,表示“可執(zhí)行的”)。
為什么選擇學(xué)習(xí) C語言
之前說過,高級(jí)語言有很多種。我們應(yīng)該在它們之中特別選擇一門來作為入門編程的語言么?
這是大問題。
我們有如下選擇:
很高級(jí)的語言:非常容易使用,可以說適合普羅大眾。其中,有 Python,Ruby,等。通常來說,用這些語言寫程序會(huì)比較快捷。然而它們常需要一些額外的文件(比如解釋器)才能執(zhí)行。
沒有那么高級(jí)的語言:這類的高級(jí)語言(C語言是一種),誠然不容易編寫。但是學(xué)習(xí)這樣的語言可以幫助更深刻地理解編程的原理和電腦運(yùn)作的原理。之后你再要學(xué)一門新語言會(huì)很容易,你完全可以自學(xué)。
此外,C語言非常流行。大量我們?nèi)粘J褂玫能浖际怯?C語言編寫的。計(jì)算機(jī)學(xué)科也經(jīng)常用 C語言作為教授編程的語言。
你可能會(huì)問,有一個(gè)問題我不明白:“C語言和 C++語言有什么區(qū)別呢?”
可以說,C語言和 C++ 比較類似,都是使用非常廣的語言。為了更好地說明它們分別是如何誕生的,我們來說點(diǎn)歷史好了:
在電腦重達(dá)幾噸,大小像一大間屋子那樣的時(shí)代,計(jì)算機(jī)領(lǐng)域的前輩們開始發(fā)明一門編程語言:Algol。
技術(shù)不斷進(jìn)步,他們又發(fā)明了一門新的語言:CPL,之后發(fā)展成為 BCPL,后來被稱為 B語言。
后來,終于發(fā)展成了 C語言。
又過了一段時(shí)間,人們想要在 C語言上加一些東西(一些改進(jìn),如果你非要這么說的話)。這門新語言誕生了,就是 C++,是基于 C語言發(fā)明的。C++ 在 C語言的基礎(chǔ)上加了不少新的東西,使我們可以用不同的方式編程。
注意:這并不是說 C++ 比 C 更優(yōu)秀,只是可以讓我們用不同的方式編程。也不是說 C語言相比就是一門老舊的語言,不,C語言今天仍然很常用,它是我們所用的 Windows,macOS,Linux,Unix 等操作系統(tǒng)的基礎(chǔ),而且在嵌入式領(lǐng)域也是主要的編程語言。
編程艱辛么?
這個(gè)問題可能困擾很多人。是否需要成為有幾年研究經(jīng)驗(yàn)的數(shù)學(xué)家才能學(xué)編程呢?
答案是:絕不。學(xué)編程并不需要在數(shù)學(xué)方面有多大造詣,當(dāng)然數(shù)學(xué)好對(duì)學(xué)編程也是大有裨益的(比如編寫 3D 游戲,就需要有一些空間幾何知識(shí))。其實(shí)最常用的也就是四則運(yùn)算了:加、減、乘、除。
那編程有什么難的呢?
誠然,不是那么可怕。但是可能需要知道電腦工作的機(jī)制,為了更好的理解我們用 C語言做的事。
一個(gè)程序員一般有以下特質(zhì):
耐心:很多時(shí)候,你的程序不是第一次就能順利運(yùn)行的,要堅(jiān)持不懈。
邏輯意識(shí):不需要有很多數(shù)學(xué)知識(shí),但是要會(huì)思考。對(duì)于認(rèn)為編程輕而易舉的人,對(duì)不起了。
冷靜:急躁起來也不能拿榔頭敲電腦啊。要讓程序運(yùn)行,可不能這樣做。
簡單說來,學(xué)習(xí)編程沒有特別需要的技能。一個(gè)對(duì)數(shù)學(xué)一竅不通的人也可以成為很好的程序員,關(guān)鍵是要有耐心思考問題。很多人后來都發(fā)現(xiàn)自己愛上編程了,變得喜愛思考。
3. 總結(jié)
為了實(shí)現(xiàn)計(jì)算機(jī)程序,我們需要用電腦懂得的語言來編寫程序。
有很多種編程語言,我們可以按等級(jí)來分。一般越高級(jí)的語言,越容易掌握,但是在最終的程序效能上可能會(huì)差一些。
我們要一起來學(xué)習(xí)的 C語言被認(rèn)為是高級(jí)語言里偏低級(jí)的。它是全世界最著名和最常用的語言。
源代碼是一系列指令,用編程語言編寫。
編譯器是一個(gè)把我們的源代碼轉(zhuǎn)換成二進(jìn)制碼(0 和 1)的程序,轉(zhuǎn)換之后的二進(jìn)制程序可以被我們的電腦執(zhí)行。我們?cè)?Windows 操作系統(tǒng)里經(jīng)常遇到的 .exe 文件就是二進(jìn)制文件,里面可沒有源代碼。
編程并不需要很高深的數(shù)學(xué)知識(shí),除非你的程序要調(diào)用一些數(shù)學(xué)公式,比如加密程序。但是,編程需要你有邏輯意識(shí),并且有條不紊。
4. 第一部分第二課預(yù)告
今天的課就到這里,一起加油吧!
下一課:C語言探索之旅 | 第一部分第二課:工欲善其事,必先利其器
我是 謝恩銘,公眾號(hào)「程序員聯(lián)盟」(微信號(hào):coderhub)運(yùn)營者,慕課網(wǎng)精英講師 Oscar 老師,終生學(xué)習(xí)者。
熱愛生活,喜歡游泳,略懂烹飪。
人生格言:「向著標(biāo)桿直跑」