Presentation is loading. Please wait.

Presentation is loading. Please wait.

代码阅读与实践 Lecture 1 主讲人:胡亚斌

Similar presentations


Presentation on theme: "代码阅读与实践 Lecture 1 主讲人:胡亚斌"— Presentation transcript:

1 代码阅读与实践 Lecture 1 主讲人:胡亚斌 E-mail:yabin.hwu@gmail.com
大规模集成电路设计应用与实践 系列课程之 代码阅读与实践 Lecture 1 主讲人:胡亚斌

2 课程内容 知识背景 代码阅读那些事 代码阅读工具 1 2 3 本次课的目的 1.介绍相关背景知识
2.引入代码阅读的观念: 代码阅读关心代码整个生命周期 3.介绍代码阅读的常用工具

3 知识背景 代码阅读 系统工具 编程范型 计算机体系结构

4 代码阅读那些事 代码阅读的目的 代码阅读有哪些事 阅读什么样的代码 从哪里获取代码

5 代码阅读工具 工具决定 效率 Linux 平台 Native Windows 平台 虚拟机 Cygwin

6 知识背景之 编程范型

7 代码的世界 请英语专业的肖芬同学讲讲人类自然语言世界的语系,语种。 讲解自然语言与程序设计语言的联系和差别
都有类似的相同的要素。都有类似的相同的学习技巧。都是在发展的。 程序设计语言是人为创造的,因而,必须有一些思想层面的,思维方式层面的东西指导人类去设计出一种程序设计语言。 这些思想层面的,思维方式层面的东西(世界观与方法论)就是程序设计语言范型。(引出后面范型的讲解)

8 常用程序设计语言统计 From langpop.com 还可以参考 TIOBE index

9 提几个问题 听过以下说法吗? 谁知道下面C语句给n赋什么值? 为什么我的程序调试时完全正确,Release生成的程序却出了错?
我学的是VC程序设计。 我学的是6.0 版本的C++。 谁知道下面C语句给n赋什么值? m = 1; n = m+++m++; 为什么我的程序调试时完全正确,Release生成的程序却出了错? 过程调用、函数调用及方法调用,是不是一个东东? 到底该学哪种语言呀? 学啥语言好找工作?

10 程序设计语言那点事 什么是编程语言范型(Paradigm)? 什么是架构(Architecture)?
什么是设计模式(Design Pattern)? 什么是框架(Framework)? 什么是库(Library)和工具包(Toolkit)?

11 程序设计语言范型 形成许多程序设计语言的一个原因:计算过程可以有许多不同的看法,由此产生了不同的计算模型(范型,Paradigms) 。
通常,把范型作为一种能够操纵相关活动集合的思想模式。程序范例就是一种问题模式,这种问题可以解决一些特殊类型的程序和语言思想。 程序设计语言世界的世界观与方法论。 基于不同计算范型产生了不同的语言类(语言范型)。主要有: 过程式范型(Procedural,或称命令式,Imperative) 函数式范型(Functional) 逻辑式范型 (Logical) 面向对象范型(Object-Oriented) 并发式范型(Concurrent) …… 为啥要讲程序语言范型?跟代码阅读有何关系? 有助于程序员的成长。 程序员成长的4个阶段(境界): 学会 —— 掌握一些具体编程知识的初级程序员。 会学 —— 能快速而深刻的理解技术并举一反三的程序员。 会用 —— 能将所学灵活运用到实际编程设计之中的高级程序员。 被用 —— 能设计出广为人用的应用程序、库、工具包、框架等的系统分析师和架构师。更高的境界是,发明主流的设计模式、算法、语言,乃至计算理论等等。 你也许还听说过下面的词汇 说明式语言(Declarative) 脚本语言(Scripting Language) 孟子说过:“劳心者治人,劳力者治于人”

12 过程式范型 把计算看成一系列操作的执行,基本计算元素是一组基本操作。计算在一个环境里进行,操作的效果就是改变环境的状态:
语言提供一组基本操作和一组描述组合操作的手段,提供的抽象手段是定义新操作(定义过程)。过程实现大步的状态变换。 写程序就是描述操作执行的顺序过程,描述状态和状态的变化常规语言,如C,Pascal,Fortran 等等,都是命令式语言。

13 函数式范型(Functional) 把计算看成对数据的函数变换,一个计算就是一系列函数变换。
基本计算元素是一组基本函数,语言提供各种函数组合机制(复合、函数选择),抽象手段是定义新函数(允许递归定义)。 最早的函数式语言是 John McCarthy 开发的Lisp。目前最重要的函数式语言包括Scheme,ML 和Haskell 等。 函数式编程让人重回数学思维

