官术网_书友最值得收藏!

2.1 認(rèn)識(shí)程序

旅行前,我們要先熟悉地名,知道去哪里旅行,將會(huì)經(jīng)過哪里。學(xué)習(xí)編程語言也一樣,在學(xué)習(xí)之前要先了解程序、調(diào)試、語法錯(cuò)誤、運(yùn)行錯(cuò)誤、語義錯(cuò)誤等知識(shí)。

2.1.1 程序

我們都知道,出門旅行肯定要選擇交通工具,現(xiàn)在常用的交通工具有飛機(jī)、火車、輪船、汽車等,我們會(huì)根據(jù)自己的喜好和一些其他因素選擇對(duì)應(yīng)的交通工具。

編程語言也一樣,我們選擇一門編程語言就相當(dāng)于選擇一種交通工具,那么,編程語言的“交通”工具是什么呢?是程序。

程序是指根據(jù)語言提供的指令按照一定邏輯順序?qū)Λ@得的數(shù)據(jù)進(jìn)行運(yùn)算,并最終返回給我們的指令和數(shù)據(jù)的組合。在這里,運(yùn)算的含義是廣泛的,既包括數(shù)學(xué)計(jì)算之類的操作(如加、減、乘、除),又包括尋找和替換字符串之類的操作。數(shù)據(jù)依據(jù)不同的需要組成不同的形式,處理后的數(shù)據(jù)也可能以另一種方式體現(xiàn)。

程序是用語言寫成的,語言分高級(jí)語言和低級(jí)語言。

低級(jí)語言有時(shí)叫機(jī)器語言或匯編語言。計(jì)算機(jī)真正“認(rèn)識(shí)”并能夠執(zhí)行的代碼,在我們看來是一串0和1組成的二進(jìn)制數(shù)字,這些數(shù)字代表指令和數(shù)據(jù)。早期的計(jì)算機(jī)科學(xué)家就是用這些枯燥乏味的數(shù)字編程。低級(jí)語言的出現(xiàn)是計(jì)算機(jī)程序語言的一大進(jìn)步,它用英文單詞或單詞的縮寫代表計(jì)算機(jī)執(zhí)行的指令,使編程的效率和程序的可讀性都有了很大提高,但它仍然和機(jī)器硬件關(guān)聯(lián)緊密,不符合人類的語言和思維習(xí)慣,而且要想把用低級(jí)語言寫的程序移植到其他平臺(tái),就必須重寫。

高級(jí)語言的出現(xiàn)是程序語言發(fā)展的必然結(jié)果,也是計(jì)算機(jī)語言向人類的自然語言和思維方式逐步靠近和模擬的結(jié)果。由于高級(jí)語言是對(duì)人類邏輯思維的描述,用高級(jí)語言寫程序會(huì)感到比較自然,讀起來也比較容易,因此現(xiàn)在大部分程序都是用高級(jí)語言寫的。

高級(jí)語言設(shè)計(jì)的目的是讓程序按照人類的思維和語言習(xí)慣書寫,是面向人的,而不是面向機(jī)器。我們用著方便,機(jī)器卻無法讀懂,更談不上運(yùn)行。所以,用高級(jí)語言寫的程序必須經(jīng)過“翻譯”程序的處理,將其轉(zhuǎn)換成機(jī)器可執(zhí)行的代碼,才能運(yùn)行在計(jì)算機(jī)上。如果想把高級(jí)語言寫的程序移植到其他的平臺(tái),只需在它的基礎(chǔ)上做少量更改就可以了。

高級(jí)語言翻譯成機(jī)器代碼有兩種方法,即解釋和編譯。

解釋型語言是邊讀源程序邊執(zhí)行。高級(jí)語言就是源代碼。解釋器每次會(huì)讀入一段源代碼,并執(zhí)行它,接著再讀入并執(zhí)行,如此重復(fù),直到結(jié)束,圖2-1顯示了解釋型語言的執(zhí)行方式。這個(gè)有點(diǎn)類似在鄉(xiāng)村里搭乘公交,只要碰到路上有人等公交,就停下來載人。

編譯型語言是將源代碼完整地編譯成目標(biāo)代碼后才能執(zhí)行,以后在執(zhí)行時(shí)不需要再編譯。圖2-2顯示了編譯型語言的執(zhí)行方式,這個(gè)有點(diǎn)類似我們乘坐的直達(dá)車,所有要乘車的人都從起點(diǎn)上車,中途不再搭載其他乘客。

圖2-1 解釋型語言的執(zhí)行方式

圖2-2 編譯型語言的執(zhí)行方式

2.1.2 調(diào)試

每當(dāng)遠(yuǎn)游時(shí),司機(jī)肯定要做幾件事情,如檢查發(fā)動(dòng)機(jī)是否正常、檢查油箱、檢查各項(xiàng)安全系統(tǒng)和液壓系統(tǒng)等,為的是盡可能減少在路途中發(fā)生意外情況。

編程也是一樣的,需要經(jīng)常做檢查。有一些問題編譯器會(huì)幫助我們檢查出來,問題查出后,簡單的可以直接解決,對(duì)于稍微復(fù)雜的,需要通過調(diào)試來解決。

程序是很容易出錯(cuò)的。程序錯(cuò)誤被稱為bug,查找bug的過程稱為調(diào)試(debugging)。我們?cè)诘?章中已經(jīng)介紹過一個(gè)很簡單的調(diào)試示例。

