调试程序

回忆上次内容

  • py 的程序都是写在明面上的
  • 所有需要执行的事情都明着写到了 py 文件中
  • python3 解释 py 文件进行执行
  • 可以下载人家写好的 py 文件
  • 下载的 py 文件可以直接读懂
  • 编写程序的人怎么挣钱呢?

开源

  • Python 程序确实是直接就能看到源代码的
  • 不能加密既是缺点也是优点
  • 缺点:

    • 无法保密
    • 谁都能看见和改写
    • 传统的软件卖的是序列号
    • 思路是以前许可证的思路
  • 由一个核心节点进行授权
  • 其他用户得到某些许可

    • 甚至是持证抢劫的许可

  • 现代的许可证 license 主要都是赋予用户更多权利
  • 比如 GPL 许可证

GPL

  • GPL 又称为 Copyleft

    • 这是一种英语的调侃
    • 因为 Copyright 的那个 right 有多个含义
  • 用作 copyright 的时候

    • right 是权利的意思
    • 但它同时还是“右边”的意思
  • 所以和他相反的就是 Copyleft

    • 表示这是和 Copyright 是走另一边的
  • GPL 授权对被授权者是有要求的,它重点强调:

    • 第一:和大部分开源软件一样,作品放在这里,你可以用,作者不为任何物理损失负责
    • 第二:如果你,基于这个作品衍生了新的作品,那么这个新的“作品”,必须符合 GPL 协议,否则你就失去原作品的授权
    • 第三,符合 GPL 协议的作品,在提供给它的使用者的时候,必须同时提供该作品的 GPL 部分的源代码,不能对使用者做出限定

  • 这听起来很绕
  • 其实本来是想知道开放了源代码程序员是怎么挣钱的?

现状

  • 目前国内市场定制开发软件的需求越来越少
  • 现在更多的是网站和移动应用
  • 把代码捂在自己手里是没有用的
  • 源代码的开放是发展的趋势

    • 开放源代码可以让更多人才参与开发、修改和传播
    • linux、debian、vim、python 的源代码大家都能看到和参与
  • 这样的个人软件开发者主导的项目依靠人民战争战胜了软件巨头

    • 参与的人越多
    • 知名度越高
    • 项目越活越
    • 越有可能留得下来
    • 让更多的人知道和参与
    • 个人也因为参与的项目而更知名
  • 不但软件

    • 硬件、游戏、甚至虚拟角色歌姬等等方面
    • 开源项目也越来越多

  • 不过时代的洪流是从最早的水滴开始的
  • 最早的python是由Guido开发的

    • 当时 Guido 如何面对如何的抉择呢?

时代

  • 最早 Guido 确实曾经在 CWI 工作

    • CWI是荷兰的数学与计算机科学国家研究所

  • 他希望有一种语言能够像C语言那样

    • 全面调用计算机的功能接口
    • 又能像shell那样,轻松的编程
  • 荷兰的CWI 数学和计算机国家研究所开发了一种ABC语言

    • 当时范罗苏姆在CWI工作,并参与到ABC语言的开发
    • 他将自己所知的一切语言设计知识都倾注在这个项目上
    • 尽管已经具备了良好的可读性和易用性
    • 但ABC语言最终还是没有流行起来。
  • 确实是在那里出现的 ABC 给 后来的 python 很大启发
  • Guido 后来去了 cnri

    • 荷兰的国家研究中心

  • 研究项目的经费确实是 cnri 出的
  • 95 年当时还没有兴起开源运动

发展

  • 当时的许可证是收费的

    • guido 想把他做成开源的
    • 但是没有立场
    • 毕竟 cnri 花了钱
  • 还有些是他在 cwi 的时候编写的程序 改的 bug

  • 从python的所有者上面可以其实可以看到Guido的工作轨迹
  • 虽然当时还没有开源这些概念和词汇

Guido 的考量

  • 在 python 的 license 里面提到了 cwi 和 cnri

  • 当时 python 的主要成员开始讨论

    • python 应该继续免费开源还是商业
    • Guido 认为如果商业化
    • python 的用户就会离开
  • 最终选择开源的语言和项目

    • 贡献者和社区就是在这基础上发展起来的
  • 但商业是世界运行的底层逻辑

    • 强大的商业资本方会有律师、媒体
    • python 在这商业的世界里举步维艰
    • 这曾让 Guido 很苦恼