14 面向对象的范型(Object-Oriented)
把计算看成是一批独立对象相互作用的效果。OO语言提供描述对象及其行为的机制,以及描述对象之间相互作用的机制 纯OO语言有Smalltalk,Java 等。其他支持OO 概念和编程方法的语言包括C++,Ada95等。这些都是基于命令式行为描述的OO 语言。也有采用函数式的或者其他范型做行为描述的OO 语言。

15 声明式语言(Declarative) 包括逻辑式语言(Logical),关系式语言(Relational),基于限制的语言(Constraint) 基本想法是只描述需要做什么,不描述怎样做。例如:描述被计算对象之间的逻辑关系;问题的解应满足的条件约束。语言的实现提供一个通用过程,它能根据具体的说明性描述产生出所需的结果。 例:逻辑式语言Prolog;数据库查询语言SQL;近年很受重视的Constraint Language 和Constraint Programming 范型的分类:命令式和声明式,这是从编程的理念和风格上说的 命令式编程是行动导向的(action-oriented),算法是显性的而目标是隐性的; (因而阅读命令式语言代码很困难,更不幸的是,命令式语言占绝对统治地位) 命令式编程是目标驱动的(Goal-Driven),目标是显性的而算法是隐性的;

16 命令式语言 vs 声明式语言 示例: 阶乘的计算 factorial int factorial(int n) { int f=1;
for(; n > 0; --n) f *= n; return f; } (defun factorial(n) (if (= n 0) 1 (* n (factorial(- n 1))))) 函数式 命令式 factorial(0,1). factorial(N, F) :- M is N-1, factorial(M, Fm), F is N * Fm. 逻辑式

17 并行编程范型 经典的运筹学问题 烧水泡茶 方案一:洗茶杯;放茶叶;灌水壶;烧水;水开后泡茶。
方案二:灌水壶;在烧水的同时,洗茶杯;放茶叶;水开后泡茶。 如果我们有两个服务员,情况会发生什么变化?

18 脚本语言(Scripting Language)
从操作系统的命令语言和文本处理语言发展起来的一类语言。通常: 提供一批高级数据结构,提供灵活的变量、函数、对象等定义和使用方式 采用解释方式实现,使用灵活方便 许多脚本语言提供了高级的文本处理功能

19 其他语言 文本描述语言Postscript,也是一种完整的程序设计语言 仪器控制语言Forth,是一种完整的基于堆栈的程序设计语言
硬件描述语言Verilog 和VHDL ……

20 推荐读物 推荐阅读基础: 熟练掌握一门命令式语言如C或Java
熟练掌握一门脚本语言如shell script, matlab 或 Python

21 推荐读物 推荐阅读基础: 对各种编程语言有较深的功底。

22 实例:泛型范型 感受泛型编程力量之强大

23 实例: 泛型范型(1) 从一个整数数组中随机抽取十个数,对其中的素数求和。 将一个无序整数集中所有的完全平方数换成其平方根。
从学生成绩表中,列出门门都及格且平均分在70分以上的学生名单。 在一个着色二元树中,将所有的红色结点涂成蓝色。 将一个字符串从倒数第3个字符开始反向拷贝到另一个字符串中。 每从标准输入读取一个非数字的字符X,于标准输出打印“X不是数字字符”。

24 实例: 泛型范型(2) template <class Iterator, class Act, class Test>
void process(Iterator begin, Iterator end, Act act, Test test) // 对容器中在给定范围内(即起于begin止于end)所有满足给定条件的元 //素(即test(元素)==true)进行处理(即act(元素)) { for ( ; begin != end; ++begin) // 从头至尾遍历容器内元素 // 若当前元素满足条件,则对其采取行动 if (test(*begin)) act(*begin); }

25 实例:Ruby版 duck typing 感受动态绑定之美

26 实例: duck typing (1) //Ruby代码实现 class Duck def shout
puts 'gagaga' end def swim puts 'yayong' class Frog puts 'guaguagua' puts 'wayong' def ShoutAndSwim(animal) animal.shout animal.swim end ShoutAndSwim(Duck.new) ShoutAndSwim(Frog.new) //Ruby代码实现

