oeasy教您玩轉(zhuǎn)python - 004 - # 調(diào)試程序
調(diào)試程序 ??
回憶上次內(nèi)容
py
的程序都是寫在明面上的所有需要執(zhí)行的事情都明著寫到了
py
文件中用
python3
解釋py
文件進行執(zhí)行可以下載人家寫好的
py
文件下載的
py
文件可以直接讀懂編寫程序的人怎么掙錢呢?
開源
Python 程序確實是直接就能看到源代碼的
不能加密既是缺點也是優(yōu)點
缺點:
無法保密
誰都能看見和改寫
傳統(tǒng)的軟件賣的是序列號
思路是以前許可證的思路
由一個核心節(jié)點進行授權(quán)
其他用戶得到某些許可
甚至是持證搶劫的許可

現(xiàn)代的許可證 license 主要都是賦予用戶更多權(quán)利
比如 GPL 許可證
GPL
GPL 又稱為 Copyleft
這是一種英語的調(diào)侃
因為 Copyright 的那個 right 有多個含義
用作 copyright 的時候
right 是權(quán)利的意思
但它同時還是“右邊”的意思
所以和他相反的就是 Copyleft
表示這是和 Copyright 是走另一邊的
GPL 授權(quán)對被授權(quán)者是有要求的,它重點強調(diào):
第一:和大部分開源軟件一樣,作品放在這里,你可以用,作者不為任何物理損失負責
第二:如果你,基于這個作品衍生了新的作品,那么這個新的“作品”,必須符合 GPL 協(xié)議,否則你就失去原作品的授權(quán)
第三,符合 GPL 協(xié)議的作品,在提供給它的使用者的時候,必須同時提供該作品的 GPL 部分的源代碼,不能對使用者做出限定

這聽起來很繞
其實本來是想知道開放了源代碼程序員是怎么掙錢的???
現(xiàn)狀
目前國內(nèi)市場定制開發(fā)軟件的需求越來越少
現(xiàn)在更多的是網(wǎng)站和移動應(yīng)用
把代碼捂在自己手里是沒有用的
源代碼的開放是發(fā)展的趨勢
開放源代碼可以讓更多人才參與開發(fā)、修改和傳播
linux、debian、vim、python 的源代碼大家都能看到和參與
這樣的個人軟件開發(fā)者主導(dǎo)的項目依靠人民戰(zhàn)爭戰(zhàn)勝了軟件巨頭
參與的人越多
知名度越高
項目越活越
越有可能留得下來
讓更多的人知道和參與
個人也因為參與的項目而更知名
不但軟件
硬件、游戲、甚至虛擬角色歌姬等等方面
開源項目也越來越多

不過時代的洪流是從最早的水滴開始的
最早的python是由Guido開發(fā)的
當時 Guido 如何面對如何的抉擇呢?

時代
最早 Guido 確實曾經(jīng)在 CWI 工作
CWI是荷蘭的數(shù)學與計算機科學國家研究所

他希望有一種語言能夠像C語言那樣
全面調(diào)用計算機的功能接口
又能像shell那樣,輕松的編程
荷蘭的CWI 數(shù)學和計算機國家研究所開發(fā)了一種ABC語言
當時范羅蘇姆在CWI工作,并參與到ABC語言的開發(fā)
他將自己所知的一切語言設(shè)計知識都傾注在這個項目上
盡管已經(jīng)具備了良好的可讀性和易用性
但ABC語言最終還是沒有流行起來。
確實是在那里出現(xiàn)的 ABC 給 后來的 python 很大啟發(fā)
Guido 后來去了 cnri
荷蘭的國家研究中心

研究項目的經(jīng)費確實是 cnri 出的
95 年當時還沒有興起開源運動
發(fā)展
當時的許可證是收費的
guido 想把他做成開源的
但是沒有立場
畢竟 cnri 花了錢
還有些是他在 cwi 的時候編寫的程序 改的 bug

從python的所有者上面可以其實可以看到Guido的工作軌跡
雖然當時還沒有開源這些概念和詞匯
Guido 的考量
在 python 的 license 里面提到了 cwi 和 cnri

