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

Slides:



Advertisements
Similar presentations
第五节 函数的微分 一、微分的定义 二、微分的几何意义 三、基本初等函数的微分公式与微分运算 法则 四、微分形式不变性 五、微分在近似计算中的应用 六、小结.
Advertisements

数据结构的引入. 通讯录管理 社团机构管理 校园导航管理 通讯录管理 社团机构管理 校园导航管理.
董笑菊 电子信息与电气工程学院 计算机科学与工程系
计算机网络教程 任课教师:孙颖楷.
ASP .NET 程序设计(C#版) 第二版 机械工业出版社同名教材 配套电子教案
LSF系统介绍 张焕杰 中国科学技术大学网络信息中心
山东英才学院 SHANDONG YINGCAI UNIVERSITY
Tool Command Language --11级ACM班 金天行.
基于解释性语言的手机跨平台架构 Sloan Yi. Qt MTK.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
全国计算机等级考试 二级基础知识 第二章 程序设计基础.
代码阅读与实践 Lecture 2 主讲人:胡亚斌
《数据库原理及应用》课程介绍 信息工程学院 孙俊国
LSF系统介绍 张焕杰 中国科学技术大学网络信息中心
嵌入式系统课程简介 宋健建 南京大学软件学院 2004/02/10.
SVN的基本概念 柳峰
Computer Graphics 计算机图形学基础 张 赐 Mail: CSDN博客地址:
学习前的准备工作 讲师:burning.
SVN服务器的搭建(Windows) 柳峰
Python ——谁说简洁就不能强大? Gingko Studio.
走进编程 程序的顺序结构(二).
第11章:一些著名开源软件介绍 第12章:服务安装和配置 本章教学目标: 了解当前一些应用最广泛的开源软件项目 搭建一个网站服务器
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
第五讲 四则运算计算器(一) 精品教程《C#程序设计与应用(第2版)清华大学出版社 谭恒松 主编
《手把手教你学STM32》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司 淘宝店铺:
动态规划(Dynamic Programming)
中国科学技术大学计算机系 陈香兰(0551- ) Spring 2009
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
三:基于Eclipse的集成开发环境搭建与使用
Unit 11.Operating System 11.1 What’s OS 11.2 Related Courses
程序设计工具实习 Software Program Tool
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
内容摘要 ■ 课程概述 ■ 教学安排 ■ 什么是操作系统? ■ 为什么学习操作系统? ■ 如何学习操作系统? ■ 操作系统实例
C语言程序设计 主讲教师:陆幼利.
EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
微机系统的组成.
$9 泛型基础.
VisComposer 2019/4/17.
姚金宇 MIT SCHEME 使用说明 姚金宇
工业机器人知识要点解析 (ABB机器人) 主讲人:王老师
计算机网络与网页制作 Chapter 07:Dreamweaver CS5入门
<编程达人入门课程> 本节内容 内存的使用 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
项目二:HTML语言基础.
本节内容 Win32 API中的宽字符 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
成绩是怎么算出来的? 16级第一学期半期考试成绩 班级 姓名 语文 数学 英语 政治 历史 地理 物理 化学 生物 总分 1 张三1 115
第4章 Excel电子表格制作软件 4.4 函数(一).
北师大版五年级数学下册 分数乘法(一).
JSP实用教程 清华大学出版社 第2章 JSP运行环境和开发环境 教学目标 教学重点 教学过程 2019年5月7日.
<编程达人入门课程> 本节内容 计算机编程语言 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
魏新宇 MATLAB/Simulink 与控制系统仿真 魏新宇
计算机绘图 AutoCAD2016.
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第二节 C语言的特点.
ARM裸机第一部分-ARM那些你得知道的事
基于列存储的RDF数据管理 朱敏
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
本节内容 进程 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第十七讲 密码执行(1).
第十二讲 密码执行(上).
FVX1100介绍 法视特(上海)图像科技有限公司 施 俊.
学习数据结构的意义 (C语言版) 《数据结构》在线开放课程 主讲人:李刚
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
任课教师:戴开宇 TA:时均帅、谭肖、王安华 程序设计B班 :20-16:50(90分钟)
第二次课后作业答案 函数式编程和逻辑式编程
Presentation transcript:

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

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

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

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

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

知识背景之 编程范型

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

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

提几个问题 听过以下说法吗? 谁知道下面C语句给n赋什么值? 为什么我的程序调试时完全正确,Release生成的程序却出了错? 我学的是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) …… 为啥要讲程序语言范型?跟代码阅读有何关系? 有助于程序员的成长。 程序员成长的4个阶段(境界): 学会 —— 掌握一些具体编程知识的初级程序员。 会学 —— 能快速而深刻的理解技术并举一反三的程序员。 会用 —— 能将所学灵活运用到实际编程设计之中的高级程序员。 被用 —— 能设计出广为人用的应用程序、库、工具包、框架等的系统分析师和架构师。更高的境界是,发明主流的设计模式、算法、语言,乃至计算理论等等。 你也许还听说过下面的词汇 说明式语言(Declarative) 脚本语言(Scripting Language) 孟子说过:“劳心者治人,劳力者治于人”