27 实例: duck typing (2.1) //如果用C++代码实现呢? class animal { public:
virtual shout() = 0; virtual swim() = 0; }; class duck : public animal { void shout() { std::cout << "gagaga" << std::endl;} void swim() { std::cout << "yayong" << std::endl;} class frog : public animal { void shout() { std::cout << "guaguagua" << std::endl;} void swim() { std::cout << "wayong" << std::endl;} //如果用C++代码实现呢?

28 实例: duck typing (2.2) //如果用C++代码实现呢? void ShoutAndSwim(animal *anmal)
{ anmal -> shout(); anmal -> swim(); } int main() { duck *dk = new duck(); frog *fg = new frog(); ShoutAndSwim(dk); ShoutAndSwim(fg); //如果用C++代码实现呢?

29 实例: duck typing (3) //Ruby代码实现 class Cock def shout puts 'wowowo' end
class Fish def swim puts ‘freestyle' def ShoutOrSwim(animal, flag) flag ? animal.shout : animal.swim end ShoutOrSwim(Cock.new, true) ShoutOrSwim(Fish.new, false) //Ruby代码实现

30 实例: duck typing (4) //如果用C++代码实现呢? class Cock { public:
void shout() { std::cout << "wowowo" << std::endl;} }; class Fish { void swim() { std::cout << "freestyle" << std::endl;} void ShoutOrSwim(animal *anmal, bool flag) { if(flag) //会报错 anmal -> shout(); else anmal -> swim(); } int main() { Cock *ck = new Cock(); fish *fh = new fish(); ShoutOrSwim(ck, true); ShoutOrSwim(fh, false); } //如果用C++代码实现呢?

31 知识背景之 计算机体系结构

32 计算模型 计算机硬件由连接起来的一组硬件器件构成,其作用是实现机器语言程序描述的计算过程。从使用者的角度看,其内部实现方式可以不必关心,只需要关心它所提供的机器语言(指令的形式和意义) 即使具体硬件改变了,只要机器语言不变,使用方式就不必改变,以前写的程序仍然可用。因此: 机器语言可以看作计算机硬件的一种“抽象”。一种机器语言对应于一类计算机,或说对应于一种“抽象计算机”(抽象机)。如:X86 机器语言 一种高级语言也可以看作是一种抽象“计算机”的机器语言例如,C 语言,可看作一台能够直接执行C 语言程序的高级“计算机”的“机器语言”。该“计算机”提供了C 语言所提供的各种基本的和高级的数据结构,能执行C 语言的各种基本计算,基本操作和控制结构 常常没有这种计算机,需要考虑在已有的计算机上实现它

33 计算机科学基本原理 计算机科学 基本原理 计算的世界最重要的能力 —— 抽象 何以为科学? -- 计算思维! 未来我们这门课的名称会发展为
代码世界 —— 计算思维视角 基本原理 Amdal 局部性原理 90/10 (80/20) 原理 计算的世界最重要的能力 —— 抽象

34 推荐读物 推荐阅读基础: 学完计算机组成原理或微机原理课后立即开始阅读

35 推荐读物 推荐阅读基础: 研究生入学前或一年级,本科四年级阅读量化第三版

36 知识背景之 系统工具

37 用户态与内核态 高地址 使用nm查看用户态程序的符号表内容 使用System.map(内核符号表)查看内核符号表内容 堆和栈的概念!!!
低地址

38 加载器与连接器 推荐阅读

39 ABI 与相关工具 可执行文件格式 工具 Linux: ELF, COFF Windows: PE readelf objdump head
nm

40 解释与编译

41 推荐阅读:编译和解释 41

42 代码阅读那些事之 目的、内涵和方法

43 代码阅读的目的 代码作为文献 代码作为范例 维护 演进 重用 审查 英语阅读的教学目的: 1、阅读理解能力和阅读速度 2、逻辑思维能力
3、培训细读、略读、查阅等阅读技能 4、词汇量、语言和文化背景知识

44 代码阅读有哪些事 读 译 行 改 阅读静态源代码,勾勒代码执行流和物理组织图和逻辑组织图。
对程序进行编译,汇编,链接等操作。阅读其代码低层形态。 运行编译得到二进制文件,观察代码运行态。结果与在“读”阶段得到的理解进行对比,剖析。 对代码进行修改,对修改后的代码行为进行预测。

45 阅读哪些代码 对我帮助最大的几次源码阅读 OpenCV Qemu Linux 0.11 STL 编程风格 代码功能

46 推荐几本书

47 如何获取源代码 网站资源 开源世界仓库管理员: 版本控制软件 Google Code: http://code.google.com/
Sourceforge: CodeProject: Codeplex: CSDN : PUDN: 开源世界仓库管理员: 版本控制软件 SVN Mercurial hg git

48 代码阅读工具之 信息检索、逻辑构造和思维表达

49 代码阅读工具 Linux 篇 Windows 篇 find, grep, awk, sed
Make (GNU makefile, Autotools) Vim IDE -- Eclipse, CODE::BLOCKS Windows 篇 Source Insight Visual Studio + Visual Assistant X

50 其它工具 - XMind

51 其它工具 - SmartDraw

52 其它工具 - OneNote

53 课后作业(1) 浏览wiki上关于编程语言的网页 浏览冯.诺依曼计算机结构和非冯氏计算机结构资料 PPT 第7页图中哪些不是编程语言?
浏览冯.诺依曼计算机结构和非冯氏计算机结构资料 PPT 第7页图中哪些不是编程语言?

54 课后作业(2) 安装Linux系统 Linux脚本编程
一个大型C++开源项目,源代码统一放在src目录下。为使得代码更加清晰,便于维护。现将所有头文件放置在src/include目录下。则所有#include命令必须更改。 如:将 #include “header.h” 改为 #include “include/header.h” 请用find,grep,sed命令编写linux脚本实现本功能。 54

55 程序设计语言花儿朵朵之 Python

56 飞翔的马戏团 巨蟒组(Monty Python)是英国六人喜剧团体,早在七、八十年代他们就开始了恶搞,他们的电视喜剧系列“Monty Python and the Flying Circus”在七十年代风靡全球。这部系列剧被誉为英式无厘头的始祖, BBC最伟大的电视节目第五名。

57 Guido van Rossum Guido原居荷兰,1995移居到美国,并遇到了他现在的妻子。在2003年初,Guido和他的家人,包括他2001年出生的儿子Orlijn一直居住在华盛顿洲北弗吉尼亚的郊区。随后他们搬迁到硅谷,2005年至今,Guido在为Google工作(其中有一半时间是花在Python上)。 Guido在1982年获得阿姆斯特丹大学的数学和计算机科学的硕士学位,并于同年加入一个多媒体组织CWI,做调研员。1989年,他创立了Python语言。

58 Python历史 Python的创始人为Guido van Rossum。1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做为ABC语言的一种继承。 ABC是由Guido参加设计的一种教学语言(没听说过)。就Guido本人看来,ABC这种语言非常优美和强大,是专门为非专业程序员设计的。但是ABC语言并没有成功,究其原因,Guido认为是非开放造成的。Guido决心在Python中避免这一错误(的确如此,Python与其它的语言如C,C++和Java结合的非常好)。同时,他还想实现在ABC中闪现过但未曾实现的东西。 就这样,Python在Guido手中诞生了(真要感谢他)。实际上,第一个实现是在Mac机上。可以说,Python是从ABC发展起来,主要受到了Modula-3(另一种相当优美且强大的语言,为小型团体所设计的)的影响。并且结合了Unix Shell和C的习惯。

59 第一门编程语言 MIT选择Python作为大学第一门编程语言或者专业导引课的主要内容传授。
MIT Introduction to Computer Science and Programming MIT Introduction to EECS I UIUC, stanford选择了Java

60 Python特点 开源产品,丰富的模块和库 良好的粘合语言,它可以调用c和java编写的库
代码优雅,风格严谨 (space-sensitive) Python也被称为是一门清晰的语言。因为它的作者在设计它的时候,总的指导思想是,对于一个特定的问题,只要有一种最好的方法来解决就好了。这在由Tim Peters写的python格言(称为The Zen of Python)里面表述为: There should be one-- and preferably only one --obvious way to do it.

61 Thank you

62 下节预告:HelloWorld 的前世今生
#include <stdio.h> int main() { printf(“hello world!\n”); return 0; }

63 Backup 备用幻灯

64 明朝那些事儿 作者: 当年明月

65 自然语言语系、语种 现今全世界现存的语言约为5000种。北京大学的徐通锵和胡吉成两位教授将世界语言分类为13个语系,45个语族。这种分类从民族起源、语言发展等诸多因素的关系,另外在总结世界各国特别是原苏联(俄罗斯)语言学家对语言的归类的基础上形成的,基本上与世界上广泛采用的语言系属归类相吻合。 汉藏语系 印欧语系 高加索语系 乌拉尔语系 阿尔泰语系 达罗毗荼语系 南亚语系 南岛语系 闪含语系 尼日尔-科尔多凡语系 尼罗-撒哈拉语系 科依桑语系 北美印第安语系

66 认识语言的生命周期 一个人或一个设计组,根据对一批基本要素的考虑,提出有关语言的基本构想,定义该语言的语法形式和语义;
实现一个语言处理系统,使这个语言能实际用于程序设计; 通过一些人的使用和反馈,修改完善语言的设计. 少数比较成功的语言可能进入下面阶段: 将语言的处理系统提供给更大范围的用户,并得到更多反馈 除语言设计者(拥有者)外的其他人参与语言实现的研究和开发,并引起软件产业界的注意,形成语言的处理系统产品和用户社团 受到标准化组织的注意,成立相应标准化小组(公司语言有版权问题) 经过认真的标准化工作,推出语言的标准化文本

67 Top CS Programs in USA

68 10000小时法则 走向成功的10000小时法则: 在学习的过程中,完美掌握某项复杂技能存在一个练习最小临界量。事实上,研究者们就练习时长给出一个神奇的临界量:10,000小时。 参阅 :


Download ppt "代码阅读与实践 Lecture 1 主讲人:胡亚斌"

Similar presentations


Ads by Google