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

2.1 認識程序

旅行前,我們要先熟悉地名,知道去哪里旅行,將會經過哪里。學習編程語言也一樣,在學習之前要先了解程序、調試、語法錯誤、運行錯誤、語義錯誤等知識。

2.1.1 程序

我們都知道,出門旅行肯定要選擇交通工具,現在常用的交通工具有飛機、火車、輪船、汽車等,我們會根據自己的喜好和一些其他因素選擇對應的交通工具。

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

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

程序是用語言寫成的。語言分高級語言和低級語言。

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

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

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

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

解釋型語言是邊讀源程序邊執行。高級語言就是源代碼。解釋器每次會讀入一段源代碼,并執行它,接著再讀入并執行,如此重復,直到結束,圖2-1顯示了解釋器的結構。這個有點類似在鄉村里搭乘公交,只要碰到路上有人等公交,就停下來載人。

圖2-1 解釋型語言的執行方式

編譯型語言是將源代碼完整地編譯成目標代碼后才能執行,以后在執行時不需要再編譯。圖2-2顯示了一個編譯器的結構,這個有點類似我們乘坐的直達車,所有要乘車的人都從起點上車,中途不再搭載其他乘客。

圖2-2 編譯型語言的執行方式

2.1.2 調試

每當遠游時,司機肯定要做幾件事情,如檢查發動機是否正常、檢查油箱、檢查各項安全系統和液壓系統等,為的是盡可能減少在路途中發生意外情況。

我們編程也是一樣的,需要經常做檢查。有一些問題編譯器會幫助我們檢查出來,問題查出后,簡單的可以直接解決,對于稍微復雜的,需要通過調試來解決。

程序是很容易出錯的。程序錯誤被稱為bug,查找bug的過程稱為調試(debugging)。我們在第1章中已經介紹過一個很簡單的調試示例。

2.1.3 語法錯誤

在生活中有時會碰到這樣的情況,你本應買今天去某地的火車票,已經買好了,但當進站檢票時,系統告訴你票不是今天的,這時你才發現購買車票時輸錯了日期。

程序中這種錯誤比生活中出現的次數多很多,稱為語法錯誤(syntax errors)。Python程序在語法正確的情況下才能運行,否則解釋器會顯示一條錯誤信息。語法指的是程序的結構和此結構的規則。比如第1章的('Hello, world! '),括號中的單引號是成對的,執行時才能正確執行。如果輸入('Hello, world! )或(Hello, world! ')就會報錯,這屬于語法錯誤。

我們在閱讀文章或聽人講話時,可以容忍大多數語法錯誤,不過Python并不如此寬容。程序中只要出現一處語法錯誤,Python就會顯示錯誤信息并退出,從而無法通過編譯。就如我們進站,一旦票不滿足進站要求,就無法進入一樣。

在編程生涯的開始階段,可能每踏出一步都會碰到大量語法方面的錯誤,隨著經驗的增加,犯錯會減少,踩過坑后,后面遇到類似的坑就能快速應對了。

2.1.4 運行錯誤

我們可能在奔跑的交通工具內愉悅地欣賞著遠途的風景,但此時交通工具突然慢慢停下來了,并且司機對大家宣布說,交通工具拋錨了。例如,出現輪胎破損、沒油了、發動機壞了、撞車事故等。

在Python中經常會遇到類似的錯誤,稱之為運行時錯誤(runtime errors)。

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

運行時錯誤一般在代碼量偏多時才容易遇到。

2.1.5 語義錯誤

經常乘坐交通工具,難免有乘錯車的情況出現,比如你本應該乘坐801路車,卻坐上了802路車,結果到達了不同的地方。

在Python中經常會發生類似的問題,此類問題稱為語義錯誤(semantic errors)。

程序即使有語義錯誤,也能正常運行,不會產生任何錯誤信息,但得到的結果和我們預料的不一致。發生這種錯誤一般是我們對語句的運行機制了解得不夠透徹,自以為它應該如此運行,實際上卻不是這樣。還有可能是你解決問題的思路本身就是錯的,寫的程序當然是錯的。

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

主站蜘蛛池模板: 湖州市| 阳曲县| 清流县| 定兴县| 阿鲁科尔沁旗| 尚志市| 马尔康县| 正定县| 岳西县| 宾阳县| 泾阳县| 徐水县| 米脂县| 奇台县| 萝北县| 休宁县| 赤峰市| 绥化市| 繁峙县| 毕节市| 开封县| 禹城市| 固阳县| 浦北县| 高安市| 镇原县| 五河县| 江达县| 伊川县| 凤翔县| 长寿区| 凉城县| 信宜市| 杨浦区| 泾阳县| 双江| 新丰县| 卓尼县| 鱼台县| 顺平县| 宽城|