680 likes | 843 Views
代码阅读与实践 Lecture 1 主讲人:胡亚斌 E-mail : yabin.hwu@gmail.com. 大规模集成电路设计应用与实践. 系列课程之. 1. 2. 3. 课程内容. 知识背景. 代码阅读那些事. 代码阅读工具. 系统工具. 代码阅读. 编程范型. 计算机体系结构. 知识背景. 代码阅读那些事. 代码阅读的目的. 代码阅读有哪些事. 阅读什么样的代码. 从哪里获取代码. 工具决定 效率. Linux 平台 Native. Windows 平台 虚拟机 Cygwin. 代码阅读工具. 知识背景之.
E N D
代码阅读与实践 Lecture 1 主讲人:胡亚斌 E-mail:yabin.hwu@gmail.com 大规模集成电路设计应用与实践 系列课程之
1 2 3 课程内容 知识背景 代码阅读那些事 代码阅读工具
系统工具 代码阅读 编程范型 计算机体系结构 知识背景
代码阅读那些事 代码阅读的目的 代码阅读有哪些事 阅读什么样的代码 从哪里获取代码
工具决定 效率 • Linux 平台 • Native • Windows 平台 • 虚拟机 • Cygwin 代码阅读工具
知识背景之 编程范型
常用程序设计语言统计 From langpop.com 还可以参考 TIOBE index http://www.tiobe.com/content/paperinfo/tpci/index.html
提几个问题 • 听过以下说法吗? • 我学的是VC程序设计。 • 我学的是6.0 版本的C++。 • 谁知道下面C语句给n赋什么值? • m = 1; n = m+++m++; • 为什么我的程序调试时完全正确,Release生成的程序却出了错? • 过程调用、函数调用及方法调用,是不是一个东东? • 到底该学哪种语言呀? • 学啥语言好找工作?
程序设计语言那点事 • 什么是编程语言范型(Paradigm)? • 什么是架构(Architecture)? • 什么是设计模式(Design Pattern)? • 什么是框架(Framework)? • 什么是库(Library)和工具包(Toolkit)?
程序设计语言范型 • 形成许多程序设计语言的一个原因:计算过程可以有许多不同的看法,由此产生了不同的计算模型(范型,Paradigms) 。 • 通常,把范型作为一种能够操纵相关活动集合的思想模式。程序范例就是一种问题模式,这种问题可以解决一些特殊类型的程序和语言思想。 • 程序设计语言世界的世界观与方法论。 • 基于不同计算范型产生了不同的语言类(语言范型)。主要有: • 过程式范型(Procedural,或称命令式,Imperative) • 函数式范型(Functional) • 逻辑式范型 (Logical) • 面向对象范型(Object-Oriented) • 并发式范型(Concurrent) • ……
过程式范型 • 把计算看成一系列操作的执行,基本计算元素是一组基本操作。计算在一个环境里进行,操作的效果就是改变环境的状态: • 语言提供一组基本操作和一组描述组合操作的手段,提供的抽象手段是定义新操作(定义过程)。过程实现大步的状态变换。 • 写程序就是描述操作执行的顺序过程,描述状态和状态的变化常规语言,如C,Pascal,Fortran 等等,都是命令式语言。
函数式范型(Functional) • 把计算看成对数据的函数变换,一个计算就是一系列函数变换。 • 基本计算元素是一组基本函数,语言提供各种函数组合机制(复合、函数选择),抽象手段是定义新函数(允许递归定义)。 • 最早的函数式语言是 John McCarthy 开发的Lisp。目前最重要的函数式语言包括Scheme,ML 和Haskell 等。
面向对象的范型(Object-Oriented) • 把计算看成是一批独立对象相互作用的效果。OO语言提供描述对象及其行为的机制,以及描述对象之间相互作用的机制 • 纯OO语言有Smalltalk,Java 等。其他支持OO 概念和编程方法的语言包括C++,Ada95等。这些都是基于命令式行为描述的OO 语言。也有采用函数式的或者其他范型做行为描述的OO 语言。
声明式语言(Declarative) • 包括逻辑式语言(Logical),关系式语言(Relational),基于限制的语言(Constraint) • 基本想法是只描述需要做什么,不描述怎样做。例如:描述被计算对象之间的逻辑关系;问题的解应满足的条件约束。语言的实现提供一个通用过程,它能根据具体的说明性描述产生出所需的结果。 • 例:逻辑式语言Prolog;数据库查询语言SQL;近年很受重视的Constraint Language 和Constraint Programming
命令式语言 vs 声明式语言 • 示例: 阶乘的计算 factorial intfactorial(intn) { intf=1; for(;n >0;--n) f *=n; returnf; } (defunfactorial(n) (if(=n 0)1 (*n (factorial(-n 1))))) 函数式 命令式 factorial(0,1). factorial(N,F):-M isN-1,factorial(M,Fm),F isN *Fm. 逻辑式
并行编程范型 • 经典的运筹学问题 • 烧水泡茶 • 方案一:洗茶杯;放茶叶;灌水壶;烧水;水开后泡茶。 • 方案二:灌水壶;在烧水的同时,洗茶杯;放茶叶;水开后泡茶。
脚本语言(Scripting Language) • 从操作系统的命令语言和文本处理语言发展起来的一类语言。通常: • 提供一批高级数据结构,提供灵活的变量、函数、对象等定义和使用方式 • 采用解释方式实现,使用灵活方便 • 许多脚本语言提供了高级的文本处理功能
其他语言 • 文本描述语言Postscript,也是一种完整的程序设计语言 • 仪器控制语言Forth,是一种完整的基于堆栈的程序设计语言 • 硬件描述语言Verilog 和VHDL ……
推荐读物 推荐阅读基础: 熟练掌握一门命令式语言如C或Java 熟练掌握一门脚本语言如shell script, matlab 或 Python
推荐读物 推荐阅读基础: 对各种编程语言有较深的功底。
实例:泛型范型 感受泛型编程力量之强大
实例: 泛型范型(1) • 从一个整数数组中随机抽取十个数,对其中的素数求和。 • 将一个无序整数集中所有的完全平方数换成其平方根。 • 从学生成绩表中,列出门门都及格且平均分在70分以上的学生名单。 • 在一个着色二元树中,将所有的红色结点涂成蓝色。 • 将一个字符串从倒数第3个字符开始反向拷贝到另一个字符串中。 • 每从标准输入读取一个非数字的字符X,于标准输出打印“X不是数字字符”。
实例: 泛型范型(2) template<classIterator,classAct,classTest> voidprocess(Iterator begin,Iterator end,Act act,Test test) // 对容器中在给定范围内(即起于begin止于end)所有满足给定条件的元 //素(即test(元素)==true)进行处理(即act(元素)) { for(;begin !=end;++begin)// 从头至尾遍历容器内元素 // 若当前元素满足条件,则对其采取行动 if(test(*begin))act(*begin); }
实例:Ruby版 duck typing 感受动态绑定之美
实例: duck typing (1) classDuck defshout puts 'gagaga' end defswim puts 'yayong' end end classFrog defshout puts 'guaguagua' end defswim puts 'wayong' end end defShoutAndSwim(animal) animal.shout animal.swim end ShoutAndSwim(Duck.new) ShoutAndSwim(Frog.new) //Ruby代码实现
实例: duck typing (2.1) classanimal { public: virtualshout()=0; virtualswim()=0; }; classduck :publicanimal { public: voidshout(){std::cout<<"gagaga"<<std::endl;} voidswim(){std::cout<<"yayong"<<std::endl;} }; classfrog :publicanimal { public: voidshout(){std::cout<<"guaguagua"<<std::endl;} voidswim(){std::cout<<"wayong"<<std::endl;} }; //如果用C++代码实现呢?
实例: duck typing (2.2) voidShoutAndSwim(animal *anmal) { anmal->shout(); anmal->swim(); } intmain(){ duck *dk=newduck(); frog *fg=newfrog(); ShoutAndSwim(dk); ShoutAndSwim(fg); } //如果用C++代码实现呢?
实例: duck typing (3) classCock defshout puts 'wowowo' end end classFish defswim puts ‘freestyle' end end defShoutOrSwim(animal, flag) flag ?animal.shout : animal.swim end ShoutOrSwim(Cock.new, true) ShoutOrSwim(Fish.new, false) //Ruby代码实现
实例: duck typing (4) classCock { public: voidshout(){std::cout<<"wowowo"<<std::endl;} }; classFish{ public: voidswim(){std::cout<<"freestyle"<<std::endl;} }; voidShoutOrSwim(animal *anmal, boolflag) { if(flag) //会报错 anmal->shout(); else //会报错 anmal->swim(); } intmain(){ Cock *ck =newCock(); fish *fh=newfish(); ShoutOrSwim(ck, true); ShoutOrSwim(fh, false); } //如果用C++代码实现呢?
知识背景之 计算机体系结构
计算模型 • 计算机硬件由连接起来的一组硬件器件构成,其作用是实现机器语言程序描述的计算过程。从使用者的角度看,其内部实现方式可以不必关心,只需要关心它所提供的机器语言(指令的形式和意义) • 即使具体硬件改变了,只要机器语言不变,使用方式就不必改变,以前写的程序仍然可用。因此: • 机器语言可以看作计算机硬件的一种“抽象”。一种机器语言对应于一类计算机,或说对应于一种“抽象计算机”(抽象机)。如:X86 机器语言 • 一种高级语言也可以看作是一种抽象“计算机”的机器语言例如,C 语言,可看作一台能够直接执行C 语言程序的高级“计算机”的“机器语言”。该“计算机”提供了C 语言所提供的各种基本的和高级的数据结构,能执行C 语言的各种基本计算,基本操作和控制结构 • 常常没有这种计算机,需要考虑在已有的计算机上实现它
计算机科学基本原理 • 计算机科学 • 何以为科学? -- 计算思维! • 未来我们这门课的名称会发展为 • 代码世界 —— 计算思维视角 • 基本原理 • Amdal • 局部性原理 • 90/10 (80/20) 原理 • 计算的世界最重要的能力 —— 抽象
推荐读物 推荐阅读基础: 学完计算机组成原理或微机原理课后立即开始阅读
推荐读物 推荐阅读基础: 研究生入学前或一年级,本科四年级阅读量化第三版
知识背景之 系统工具
用户态与内核态 高地址 使用nm查看用户态程序的符号表内容使用System.map(内核符号表)查看内核符号表内容 堆和栈的概念!!! 低地址
加载器与连接器 • 推荐阅读
ABI 与相关工具 • 可执行文件格式 • Linux: ELF, COFF • Windows: PE • 工具 • readelf • objdump • head • nm
推荐阅读:编译和解释 41
代码阅读那些事之 目的、内涵和方法
代码阅读的目的 • 代码作为文献 • 代码作为范例 • 维护 • 演进 • 重用 • 审查 英语阅读的教学目的: 1、阅读理解能力和阅读速度 2、逻辑思维能力 3、培训细读、略读、查阅等阅读技能 4、词汇量、语言和文化背景知识
代码阅读有哪些事 读 译 行 改 阅读静态源代码,勾勒代码执行流和物理组织图和逻辑组织图。 对程序进行编译,汇编,链接等操作。阅读其代码低层形态。 运行编译得到二进制文件,观察代码运行态。结果与在“读”阶段得到的理解进行对比,剖析。 对代码进行修改,对修改后的代码行为进行预测。
阅读哪些代码 • 对我帮助最大的几次源码阅读 • OpenCV • Qemu • Linux 0.11 • STL • 编程风格 • 代码功能
如何获取源代码 • 网站资源 • Google Code: http://code.google.com/ • Sourceforge: http://sourceforge.net/ • CodeProject: http://www.codeproject.com/ • Codeplex: http://www.codeplex.com/ • CSDN : http://www.csdn.net/ • PUDN: http://www.pudn.com/ • 开源世界仓库管理员: 版本控制软件 • SVN • Mercurial hg • git
代码阅读工具之 信息检索、逻辑构造和思维表达
代码阅读工具 • Linux 篇 • find, grep, awk, sed • Make (GNU makefile, Autotools) • Vim • IDE -- Eclipse, CODE::BLOCKS • Windows 篇 • Source Insight • Visual Studio + Visual Assistant X