編程入門必看:帶你零基礎(chǔ)了解編程和編程語言,入門應(yīng)該學(xué)什么?
編程入門
什么是編程
我們通過有固定格式和固定詞匯的“語言”來控制他人,讓他人為我們做事情。語言有很多種,包括漢語、英語、法語、韓語等,雖然他們的詞匯和格式都不一樣,但是可以達(dá)到同樣的目的,我們可以選擇任意一種語言去控制他人。

同樣,我們也可以通過”語言“來控制計(jì)算機(jī),讓計(jì)算機(jī)為我們做事情,這樣的語言就叫做編程語言(Programming Language)。
編程語言也有固定的格式和詞匯,我們必須經(jīng)過學(xué)習(xí)才會(huì)使用,才能控制計(jì)算機(jī)。
總結(jié):編程語言是用來控制計(jì)算機(jī)的一系列指令(Instruction),它有固定的格式和詞匯(不同編程語言的格式和詞匯不一樣),必須遵守,否則就會(huì)出錯(cuò),達(dá)不到我們的目的。
這些具有特定含義的詞匯、語句,按照特定的格式組織在一起,就構(gòu)成了源代碼(Source Code),也稱源碼或代碼(Code)。
那么,編程語言肯定規(guī)定了源代碼中每個(gè)詞匯、語句的含義,也規(guī)定了它們?cè)撊绾谓M織在一起,這就是語法(Syntax)。它與我們學(xué)習(xí)英語時(shí)所說的“語法”類似,都規(guī)定了如何將特定的詞匯和句子組織成能聽懂的語言。
編寫源代碼的過程就叫做編程(Program)。從事編程工作的人叫程序員(Programmer)

編程語言的分類
低級(jí)語言
1.機(jī)器語言
第一代計(jì)算機(jī)語言:機(jī)器能直接識(shí)別的語言的叫做機(jī)器語言。
起初,為了讓計(jì)算機(jī)按我們的想法工作,程序員不得不編寫計(jì)算機(jī)可以讀懂看明白直接執(zhí)行的機(jī)器碼,也就是01010101的樣子,打孔字條就是這么干的。用打沒打孔來代表0和1。OK,計(jì)算機(jī)沒問題,它能無障礙閱讀,可程序員就難受了。拍腦袋也能想得到這里面的問題。容易出錯(cuò),效率低,編寫困難,維護(hù)困難??赡芫褪莻€(gè)簡(jiǎn)單的打印“hello world”,也許就需要好幾米長(zhǎng)的字條。這簡(jiǎn)直就是原始社會(huì),生產(chǎn)效率低下的令人發(fā)指。
發(fā)生個(gè)火災(zāi)什么的,直接Over。唯一的好處就是無需轉(zhuǎn)換,可直接執(zhí)行,但相對(duì)缺點(diǎn)來講,這點(diǎn)好處完全可以被忽略。
由1和0組成,非常難學(xué)習(xí)掌握,難閱讀,容易出錯(cuò),效率低,編寫困難,維護(hù)困難,且嚴(yán)重地依賴于具體的計(jì)算機(jī),所以可移植性差,重用性差。換了機(jī)器就用不了。
2.匯編語言
二代計(jì)算機(jī)語言匯編語言(符號(hào)語言)
在匯編語言中,用助記符代替機(jī)器指令的操作碼,用地址符號(hào)或標(biāo)號(hào)代替指令或操作數(shù)的地址為了減輕機(jī)器語言帶給軟件工程師的不適應(yīng),人們對(duì)機(jī)器語言進(jìn)行了升級(jí)和改進(jìn):用一些容易理解和記憶的字母,單詞來代替一個(gè)特定的指令。仍然可移植性差,重用性差。