过程式范型 把计算看成一系列操作的执行,基本计算元素是一组基本操作。计算在一个环境里进行,操作的效果就是改变环境的状态: 语言提供一组基本操作和一组描述组合操作的手段,提供的抽象手段是定义新操作(定义过程)。过程实现大步的状态变换。 写程序就是描述操作执行的顺序过程,描述状态和状态的变化常规语言,如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 范型的分类:命令式和声明式,这是从编程的理念和风格上说的 命令式编程是行动导向的(action-oriented),算法是显性的而目标是隐性的; (因而阅读命令式语言代码很困难,更不幸的是,命令式语言占绝对统治地位) 命令式编程是目标驱动的(Goal-Driven),目标是显性的而算法是隐性的;

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

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

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

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

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

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

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

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

实例: 泛型范型(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); }

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

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

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

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

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

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

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

计算模型 计算机硬件由连接起来的一组硬件器件构成,其作用是实现机器语言程序描述的计算过程。从使用者的角度看,其内部实现方式可以不必关心,只需要关心它所提供的机器语言(指令的形式和意义) 即使具体硬件改变了,只要机器语言不变,使用方式就不必改变,以前写的程序仍然可用。因此: 机器语言可以看作计算机硬件的一种“抽象”。一种机器语言对应于一类计算机,或说对应于一种“抽象计算机”(抽象机)。如: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 篇 Windows 篇 find, grep, awk, sed Make (GNU makefile, Autotools) Vim IDE -- Eclipse, CODE::BLOCKS Windows 篇 Source Insight Visual Studio + Visual Assistant X

其它工具 - XMind

其它工具 - SmartDraw

其它工具 - OneNote

课后作业(1) 浏览wiki上关于编程语言的网页 浏览冯.诺依曼计算机结构和非冯氏计算机结构资料 PPT 第7页图中哪些不是编程语言? http://en.wikipedia.org/wiki/Programming_language 浏览冯.诺依曼计算机结构和非冯氏计算机结构资料 http://baike.baidu.com/view/3414614.html http://baike.baidu.com/view/368294.html PPT 第7页图中哪些不是编程语言?

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

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

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

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

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的习惯。

第一门编程语言 MIT选择Python作为大学第一门编程语言或者专业导引课的主要内容传授。 MIT 6.00 - Introduction to Computer Science and Programming http://6.00.scripts.mit.edu/home.cgi MIT 6.01 - Introduction to EECS I http://mit.edu/6.01/mercurial/fall10/www/calendar.html UIUC, stanford选择了Java

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.

Thank you

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

Backup 备用幻灯

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

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

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

Top CS Programs in USA

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