第二次课后作业 计算对象的实现—存储 请给出R语言和Python语言中哪些值是可存储值,哪些值是不可存储值?
计算对象的实现—存储 可存储值Storable:指最小的可直接访问的可存储单元中的值。 Pascal可存储值:集合不能选择更新某一元素,所以是可存储值; Pascal, C, Ada数组可选择更新,不是可存储值。
计算对象的实现—存储 R语言中的可存储值和不可存储值 可存储值 不可存储值 (逻辑型、数值型、字符型、复数型)常量、变量; 向量中的元素、因子中的元素、矩阵中的元素、数据框中的元素、多维数组中的元素、列表中的元素、时间序列中的元素; 不可存储值 向量、因子、矩阵、数据框、多维数组、列表、时间序列;
计算对象的实现—存储 Python语言中的可存储值和不可存储值 可存储值 不可存储值 字符串,整数,浮点数,虚数,布尔型; 列表中的元素,元组,字典中的元素,集合中的元素,文件中的元素; 不可存储值 列表,元组中的元素,字典,集合,文件;
计算对象的实现—存储 存储模型,分为以下三种: 静态存储模型 动态存储模型 堆存储 栈存储
计算对象的实现—存储 R语言中的存储模型 静态存储模型 所有语言的全局变量都是静态对象; 在R语言中: 使用”<<-”运算符进行赋值的都是全局变量; 另外,在函数外声明的变量也是全局变量;
计算对象的实现—存储 R语言中的存储模型 动态存储模型 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 environment’s owner aka the enclosing environment. This is just a reference to another environment. 在R语言中,不管是变量,对象,或者函数,都存在于R的环境空间中 计算机中的文件总是储存在一个个文件夹之中,而这些文件夹又可能储存在另一个父文件夹之中。R存储对象也存在这样一个类似的层级系统结构。每个对象都存储在一个环境(environment)中,环境是一个类似于列表的对象,概念上接近文件夹。
计算对象的实现—存储 R语言中的存储模型
计算对象的实现—存储 R语言中的存储模型 Environment basics Environments
计算对象的实现—存储 R语言中的存储管理机制 R中的对象在内存中存于两种不同的地方: 一种是堆内存(heap),每个大小为8字节,新来一个对象就会申请一块空间,把值全部存在这里,和C里面的堆内存很像。 第二种是地址对(cons cells),和LISP里的cons cells道理一样,主要用来存储地址信息,最小单元一般在32位系统中是28字节、64位系统中是56字节。
计算对象的实现—存储 Python语言中的存储模型 静态存储模型 所有语言的全局变量都是静态对象; 在Python语言中: 使用global声明全局变量; 用同样的global语句可以指定多个全局变量,比如: global x, y, z。
计算对象的实现—存储 Python语言中的存储模型:动态存储模型 Stack — variables Heap — data structures
计算对象的实现—存储 Python语言中的存储管理机制 引用计数 垃圾回收 内存池机制
计算对象的实现—存储 Python语言中的存储管理机制:引用计数 有两种存储方式,按值传递和按址传递: 一种是存储在stack; 一种是存储在heap上; 在python中只有按址传递,都存储在heap上; 在Python中,每个对象都有存有指向该对象的引用总数,即引用计数(reference count)。
计算对象的实现—存储 Python语言中的存储管理机制:垃圾回收 Python 支持两种内存回收: 一种是引用计数; 另一种是gc。 Python默认采用引用计数来管理对象的内存回收。当引用计数为0时,将立即回收该对象内存,要么将对应的block标记为空闲,要么返还给操作系统。 垃圾回收时,Python不能进行其它的任务。
计算对象的实现—存储 Python语言中的存储管理机制:内存池机制 Python的内存机制以金字塔行,-1,-2层主要有操作系统进行操作, 第0层是C中的malloc,free等内存分配和释放函数进行操作; 第1层和第2层是内存池,有Python的接口函数PyMem_Malloc函数实现,当对象小于256K时有该层直接分配内存; 第3层是最上层,也就是我们对Python对象的直接操作;
计算对象的实现—存储 Python语言中的存储管理机制:内存池机制 经由内存池登记的内存到最后还是会回收到内存池,并不会调用 C 的 free 释放掉,以便下次使用。 对于简单的Python对象,例如数值、字符串,元组采用的是复制的方式是深拷贝; 也就是说当将另一个变量B赋值给变量A时,虽然A和B的内存空间仍然相同,但当A的值发生变化时,会重新给A分配空间,A和B的地址变得不再相同;
计算对象的实现—存储 Python语言中的存储管理机制 Run-time Stack Heap 1,2,3,4 4 add Activation Record main Activation Record list1 module Activation Record k Heap 1,2,3,4 4 Run-time Stack k=4 def main(): main() list1=[] def add(): add() for x in range(1,k): list1.append(x) print(list1)
第二次课后作业 计算对象的连接—束定 请给出R语言和Python语言中采用的束定机制和作用域规则。
计算对象的连接—束定 R语言采用的束定机制和作用域规则 束定机制:无类型语言的束定机制 一个变量名可以完全动态地束定到任何类型的值或操作集上。
计算对象的连接—束定 R语言采用的束定机制和作用域规则 作用域规则:词法作用域 采用词法作用域的变量叫词法变量。 词法变量有一个在编译时静态确定的作用域。词法变量的作用域可以是一个函数或一段代码,该变量在这段代码区域内可见(visibility);在这段区域以外该变量不可见(或无法访问)。
计算对象的连接—束定 动态作用域规则 在采用动态作用域的语言里,变量与值的绑定是依赖于程序执行流程的,它是选取在运行的过程中所遇到的最近绑定。 2
计算对象的连接—束定 Python语言采用的束定机制和作用域规则 束定机制:无类型语言的束定机制 一个变量名可以完全动态地束定到任何类型的值或操作集上。
计算对象的连接—束定 Python语言采用的束定机制和作用域规则 作用域规则:词法作用域