作者 謝恩銘誓军,公眾號(hào)「程序員聯(lián)盟」(微信號(hào):coderhub)苟鸯。
轉(zhuǎn)載請(qǐng)注明出處同蜻。
原文:http://www.reibang.com/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)爭》)宪躯,就是一個(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)桿直跑」