转机

  • 开源运动的期末著作给了他启发

    • 他开始选择 gpl 协议
  • 后来互联网兴起

    • 其中一个网站 BeOpen.com 基于开源技术制作
  • BeOpen 看到 Guido 的困惑

    • 就想给他一份呢薪水
    • 工作就是完善 python
    • 这是很好的机会
    • Guido 带着 3 个 CNRI 的同事一起去了
  • 这时候 CNRI 的管理层慌了

    • 他们觉得 Guido 疯了
    • 那是个创业公司
    • 找他谈话
    • 去了就别想再回来
    • 但是不可阻止了
  • 人走了 CNRI 的项目自然也就黄了

    • 不过去 beopen 的 2000 年
    • 正好是互联网泡沫兴起的时候
    • beopen 想做的是开源门户
    • 泡沫破裂之后又怎么办呢?

后来

  • 他从 beopen.com 之后

    • Guido 很担心 python 源代码的所有权问题
  • 后来 Guido 去了 soap

    • 在那里他咨询了律师
    • 并建立了 python 基金会
    • 明确了 python 的协议和所属问题
  • 开源运动已经发展起来了

    • 他先加入 google
    • 后来在 150 人的时候加入 dropbox
  • 2020年 去了微软
  • 这就是Guido和python的历史
  • 我们用 python 为 Guido 写一个简历吧

继续编辑 py 文件

#用vi打开并编辑guido.py
vi guido.py
  • 上次输出了两行内容
  • 这次我们复制成 6 行
  • gg 将光标移动回到最开头
  • yG 从当前位置(最开头)复制到结尾
  • 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")
  • :w|!python3 % 保存并用 python 解释当前程序
  • 可以看到输出了标了号的 6 行
  • 这 6 行的顺序就是按照我们标号的顺序来的

顺序执行

  • 这个过程叫做顺序执行
  • 按照步骤,有先后次序的
  • 按照时间顺序

顺序播放

  • 就像我们听语音是挨排听的

  • 顺序播放是按照列表顺序播放的

音符顺序

  • 演奏音符也是一个个按照顺序演奏,才是这首歌曲
  • 调换一下次序,就乱了,不是这个歌了
  • 不过其实也是一种思路。。。

按部就班

  • 我们的生活也是按照线性的时间线顺序完成的

学习

  • 学习也一样
  • 要按照时间的次第
  • 一步一步来
  • 啥都一样,别着急!
  • 欲速则不达
  • 那他是怎么解释执行的呢?

尝试调试

  • 那 python 程序到底是怎么一步步解释执行的呢?
  • 我们可以一步一步运行来调试
  • 使用pdb来进行调试

    • pdb的意思是python's debugger
python3 -m pdb guido.py
#或者使用
pdb3

  • 由于程序不知道哪里出的问题
  • 所以一步步来执行
  • 一行行执行的目的是去除bug,也就是debug
  • 可是为什么把程序错误叫做 bug 呢?

第一个错误 bug

  • 历史上第一个程序错误是因为电脑里面飞进来一只虫子bug
  • 所以后来管调试程序错误叫做 debug
  • 这个 bug 是谁找出来的呢?

计算之母

  • 找到 bug 的第一个调试员或者叫程序员是一位女性
  • 和现在程序员大多是男性不同
  • 因为当时编程都得检查线路
  • 跟编织很像
  • 很容易变得一团乱麻
  • 需要很细心、有条理的人‍

  • Grace Murray Hopper

故障

  • 当时格蕾丝和她的同事们正艰难地搞清楚
  • 他们正在使用的马克 II 电脑出现了什么故障

    • 最后,他们发现一只活蛾被困在控制电路的一个电子开关中

  • 不要害怕 bug,因为 bug 是程序员存在的基础
  • 如果没有了bug,那也就不需要程序员了
  • 程序员本身就是 bug 一般的存在
  • 让我们来 debug!

进行调试

命令细节

  • 运行之后

    • h 查询 help 帮助
    • l 进行 list 列表
    • n 进行 next 向下执行
    • q 执行 quit 退出
  • 这得动手试一试

完成调试

  • 一路 next 下去
  • 程序执行完毕了
  • 整个程序就算执行完成了
  • python 解释器 就是这么一步步地解释执行的

总结

  • py 的程序是按照顺序

    • 一行行挨排按顺序解释执行的
    • 我们可以 python3 -m pdb hello.py 来对程序调试
    • 调试的目的是去除 bug
    • 别害怕 bug
    • bug 会有提示
    • 我们也就知道如何调试 debug
  • python3 这个解释器到底是怎么执行的呢?
  • 我们下次再说!