高級(jí)語言
第三代計(jì)算機(jī)語言,高級(jí)語言
在編程語言經(jīng)歷了機(jī)器語言,匯編語言等更新之后,人們發(fā)現(xiàn)了限制程序推廣的關(guān)鍵因素——程序的可移植性。需要設(shè)計(jì)一個(gè)能夠不依賴于計(jì)算機(jī)硬件,能夠在不同機(jī)器上運(yùn)行的程序。這樣可以免去很多編程的重復(fù)過程,提高效率,同時(shí)這種語言又要接近于數(shù)學(xué)語言或人的自然語言。
在計(jì)算機(jī)還很稀缺的50年代,誕生了第一個(gè)高級(jí)編程語言。語法和結(jié)構(gòu)更類似漢字或者普通英文,且由于遠(yuǎn)離對(duì)硬件的直接操作,使得一般人經(jīng)過學(xué)習(xí)之后都可以編程。高級(jí)語言并不是特指的某一種具體的語言,而是包括很多編程語言。1954年,第一個(gè)完全意義的高級(jí)編程語言FORTRAN問世了,他完全脫離了特定機(jī)器的局限性,是第一個(gè)通用性的編程語言。
高級(jí)語言免去很多編程的重復(fù)過程,提高效率,語法和結(jié)構(gòu)更類似人的自然語言,一般人經(jīng)過學(xué)習(xí)之后都可以編程,完全脫離了特定機(jī)器的局限性,是通用性的編程語言。
我們編寫的源代碼是人類語言,我們自己能夠輕松理解;但是對(duì)于計(jì)算機(jī)硬件(CPU),源代碼就是天書,根本無法執(zhí)行,計(jì)算機(jī)只能識(shí)別某些特定的二進(jìn)制指令,在程序真正運(yùn)行之前必須將源代碼轉(zhuǎn)換成二進(jìn)制指令。
所謂的二進(jìn)制指令,也就是機(jī)器碼,是 CPU 能夠識(shí)別的硬件層面的“代碼”,簡(jiǎn)陋的硬件(比如古老的單片機(jī))只能使用幾十個(gè)指令,強(qiáng)大的硬件(PC 和智能手機(jī))能使用成百上千個(gè)指令。
然而,究竟在什么時(shí)候?qū)⒃创a轉(zhuǎn)換成二進(jìn)制指令呢?不同的編程語言有不同的規(guī)定:
有的編程語言要求必須提前將所有源代碼一次性轉(zhuǎn)換成二進(jìn)制指令,也就是生成一個(gè)可執(zhí)行程序(Windows 下的 .exe),比如C語言、C++、Golang、Pascal(Delphi)、匯編等,這種編程語言稱為編譯型語言,使用的轉(zhuǎn)換工具稱為編譯器。
有的編程語言可以一邊執(zhí)行一邊轉(zhuǎn)換,需要哪些源代碼就轉(zhuǎn)換哪些源代碼,不會(huì)生成可執(zhí)行程序,比如?Python、JavaScript、PHP、Shell、MATLAB等,這種編程語言稱為解釋型語言,使用的轉(zhuǎn)換工具稱為解釋器。
簡(jiǎn)單理解,編譯器就是一個(gè)“翻譯工具”,類似于將中文翻譯成英文、將英文翻譯成俄文。但是,翻譯源代碼是一個(gè)復(fù)雜的過程,大致包括詞法分析、語法分析、語義分析、性能優(yōu)化、生成可執(zhí)行文件等五個(gè)步驟,期間涉及到復(fù)雜的算法和硬件架構(gòu)。解釋器與此類似
Java 和 C#是一種比較奇葩的存在,它們是半編譯半解釋型的語言,源代碼需要先轉(zhuǎn)換成一種中間文件(字節(jié)碼文件),然后再將中間文件拿到虛擬機(jī)中執(zhí)行。Java 引領(lǐng)了這種風(fēng)潮,它的初衷是在跨平臺(tái)的同時(shí)兼顧執(zhí)行效率;C# 是后來的跟隨者,但是 C# 一直止步于 Windows 平臺(tái),在其它平臺(tái)鮮有作為。