2.1.3 語法錯(cuò)誤

在生活中有時(shí)會(huì)碰到這樣的情況,你本應(yīng)買今天去某地的火車票,已經(jīng)買好了,但當(dāng)進(jìn)站檢票時(shí),系統(tǒng)告訴你票不是今天的,這時(shí)你才發(fā)現(xiàn)購買車票時(shí)輸錯(cuò)了日期。

程序中這種錯(cuò)誤比生活中出現(xiàn)的次數(shù)多很多,稱為語法錯(cuò)誤(syntax errors)。Python程序在語法正確的情況下才能運(yùn)行,否則解釋器會(huì)顯示一條錯(cuò)誤信息。語法指的是程序的結(jié)構(gòu)和此結(jié)構(gòu)的規(guī)則,比如第1章的('Hello,world!'),括號(hào)中的單引號(hào)是成對(duì)的,執(zhí)行時(shí)才能正確執(zhí)行。如果輸入('Hello,world!)或(Hello,world!')就會(huì)報(bào)錯(cuò),這屬于語法錯(cuò)誤。

我們?cè)陂喿x文章或聽人講話時(shí),可以容忍大多數(shù)語法錯(cuò)誤,不過Python并不如此寬容。程序中只要出現(xiàn)一處語法錯(cuò)誤,就會(huì)顯示錯(cuò)誤信息并退出,從而無法通過編譯。就如我們進(jìn)站,一旦票不滿足進(jìn)站要求,就無法進(jìn)入一樣。

在編程生涯的開始階段,可能每踏出一步都會(huì)碰到大量語法方面的錯(cuò)誤,隨著經(jīng)驗(yàn)的增加,犯錯(cuò)會(huì)減少,踩過“坑”后,后面遇到類似的“坑”就能快速應(yīng)對(duì)了。

2.1.4 運(yùn)行錯(cuò)誤

我們?cè)诒寂艿慕煌üぞ邇?nèi)愉悅地欣賞著遠(yuǎn)途的風(fēng)景,但此時(shí)交通工具突然慢慢停下來了,并且司機(jī)對(duì)大家宣布說,交通工具拋錨了。例如,出現(xiàn)輪胎破損、沒油了、發(fā)動(dòng)機(jī)壞了、撞車事故等。

在Python中經(jīng)常會(huì)遇到類似的錯(cuò)誤,稱之為運(yùn)行時(shí)錯(cuò)誤(runtime errors)。

即使是看起來完美無缺的程序,在運(yùn)行的過程中也會(huì)出現(xiàn)錯(cuò)誤。有人說,計(jì)算機(jī)不是善于精確計(jì)算嗎?確實(shí)如此。不過錯(cuò)的不是計(jì)算機(jī),而是我們?nèi)祟悺S?jì)算機(jī)說到底是人類設(shè)計(jì)的,是我們所用的工具,和電視機(jī)、汽車從本質(zhì)上來說是一樣的。鑒于現(xiàn)在計(jì)算機(jī)軟硬件的理論水平、工業(yè)制造水平、使用者的水平等一些內(nèi)在、外在的因素,出現(xiàn)錯(cuò)誤并不稀奇,且程序越復(fù)雜,出現(xiàn)異常的概率越大。異常的種類很多,如內(nèi)存用盡、除數(shù)為零的除法等都可能導(dǎo)致異常。Python為了把錯(cuò)誤的影響降至最低,提供了專門的異常處理語句。

運(yùn)行時(shí)錯(cuò)誤一般在代碼量偏多時(shí)才容易遇到。

2.1.5 語義錯(cuò)誤

經(jīng)常乘坐交通工具,難免有乘錯(cuò)車的情況出現(xiàn),比如你本應(yīng)該乘坐801路車,卻坐上了802路車,結(jié)果到達(dá)了不同的地方。

在Python中經(jīng)常會(huì)發(fā)生類似的問題,此類問題稱為語義錯(cuò)誤(semantic errors)。

程序即使有語義錯(cuò)誤,也能正常運(yùn)行,不會(huì)產(chǎn)生任何錯(cuò)誤信息,但得到的結(jié)果和我們預(yù)料的不一致。發(fā)生這種錯(cuò)誤一般是我們對(duì)語句的運(yùn)行機(jī)制了解得不夠透徹,自以為它應(yīng)該如此運(yùn)行,實(shí)際上卻不是這樣。還有可能是你解決問題的思路本身就是錯(cuò)的,寫的程序當(dāng)然是錯(cuò)的。

查找語義錯(cuò)誤并不像我們坐錯(cuò)了車那么容易,它可能需要你根據(jù)結(jié)果進(jìn)行推理,不過推理的過程沒有那么簡單易行,需要查看程序輸出,并嘗試弄明白到底做了什么。

主站蜘蛛池模板: 读书| 开远市| 济源市| 遂宁市| 正镶白旗| 双柏县| 宜川县| 洮南市| 全州县| 河西区| 维西| 镇安县| 武乡县| 朝阳区| 江西省| 嘉祥县| 龙海市| 南投县| 关岭| 汉中市| 平陆县| 乌鲁木齐市| 木兰县| 准格尔旗| 灵武市| 鄂尔多斯市| 绥江县| 宜丰县| 两当县| 利辛县| 云霄县| 九江县| 临澧县| 什邡市| 西乌| 肃北| 湄潭县| 宁夏| 治县。| 横山县| 林西县|