當時 python 的主要成員開始討論
python 應(yīng)該繼續(xù)免費開源還是商業(yè)
Guido 認為如果商業(yè)化
python 的用戶就會離開
最終選擇開源的語言和項目
貢獻者和社區(qū)就是在這基礎(chǔ)上發(fā)展起來的
但商業(yè)是世界運行的底層邏輯
強大的商業(yè)資本方會有律師、媒體
python 在這商業(yè)的世界里舉步維艱
這曾讓 Guido 很苦惱
轉(zhuǎn)機
開源運動的期末著作給了他啟發(fā)
他開始選擇 gpl 協(xié)議
后來互聯(lián)網(wǎng)興起
其中一個網(wǎng)站 BeOpen.com 基于開源技術(shù)制作
BeOpen 看到 Guido 的困惑
就想給他一份呢薪水
工作就是完善 python
這是很好的機會
Guido 帶著 3 個 CNRI 的同事一起去了
這時候 CNRI 的管理層慌了
他們覺得 Guido 瘋了
那是個創(chuàng)業(yè)公司
找他談話
去了就別想再回來
但是不可阻止了
人走了 CNRI 的項目自然也就黃了
不過去 beopen 的 2000 年
正好是互聯(lián)網(wǎng)泡沫興起的時候
beopen 想做的是開源門戶
泡沫破裂之后又怎么辦呢?
后來
他從 beopen.com 之后
Guido 很擔心 python 源代碼的所有權(quán)問題
后來 Guido 去了 soap
在那里他咨詢了律師
并建立了 python 基金會
明確了 python 的協(xié)議和所屬問題
開源運動已經(jīng)發(fā)展起來了
他先加入 google
后來在 150 人的時候加入 dropbox
2020年 去了微軟
這就是Guido和python的歷史
我們用 python 為 Guido 寫一個簡歷吧
繼續(xù)編輯 py 文件
#用vi打開并編輯guido.pyvi guido.py
上次輸出了兩行內(nèi)容
這次我們復(fù)制成 6 行
gg將光標移動回到最開頭
yG從當前位置(最開頭)復(fù)制到結(jié)尾
2P粘貼 2 次
i重新切換到插入模式為輸出添加年份標號
print("1982------Guido in cwi")
print("1995------Guido in cnri")
print("2000------Guido in beopen")
print("2005------Guido in google")
print("2012------Guido in dropbox")
print("2020------Guido in microsoft")
完成之后<kbd>esc</kbd> 切換到正常模式
:w|!python3 %
保存并用 python 解釋當前程序可以看到輸出了標了號的 6 行
這 6 行的順序就是按照我們標號的順序來的
順序執(zhí)行
這個過程叫做順序執(zhí)行
按照步驟,有先后次序的
按照時間順序

順序播放
就像我們聽語音是挨排聽的

順序播放是按照列表順序播放的
音符順序
演奏音符也是一個個按照順序演奏,才是這首歌曲
調(diào)換一下次序,就亂了,不是這個歌了
不過其實也是一種思路。。。??

按部就班

我們的生活也是按照線性的時間線順序完成的

學習
學習也一樣
要按照時間的次第
一步一步來
啥都一樣,別著急!
欲速則不達
那他是怎么解釋執(zhí)行的呢???
嘗試調(diào)試
那 python 程序到底是怎么一步步解釋執(zhí)行的呢???
我們可以一步一步運行來調(diào)試
使用
pdb
來進行調(diào)試pdb
的意思是p
ython'sd
eb
ugger??
python3 -m pdb guido.py或者使用pdb3

由于程序不知道哪里出的問題
所以一步步來執(zhí)行
一行行執(zhí)行的目的是去除
bug
,也就是debug
可是為什么把程序錯誤叫做
bug
?? 呢?
第一個錯誤 bug

歷史上第一個程序錯誤是因為電腦里面飛進來一只蟲子
bug
??所以后來管調(diào)試程序錯誤叫做
debug
這個
bug
?? ?是誰找出來的呢?
計算之母
找到
bug
的第一個調(diào)試員或者叫程序員是一位女性和現(xiàn)在程序員大多是男性不同
因為當時編程都得檢查線路
跟編織很像
很容易變得一團亂麻
需要很細心、有條理的人???????

Grace Murray Hopper
故障
當時格蕾絲和她的同事們正艱難地搞清楚
他們正在使用的馬克 II 電腦出現(xiàn)了什么故障
最后,他們發(fā)現(xiàn)一只活蛾被困在控制電路的一個電子開關(guān)中

不要害怕
bug
,因為bug
是程序員存在的基礎(chǔ)如果沒有了
bug
,那也就不需要程序員了程序員本身就是
bug
一般的存在 ??讓我們來 debug!??
進行調(diào)試

命令細節(jié)
運行之后
h
查詢help
幫助l
進行list
列表n
進行next
向下執(zhí)行q
執(zhí)行quit
退出這得動手試一試
完成調(diào)試
一路
next
下去程序執(zhí)行完畢了
整個程序就算執(zhí)行完成了
python 解釋器 就是這么一步步地解釋執(zhí)行的

總結(jié)
py
的程序是按照順序一行行挨排按順序解釋執(zhí)行的
我們可以
python3 -m pdb hello.py
來對程序調(diào)試調(diào)試的目的是去除
bug
別害怕
bug
bug
會有提示我們也就知道如何調(diào)試
debug
python3
這個解釋器到底是怎么執(zhí)行的呢???我們下次再說!*