解釋型語言
類似同聲翻譯,需要有一個(gè)解釋器,解釋器會(huì)讀取程序代碼,一邊翻譯一邊執(zhí)行,詳細(xì)如下:
?1、執(zhí)行效率低
解釋型語言的實(shí)現(xiàn)中,翻譯器并不產(chǎn)生目標(biāo)機(jī)器代碼,而是產(chǎn)生易于執(zhí)行的中間代碼。
這種中間代碼與機(jī)器代碼是不同的,中間代碼的解釋是由軟件支持的,不能直接使用硬件,
軟件解釋器通常會(huì)導(dǎo)致執(zhí)行效率較低。
2、開發(fā)效率高
用解釋型語言編寫的程序是由另一個(gè)可以理解中間代碼的解釋程序執(zhí)行的,與編譯程序不同的是,
解釋程序的任務(wù)是逐一將源程序的語句解釋成可執(zhí)行的機(jī)器指令,不需要將源程序翻譯成目標(biāo)代碼再執(zhí)行。
解釋程序的優(yōu)點(diǎn)是當(dāng)語句出現(xiàn)語法錯(cuò)誤時(shí),可以立即引起程序員的注意,而程序員在程序開發(fā)期間就能進(jìn)行校正。
3、跨平臺(tái)性強(qiáng)
代碼運(yùn)行是依賴于解釋器,不同平臺(tái)有對(duì)應(yīng)版本的解釋器,所以解釋型的跨平臺(tái)性強(qiáng)
其他
對(duì)于解釋型Basic語言,需要一個(gè)專門的解釋器解釋執(zhí)行Basic程序,每條語句只有在執(zhí)行時(shí)才被翻譯,
這種解釋型語言每執(zhí)行一次就翻譯一次,因而效率低下。一般地,動(dòng)態(tài)語言都是解釋型的,
例如:Tcl、Perl、Ruby、VBScript、JavaScript等

編譯型語言
類似谷歌翻譯,是把程序所有代碼編譯成計(jì)算機(jī)能識(shí)別的二進(jìn)制指令,之后操作系統(tǒng)會(huì)拿著編譯好的二進(jìn)制指令直接操作硬件,詳細(xì)如下:
1、執(zhí)行效率高
編譯是指在應(yīng)用源程序執(zhí)行之前,就將程序源代碼“翻譯”成目標(biāo)代碼(即機(jī)器語言),
因此其目標(biāo)程序可以脫離其語言環(huán)境獨(dú)立執(zhí)行,使用比較方便,執(zhí)行效率較高。
2、開發(fā)效率低
應(yīng)用程序一旦需要修改,必須先修改源代碼,然后重新編譯、生成新的目標(biāo)文件才能執(zhí)行,
而在只有目標(biāo)文件而沒有源代碼,修改會(huì)很不方便。所以開發(fā)效率低于解釋型。
3、跨平臺(tái)性差
編譯型代碼是針對(duì)某一個(gè)平臺(tái)翻譯的,當(dāng)前平臺(tái)翻譯的結(jié)果無法拿到不同的平臺(tái)使用,針對(duì)不同的平臺(tái)必須重新編譯,即跨平臺(tái)性差。
其他
現(xiàn)在大多數(shù)的編程語言都是編譯型的。
編譯程序?qū)⒃闯绦蚍g成目標(biāo)程序后保存在另一個(gè)文件中,該目標(biāo)程序可脫離編譯程序直接在計(jì)算機(jī)上多次運(yùn)行。
大多數(shù)軟件產(chǎn)品都是以目標(biāo)程序形式發(fā)行給用戶的,不僅便于直接運(yùn)行,同時(shí)又使他人難于盜用其中的技術(shù)。
C、C++、Ada、Pascal都是編譯實(shí)現(xiàn)的。
C語言與C++
C語言是面向過程的,而C++是面向?qū)ο蟮摹?strong>編程入門就選C語言,同時(shí)C語言也是大學(xué)計(jì)算機(jī)相關(guān)專業(yè)必修課之一!
C和C++的區(qū)別:
C是一個(gè)結(jié)構(gòu)化語言,它的重點(diǎn)在于算法和數(shù)據(jù)結(jié)構(gòu)。C程序的設(shè)計(jì)首要考慮的是如何通過一個(gè)過程,對(duì)輸入(或環(huán)境條件)進(jìn)行運(yùn)算處理得到輸出(或?qū)崿F(xiàn)過程(事務(wù))控制)。
C++,首要考慮的是如何構(gòu)造一個(gè)對(duì)象模型,讓這個(gè)模型能夠契合與之對(duì)應(yīng)的問題域,這樣就可以通過獲取對(duì)象的狀態(tài)信息得到輸出或?qū)崿F(xiàn)過程(事務(wù))控制。 所以C與C++的最大區(qū)別在于它們的用于解決問題的思想方法不一樣。之所以說C++比C更先進(jìn),是因?yàn)椤?設(shè)計(jì)這個(gè)概念已經(jīng)被融入到C++之中 ”。
C與C++的最大區(qū)別:在于它們的用于解決問題的思想方法不一樣。之所以說C++比C更先進(jìn),是因?yàn)椤?設(shè)計(jì)這個(gè)概念已經(jīng)被融入到C++之中 ”,而就語言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,錯(cuò)!算法是程序設(shè)計(jì)的基礎(chǔ),好的設(shè)計(jì)如果沒有好的算法,一樣不行。而且,“C加上好的設(shè)計(jì)”也能寫出非常好的東西。

