1 / 68

大规模集成电路设计应用与实践

代码阅读与实践 Lecture 1 主讲人:胡亚斌 E-mail : yabin.hwu@gmail.com. 大规模集成电路设计应用与实践. 系列课程之. 1. 2. 3. 课程内容. 知识背景. 代码阅读那些事. 代码阅读工具. 系统工具. 代码阅读. 编程范型. 计算机体系结构. 知识背景. 代码阅读那些事. 代码阅读的目的. 代码阅读有哪些事. 阅读什么样的代码. 从哪里获取代码. 工具决定 效率. Linux 平台 Native. Windows 平台 虚拟机 Cygwin. 代码阅读工具. 知识背景之.

Download Presentation

大规模集成电路设计应用与实践

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. 1 2 3 课程内容 知识背景 代码阅读那些事 代码阅读工具

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

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

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

  6. 知识背景之 编程范型

  7. 代码的世界

  8. 常用程序设计语言统计 From langpop.com 还可以参考 TIOBE index http://www.tiobe.com/content/paperinfo/tpci/index.html

  9. 提几个问题 • 听过以下说法吗? • 我学的是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) • ……

  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

  16. 命令式语言 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. 逻辑式

  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<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); }

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

  26. 实例: 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代码实现

  27. 实例: 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++代码实现呢?

  28. 实例: duck typing (2.2) voidShoutAndSwim(animal *anmal) { anmal->shout(); anmal->swim(); } intmain(){ duck *dk=newduck(); frog *fg=newfrog(); ShoutAndSwim(dk); ShoutAndSwim(fg); } //如果用C++代码实现呢?

  29. 实例: 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代码实现

  30. 实例: 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++代码实现呢?

  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: 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

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

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

  50. 其它工具 - XMind

More Related