oeasy教您玩转python - 4 - # 调试程序的更多相关文章

  1. oeasy教您玩转python - 006 - # hello world

    ​ Hello World! 回忆上次内容 python3 的程序是一个 5.3M 的可执行文件 python3 里面全都是 cpu 指令 可以执行的那种指令 我们可以把指令对应的汇编找到 objdu ...

  2. oeasy教您玩转vim - 56 - # 字符可视化模式

    ​ 可视化编辑 回忆上节课内容 我们学习了关于模式匹配中使用参数 单个参数 :%s/<h2>\(.*\)</h2>/ - \1/g 多个参数 :%s/<img src=\ ...

  3. oeasy教您玩转vim - 57 - # 行可视化

    ​ 可视化编辑 回忆上节课内容 上次我们了解到可视模式 其实可视化对应三种子模式 字符可视模式 v 行可视模式 大写V 块可视模式ctrl+v 我们先来了解字符可视化模式 快捷键 v 可配合各种mot ...

  4. oeasy教您玩转linux010203显示logo

    我们来回顾一下 上一部分我们都讲了什么?

  5. oeasy 教您玩转linux010101查看内核uname

    linux([?l?n?ks]) 是什么????? 咱们这次讲点什么呢?这次咱们讲讲这个 linux([?l?n?ks]),什么是 linux([?l?n?ks])呢?这linux([?l?n?ks] ...

  6. oeasy教您玩转linux010202软件包管理apt

    顾一下 上一部分我们都讲了什么?

  7. oeasy教您玩转linux010201持续输出yes

    我们来回顾一下 上一部分我们都讲了什么?

  8. oeasy教您玩转linux010108到底哪个which

    到底哪个which 回忆上次内容 我们上次讲了查找命令位置whereis 我想找到whereis的位置怎么办?

  9. oeasy教您玩转vim - 53 - # 批量替换

    查找细节 回忆上节课内容 我们温习了关于搜索的相关内容 /正向,?反向 n保持方向,N改变方向 可以设置 是否忽略大写小写 是否从头开始查找 是否高亮显示 还有一些正则表达式的使用方法 行头行尾 ^$ ...

  10. oeasy教您玩转linux-010110内容回顾

    我们来回顾一下 我们都讲了什么?

随机推荐

  1. 【题解】A19337.火星背包

    \(\bf{用 CDQ 分治可以极大地提升程序运行的速度.}\) \(\bf{实测在本数据量下,可以在 \color{red}10ms\color{normal}} 内通过所有的测试点!\) 关于折半 ...

  2. zabbix笔记_005 zabbix自动发现

    自动发现 [消耗资源较大] 1.1 自动发现监控主机 自动发现的好处: 快速发现,并自动添加主机,省去管理员配置的麻烦. 管理简单高效 zabbix监控构建速度更高效 1.2 自动发现的原理 自动发现 ...

  3. ubuntu下openCV-Haar特征分类器训练

    ubuntu下openCV-Haar特征分类器训练 这段时间在学openCV,准备做一个头部检测,但是openCV自带的分类器只有人脸检测的,而且准确度不高,就准备自己训练一个分类器.在网上看了很多的 ...

  4. OpenCV笔记(10) 相机模型与标定

    万圣节快乐! 1. 相机模型 针孔相机模型:过空间某特定点的光线才能通过针孔(针孔光圈),这些光束被投影 到图像平面形成图像. 将图像平面在针孔前方,重新把针孔相机模型整理成另一种等价形式, 实际上, ...

  5. C# 配置文件增加自定义节点

    话不多说直接开撸! 首先创建一个Config的文件夹然后新增一个后缀名为.config的文件 配置文件的代码如下: <?xml version="1.0" encoding= ...

  6. 算法学习笔记(46): 离散余弦变换(DCT)

    前置知识:离散傅里叶变换 傅里叶变换在上文中更多的是 OI 中的理解以及应用.但是傅里叶变换奥秘还很多. 回顾 \(\omega_n\) 在傅里叶变换中的定义:\(e^{i \frac {2\pi} ...

  7. 像 Google SRE 一样 OnCall

    在 Google SRE 的著作<Google运维解密>(原作名:Site Reliability Engineering: How Google Runs Production Syst ...

  8. Winform绘制圆形图

    1 private void Form_Load(object sender, EventArgs e) 2 { 3 PictureBox pic = new PictureBox(); 4 pic. ...

  9. PMP 变更专题

    在浏览器Console中输入下列对应命令 document.getElementsByTagName('video')[0].requestPictureInPicture()--进入画中画 docu ...

  10. 机器学习策略篇:详解清除标注错误的数据(Cleaning up Incorrectly labeled data)

    清除标注错误的数据 监督学习问题的数据由输入\(x\)和输出标签 \(y\) 构成,如果观察一下的数据,并发现有些输出标签 \(y\) 是错的.的数据有些标签是错的,是否值得花时间去修正这些标签呢? ...