學(xué)好C++可以從這幾個(gè)方面去檢測(cè):
1:兼容C語言的部分;
所以學(xué)好C++,必須以學(xué)好C語言為前提。同理:學(xué)好上層語言如PHP,JS,java,又必須要以C/C++為前提。違背這個(gè)原則,你會(huì)遇到無法超越的技術(shù)瓶頸。你的編程職業(yè)生涯就會(huì)打折。比如學(xué)PHP的時(shí)候,難度不在于PHP的if...else...這些語法,而在于比如PHP的面向?qū)ο?,PHP的接口,數(shù)據(jù)庫的優(yōu)化,服務(wù)器的負(fù)載均衡,集群技術(shù),網(wǎng)絡(luò)編程等等。
2:面向?qū)ο缶幊趟枷耄侯悾^承,多態(tài)這些的產(chǎn)生淵源。
3:泛型機(jī)制。
4:模板機(jī)制:函數(shù)模板,類模板
5:它的標(biāo)準(zhǔn)庫STL里面的數(shù)據(jù)結(jié)構(gòu)和算法,這些內(nèi)容你主要是要知道它們有什么實(shí)現(xiàn)方案,雖然不要你去寫,但是你要懂得來源,這樣用起來才放心。如:怎么實(shí)現(xiàn)容器vector,list,map的?
6:非標(biāo)準(zhǔn)庫,如:Boost。
當(dāng)然也是它里面的數(shù)據(jù)結(jié)構(gòu)和算法。這些內(nèi)容它幫你寫好了,你很多時(shí)候其實(shí)只是在使用接口而已。所以,熟悉它,是一件簡(jiǎn)單的事。關(guān)鍵是要探索它的實(shí)現(xiàn)方案。
7:做幾個(gè)項(xiàng)目,包括控制臺(tái)的,圖形化的,以及進(jìn)一步延伸的QT編程。
8:游戲編程
9:Linux操作系統(tǒng)
雖然不需要你在Linux上開發(fā),但是你要懂Linux,而它里面涉及到的東西就多了。比如進(jìn)程、線程、管道、隊(duì)列、消息、通信等等。

學(xué)好C++,不是你開發(fā)了幾個(gè)控制臺(tái)程序,也不是開發(fā)了幾個(gè)項(xiàng)目就可以宣告結(jié)束的,它是一個(gè)長(zhǎng)期的戰(zhàn)爭(zhēng),需要有打硬仗的心理準(zhǔn)備。你要把它總結(jié)成一棵活著的知識(shí)樹。這棵樹的意義在于:當(dāng)你幾年過后,語法基本上忘記光了的時(shí)候,來看這顆知識(shí)樹能瞬間找到感覺。

另外,UP在主頁上傳了一些學(xué)習(xí)C/C++編程的視頻教程,有興趣或者正在學(xué)習(xí)的小伙伴一定要去看一看哦!會(huì)對(duì)你有幫助的~