1、第一次课后作业,计算对象的表示值与类型请给出R语言和Python语言中哪些值是头等程序对象?为什么?请给出R语言和Python语言类型系统的类型(无类型 or 弱类型 or 强制类型 or 伪强类型 or 强类型),以及为什么是该类型?,计算对象的表示值头等程序对象可出现在表达式中并求值可作函数返回值可单独存储 可以构成复杂的数据结构可作函数参数,R语言中的值数据类型:(逻辑型、数值型、字符型、复数型)常量、变量;数据结构:向量、因子、矩阵、数据框、多维数组、列表、时间序列;函数抽象(函数名);对象(包括类对象);,都是头等程序对象,R语言中的非头等程序对象,Python语言中的值基本数据类型
2、:字符串,整数,浮点数,虚数,布尔型;数据结构:列表、元组、字典、集合、文件;函数抽象(函数名);类对象,都是头等程序对象,Python语言中的非头等程序对象,计算对象的表示类型静态与动态 静 动 变量 有类型 无类型 动态简洁、灵活 参数 有类型 无类型 静态清晰、死板 值 有类型 有类型弱/强类型无类型 LISP , Smalltalk弱类型 变量有类型。类型兼容性大, 系统不作检查强制类型 隐式类型强制(转换),自动截尾, 补零。显式 类型强制 PL/1伪强类型 静态均有类型且作检查,由于不严,导出等价准则 Pascal强类型 类型有严格定义, 均作检查 Ada,计算对象的表示类型R语言
3、类型系统的类型动态类型、强类型Python语言类型系统的类型动态类型、强类型,计算对象的实现存储请给出R语言和Python语言中哪些值是可存储值,哪些值是不可存储值?请给出R语言和Python语言中的存储模型和存储管理机制。,第一次课后作业,计算对象的实现存储可存储值Storable:指最小的可直接访问的可存储单元中的值。Pascal可存储值:集合不选择更新某一元素是可存储值;Pascal, C, Ada数组可选择更新,不是可存储值。,计算对象的实现存储R语言中的可存储值和不可存储值可存储值(逻辑型、数值型、字符型、复数型)常量、变量;向量中的元素、因子中的元素、矩阵中的元素、数据框中的元素、
4、多维数组中的元素、列表中的元素、时间序列中的元素;不可存储值向量、因子、矩阵、数据框、多维数组、列表、时间序列;,计算对象的实现存储Python语言中的可存储值和不可存储值可存储值字符串,整数,浮点数,虚数,布尔型;列表中的元素、元组、字典中的元素、集合中的元素、文件中的元素;不可存储值列表、元组中的元素、字典、集合、文件;,计算对象的实现存储存储模型,分为以下三种:静态存储模型动态存储模型堆存储栈存储,计算对象的实现存储R语言中的存储模型静态存储模型所有语言的全局变量都是静态对象;在R语言中:使用”-”运算符进行赋值的都是全局变量;另外,在函数外声明的变量也是全局变量;,计算对象的实现存储R
5、语言中的存储模型动态存储模型Everything is R lives in an environment. An environment, like everything else in R is an object. Objects hold stuff. Environments are specialized, they can only hold two things:A frame This is just a collection of named objects. The environments owner aka the enclosing environment. Thi
6、s is just a reference to another environment.,计算对象的实现存储R语言中的存储模型,计算对象的实现存储R语言中的存储模型Environment basics,Environments,计算对象的实现存储R语言中的存储管理机制R中的对象在内存中存于两种不同的地方:一种是堆内存(heap),每个大小为8字节,新来一个对象就会申请一块空间,把值全部存在这里,和C里面的堆内存很像。第二种是地址对(cons cells),和LISP里的cons cells道理一样,主要用来存储地址信息,最小单元一般在32位系统中是28字节、64位系统中是56字节。,计算对象
7、的实现存储Python语言中的存储模型静态存储模型所有语言的全局变量都是静态对象;在Python语言中:使用global声明全局变量; 用同样的global语句可以指定多个全局变量,比如: global x, y, z。,计算对象的实现存储Python语言中的存储模型:动态存储模型Stack variablesHeap data structures,计算对象的实现存储Python语言中的存储管理机制引用计数垃圾回收内存池机制,计算对象的实现存储Python语言中的存储管理机制:引用计数有两种存储方式,按值传递和按址传递:一种是存储在stack;一种是存储在heap上;在python中只有按址
8、传递,都存储在heap上;在Python中,每个对象都有存有指向该对象的引用总数,即引用计数(reference count)。,计算对象的实现存储Python语言中的存储管理机制:垃圾回收Python 支持两种内存回收:一种是引用计数;另一种是gc。Python默认采用引用计数来管理对象的内存回收。当引用计数为0时,将立即回收该对象内存,要么将对应的block标记为空闲,要么返还给操作系统。垃圾回收时,Python不能进行其它的任务。,计算对象的实现存储Python语言中的存储管理机制:内存池机制Python的内存机制以金字塔行,-1,-2层主要有操作系统进行操作,第0层是C中的malloc
9、,free等内存分配和释放函数进行操作;第1层和第2层是内存池,有Python的接口函数PyMem_Malloc函数实现,当对象小于256K时有该层直接分配内存;第3层是最上层,也就是我们对Python对象的直接操作;,计算对象的实现存储Python语言中的存储管理机制:内存池机制经由内存池登记的内存到最后还是会回收到内存池,并不会调用 C 的 free 释放掉,以便下次使用。对于简单的Python对象,例如数值、字符串,元组采用的是复制的方式是深拷贝;也就是说当将另一个变量B赋值给变量A时,虽然A和B的内存空间仍然相同,但当A的值发生变化时,会重新给A分配空间,A和B的地址变得不再相同;,计
10、算对象的实现存储Python语言中的存储管理机制,计算对象的连接束定请给出R语言和Python语言中采用的束定机制和作用域规则。,第一次课后作业,计算对象的连接束定R语言采用的束定机制和作用域规则束定机制:无类型语言的束定机制一个变量名可以完全动态地束定到任何类型的值或操作集上。,计算对象的连接束定R语言采用的束定机制和作用域规则作用域规则:词法作用域,采用词法作用域的变量叫词法变量。词法变量有一个在编译时静态确定的作用域。词法变量的作用域可以是一个函数或一段代码,该变量在这段代码区域内可见(visibility);在这段区域以外该变量不可见(或无法访问)。,计算对象的连接束定动态作用域规则在采用动态作用域的语言里,变量与值的绑定是依赖于程序执行流程的,它是选取在运行的过程中所遇到的最近绑定。,2,计算对象的连接束定Python语言采用的束定机制和作用域规则束定机制:无类型语言的束定机制一个变量名可以完全动态地束定到任何类型的值或操作集上。,计算对象的连接束定Python语言采用的束定机制和作用域规则作用域规则:词法作用域,采用词法作用域的变量叫词法变量。词法变量有一个在编译时静态确定的作用域。词法变量的作用域可以是一个函数或一段代码,该变量在这段代码区域内可见(visibility);在这段区域以外该变量不可见(或无法访问)。,