已阅读5页,还剩61页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
June5 2000 本资料来源 June5 2000 第六章类型检查 基础知识类型体制简单类型检查器的说明类型表达式的等价多态函数 June5 2000 类型检查基础 1 类型检查是编译器的主要任务之一数据类型信息的计算和维护程序的语法结构的类型是否和它的上下文所期望的一致数据类型是一个数据对象以及创建和操纵它们的操作集合所组成的类是数据对象的一个重要属性类型位置值名组件 用指针值表示 并通过指针的改变来修改 June5 2000 类型检查基础 2 数据类型规范的基本内容包括 属性 区别这个类型的数据对象的属性值 这个类型的数据对象可能取的值操作 定义对这个类型的数据对象可能的操纵的操作集合数据类型的实现存储 表示程序执行过程中在计算机存储器中的数据类型的数据对象的存储表示操作的实现 根据操纵数据对象的存储表示的特定算法或过程来表示数据类型所定义的操作的方式数据类型的语法表示属性 通过声明或类型定义来体现值 表示成文字或已定义的常量操作 可以通过特殊符号或内部过程 函数 实现 也可以隐式地通过其它语言元素的组合实现 June5 2000 类型检查基础 3 基本数据类型基本知识 基本数据对象只有单一的数据值 这种数据对象以及定义在其上的不同操作组成的类称为基本数据类型种类 整型 实型 字符型 布尔型等不同的语言对上述基本类型的表示可能是截然不同的基本数据类型的规范 属性 数据对象的基本属性 如类型和名字等 在其生存期中通常是不变的值 类型决定了它可取的可能值的集合 基本数据类型定义的值的集合通常是一个有界的有序集 对任意两个不同的值都可以比较它们的大小 June5 2000 类型检查基础 4 操作 种类 基本操作 作为语言定义的一部分程序员定义的操作 作为类定义的一部分以子程序或方法声明的操作基本数据对象的实现存储表示 通常用所需的存储块的大小 块内属性和数据值的布局来描述数据对象的表示一般和它在内存中的位置是无关的数据对象的地址是指他们所占用的存储块的第一个字或字节的地址从效率考虑 由编译器决定数据属性 如C语言从灵活性考虑 数据对象的属性可以作为运行时该数据对象的一部分以描述符的形式存储 通过软件模拟 June5 2000 类型检查基础 5 操作的实现 直接实现成硬件操作如整型的加 减法等软件的实现 作为函数或过程子程序 如平方根作为嵌入代码序列这两种实现的不同复合数据类型字符串指针文件顺序文件文本文件直接访问文件索引文件 June5 2000 类型检查基础 6 用户定义的数据类型结构化的数据规范 成员的数目每个成员的类型用来选择成员的名字最多成员数目成员的组织操作对数据结构类型上的定义域和值域的规定和基本类型的方法差不多要增加一些新的重要操作 成员选择操作全数据结构操作成员的插入和删除建立和消除数据结构 June5 2000 类型检查基础 7 抽象数据类型数据抽象 把封装的概念推广到程序员自定义的数据 抽象的数据类型是数据对象的集合 一般使用一个或多个类型定义在所定义的数据对象上的抽象操作的集合将上述两个集合封装 新的数据类型的使用者不能直接操作这个类型的数据对象 只能通过已定义的操作来使用和操作数据对象信息隐藏继承多态 June5 2000 类型检查基础 8 声明将程序执行时所需的数据对象的名字和类型的信息传给语言翻译器的程序语句声明可以表明数据对象的生存期声明的种类显式声明隐式声明如果数据对象是常量 声明可以指定它的值 变量可以指定初始值声明也可以指明具体存储的一些信息等 如cobol中存储形式的声明操作的声明 操作形式声明的目的存储表示的选择存储管理多态操作类型检查 June5 2000 类型体制 1 类型表达式 语言结构的类型可以用类型表达式指称类型构造器在一个已经说明类型的集合上创建新的类型数组 记录 指针等类型表达式的形式定义基本类型是类型表达式一般有boolean char integer real type error void其中type error表示类型检查期间的错误void表示没有值 用于语句的检查 June5 2000 类型体制 2 类型表达式可以命名 类型名是类型表达式如记录名或结构名可以作为类型表示用于变量的类型声明1 名字直接用struct或union等构造器关联structHchain intobjp intnext structHchaindimchain 100 2 类型说明 typedeclaration 用typedef机制等typedefstruct intobjp intnext Hchain Hchaindimchain 100 June5 2000 类型体制 3 类型名的管理 类型表的构造是一种特定的符号表类型的作用域类似于变量的作用域类型名与类型表达式的关联类型名可以出现在类型表达式中类型的递归定义如下的定义在C语言中是不合法的 因为在递归使用类型名intBST时 没有确定所需要的存储空间大小structintBST intisNull intval structintBSTleft right 但通过指针是可以解决上述问题的 structintBST left right June5 2000 类型体制 4 类型构造器作用于类型表达式的结果仍是类型表达式 类型构造器包括 数组 如果T是类型表达式 则array I T 是成分类型为T和下标集合为I的数组的类型表达式索引类型是有限制的 可以决定索引的前后次序 I通常是一个整数区间数组通常根据索引从小到大分配连续的存储空间1 一维数组2 多维数组typedefenum red green blue color array 0 9 color ofinteger如何存放 a 行主序 行优先等 在内存中的存放次序是a 0 red a 0 green a 0 blud a 1 red a 1 green b 列主序 列优先等 在内存中的存放次序是a 0 red a 1 red a 9 red a 0 green 开放索引数组 在声明时没有说明索引区间 常见于参数 June5 2000 类型体制 5 积 如果T1和T2是类型表达式 则它们的笛卡儿积T1 T2也是类型表达式 假定 是左结合的ML语言中的类型定义记录 结构 从某种意义上说是它各域类型的积记录的各个域是有名字的 与积的区别 对记录中某个域的引用必须与记录关联记录类型构造器record作用于域名和它们的类型组成的元组 形成类型表达式 进而可以完成记录的类型检查typerow recordaddress integer lexeme array 1 15 ofcharend vartable array 1 101 ofrow 声明类型名row代表类型表达式 record address integer lexeme array 1 15 char June5 2000 类型体制 6 指针 如果T是类型表达式 则pointer T 是表示类型 指向类型T的对象的指针 的类型表达式指针的值是一个存储器地址 其中保存着其基类型的值通常指针被看成是数字类型 可以对其进行算术运算指针的解除引用 dereference 操作符 在C语言中 如果有int p 则p表示对指针的引用 p表示对指针指向变量的引用 此时 解除指针变量的引用函数 定义域类型D到值域类型R的映射 这样的函数的类型表达式是D R1 mod函数 int int int2 在pascal中的声明 functionf a b char integerchar char pointer integer 函数的返回值 一般受到限制 但在一些语言中 如ML 函数的返回值可以式任意类型的对象 June5 2000 类型体制 7 类型表达式可以包含变量 变量的值是类型表达式利于讨论未知类型类型表达式的表示可以简便地用图表示内部结点表示类型构造器叶结点表示基本类型 类型名或类型变量 June5 2000 类型体制 8 类型体制 定义 把类型表达式指派到各个部分的一组规则类型检查器实现类型体制同一个语言的不同编译器或处理器可能使用不同的类型体制数组参数是否作为变元某些数据类型的存储方式 June5 2000 类型体制 9 静态和动态的类型检查 由编译器完成的检查是静态检查所需要的信息通常由程序员提供的声明和其它语言结构提供每个操作的参数和结果的数目 顺序和数据类型每个变量所命名的数据对象的类型 和变量名相关联的数据对象的类型在程序执行过程中必须是不变的每个常数数据对象的类型静态类型检查的特点对所有程序语句中的所有操作和所有执行路径不再需要对类型错误进一步测试不需要数据对象的类型标签和动态类型检查程序运行速度和存储使用效率得到很大的改善 June5 2000 类型体制 10 可以由硬件提供支持程序易于调试影响语言的很多特性 声明 数据控制结构以及子程序的单独编译静态类型检查的缺点在某些情况下 不能进行静态类型检查如数组访问越界的检查解决方法 借助动态类型检查 代价太高 可能很少检查到的类型标签也要存储在数据对象中对未检查的操作听其自然 可能引起错误 June5 2000 类型体制 11 目标程序运行时完成的类型检查是动态检查实现的基础 在每个数据对象中保存一个表明该对象数据类型的类型标签动态类型检查的优点程序设计灵活不需要声明和一个变量名绑定的数据对象的类型在程序执行时可以按需改变动态类型检查的缺点程序难于调试动态执行的路径不能覆盖所有的程序路径 所以测试不完全需要在程序执行过程中保存类型信息很少有底层硬件的支持 通过软件实现 程序的执行速度降低不少 June5 2000 类型体制 12 健全的类型体制由于允许静态地确定这些错误是否在程序运行时发生 不需要动态检查类型错误 称为健全的类型体制强类型化如果一个语言的编译器可以保证它所接受的程序不会有运行时的类型错误 则称这个语言是强类型的很少有语言是强类型的如C语言 数组的引用 两个short型变量操作的结果可能不是short型的等可以通过限制类型之间的转换 近似地认为是强类型的 如C语言 June5 2000 类型体制 13 错误恢复 不如语法错误直观错误的报告 至少要有错误的性质和位置类型错误的抑制错误的恢复与类型体制息息相关强制类型转换 June5 2000 简单类型检查器的说明 1 一个简单语言每个标识符的类型必须在它使用前先声明语言的定义 P D ED D D id TT char integer array num ofT TE literal num id EmodE E E E 这个语言产生的一个程序 key integer keymod19999 June5 2000 简单类型检查器的说明 2 语言的简单分析两个基本类型charinteger数组类型的下标都从1开始array 256 ofchar的类型表达式是array 1 256 char 指针类型 integer的类型表达式是pointer integer id 中的 表示解除指针引用引入一个新的基本类型 type error 用于报告错误 June5 2000 简单类型检查器的说明 3 语言的声明部分的翻译方案P D ED D DD id T addtype id entry T type T char T type char T integer T type integer T array num ofT1 T type array num val T1 type T T1 T type pointer T1 type 在P D E中 D出现在E之前 可以保证所有已声明的标识符的类型在由E产生的表达式检查之前就已保存下来这个翻译方案可以方便地实现 June5 2000 简单类型检查器的说明 4 表达式的类型检查E的综合属性type给出了E产生的表达式的类型表达式表达式类型检查的翻译方案 E literal E type char E num E type integer E id E type loopup id entry E E1modE2 E type ifE1 type integerandE2 type integerthenintegerelsetype error E E1 E2 E type ifE2 type integerandE1 type array s t thentelsetype error E E1 E type ifE1 type pointer t thentelsetype error June5 2000 简单类型检查器的说明 5 语句的类型检查增加一个特殊的类型void用于语句检查由于语句没有类型 所以如果检查正确 指派语句的类型为void否则 指派语句的类型为type error对简单的语言的修改 P D SD D D id TT char integer array num ofT TS id E ifEthenS whileEdoS S SE literal num id EmodE E E E June5 2000 简单类型检查器的说明 6 关于语句的类型检查的翻译方案 S id E S type ifid type E typethenvoidelsetype error S ifEthenS1 S type ifE type booleanthenS1 typeelsetype error S whileEdoS1 S type ifE type booleanthenS1 typeelsetype error S S1 S2 S type ifS1 type voidandS2 type voidthenvoidelsetype error type error的给出可能仍然不足够 可以进一步报告类型不匹配的性质和位置 June5 2000 简单类型检查器的说明 7 函数的类型检查函数类型声明T T1 T2 T type T1 type T2 type 函数声明E E1 E2 E type ifE2 type sandE1 type s tthentelsetype error 上述简单的文法可以推广到更复杂的情况多个变元函数做变元 June5 2000 简单类型检查器的说明 8 类型转换语言类型规则的一个常用扩充是允许混合类型的算术表达式 如表达式3 2 5此时 如果类型规则不做扩充 对不匹配的类型进行操作时 要报错上述扩充允许强制类型转换 float 3 2 5类型转换的种类 不同的语言使用不同的类型转换方式显式类型转换 由程序员显式地调用内置的转换函数隐式类型转换当类型不匹配时自动调用强制类型转换 June5 2000 简单类型检查器的说明 9 类型转换的基本原则 不丢失信息类型的提升一般不会丢失信息 如short转换为int 或int转换为float等float转换为int可能会丢失信息一个语言是否使用强制类型转换 不允许强制类型转换任何类型失配都是错误 如Ada Pascal允许强制类型转换类型失配时寻找合适的类型转换找不到合适的类型转换时 再报错强制类型转换可能隐藏了原本在编译时刻可以知道的程序设计错误 June5 2000 简单类型检查器的说明 10 从整型到实型的类型检查规则 E num E type integer E num num E type real E id E type lookup id entry E E1opE2 E type ifE1 type integerandE1 type integerthenintegerelseifE1 type integerandE1 type realthenrealelseifE1 type realandE1 type integerthenrealelseifE1 type realandE1 type realthenrealelsetype error June5 2000 类型表达式的等价 1 类型等价类型检查经常要面临的问题 两个类型表达式是否表示相同的类型structt1 structt2 intx intx1 inty 100 inty1 100 类型等价和类型表示是相互影响的类型等价的常用形式结构等价名字等价在类型等价中 递归定义如何处理 June5 2000 类型表达式的等价 2 类型表达式的结构等价结构等价的定义两个类型表达式是同样的基本类型或两个类型表达式是同样的类型构造器作用于结构等价的类型即两个类型表达式是完全相同的如integer只等价于integer pointer integer 只等价于pointer integer 等当类型表达式仅由类型构造器作用于基本类型组成时 可以使用这种等价的概念在实际实现时可能要放宽限制 如参数数组的界可以不考虑 June5 2000 类型表达式的等价 3 结构等价的测试 两个类型表达式s和tfunctionsequiv s t boolean beginifs和t是相同的基本类型thenreturntrueelseifs array s1 s2 andt array t1 t2 thenreturnsequiv s1 t1 andsequiv s2 t2 elseifs s1 s2andt t1 t2thenreturnsequiv s1 t1 andsequiv s2 t2 elseifs pointer s1 andt pointer t1 thenreturnsequiv s1 t1 elseifs s1 s2andt t1 t2thenreturnsequiv s1 t1 andsequiv s2 t2 elsereturnfalseend June5 2000 类型表达式的等价 4 数据类型结构等价的例子两个数组是等价的当且仅当它们有相同的大小和元素类型两个结构是等价的当且仅当它们有相同的元素 并且元素有相同的名字和顺序结构中 元素的顺序是重要的如果不考虑数组的界 则数组等价的测试可以重写为 如果有 s array s1 s2 t array t1 t2 测试算法中的第4和第5行改写为 elseifs array s1 s2 andt array t1 t2 thenreturnsequiv s2 t2 June5 2000 类型表达式的等价 5 类型表达式的名字等价类型表达式的名字在某些语言中类型是可以命名的如果有下述的Pascal的声明typelink cell varnext link last link p cell q r cell next last p q r是否有相同的类型 这依赖于实现 因为Pascal中没有定义术语 相同的类型 类型名可以出现在类型表达式中只有基本类型可以出现的地方 June5 2000 类型表达式的等价 6 类型表达式的名字等价把类型名看成一个可区别的类型两个类型表达式名字等价当且仅当这两个类型表达式的名字完全相同在名字等价下 上例中 next和last有相同的类型 link 而p q r有相同的类型 pointer cell 与结构等价的不同在结构等价中 类型名字由它们定义的类型表达式代替 当所有的名字替换后 两个类型表达式变成结构等价的类型表达式 则它们结构等价如果类型没有显式地与一个名字关联为这类类型每个隐式地建立一个唯一的类型名此时 上例中 q r有相同的类型 nqr 而p与q有不同的类型 np June5 2000 类型表达式的等价 7 类型表达式的两种等价的比较名字等价的缺点每个赋值语句中的每个对象必须有一个类型名 不允许有匿名类型作为参数传递的数据对象类型 不允许在子程序中再次定义 需要全局类型定义结构等价的缺点两个类型结构等价的确切定义 如果两个结构等价的结构类型中各个域的名字必须相同吗 域的顺序 程序员声明的两个变量有不同的类型 但它们可能在结构上是等价的 静态检查可能无法发现一些类型不相容的操作等错误判断算法开销比较大 June5 2000 类型表达式的等价 8 名字等价的测试 两个类型表达式s和tfunctionsequiv s t boolean beginifs和t是相同的基本类型thenreturntrueelseifs和t是类型名thenreturns telsereturnfalseend名字等价的测试也可以通过构造类型图来实现每当看见类型构造器或基本类型对应 构造一个新的结点每看见一个新的类型名 就构造一个叶结点记录名字引用的是哪个类型表达式 June5 2000 类型表达式的等价 9 类型表示中的环类型的递归定义如链表 树等 在类型定义中要引用自身类型名起重要的作用例子 structcell intinfo structcell next June5 2000 类型表达式的等价 10 当碰到记录构造器时 结构等价的测试停止 被比较的类型或者由于它们有同样的命名记录类型而等价 或者不等价 June5 2000 函数和算符的重载 1 重载符号含义的确定 依赖于上下文算术算符的重载 大多数语言中算术算符是重载的2 3 整型加法2 3 65 实型加法在FORTRAN90中 如果有realA 100 B 100 则A B是合法的 向量加法 表示两个数组的对应元素间分别进行加法在FORTRAN语言中 是重载的如果有realA 100 和integeri的声明 则A i 表示数组元素的引用如果有functionA 的声明 则A i 表示函数的调用 i是实在参数 June5 2000 函数和算符的重载 2 重载的消除 也称为算符的鉴别如果重载的符号在引用点的含义可以唯一确定 则称为 重载的消除 2 3 3 65因为是左结合的 先完成第一个加法 此时是一个整型加法 在完成第二个加法 此时是一个实型加法在C语言中 要对第一个加法的类型进行提升 June5 2000 函数和算符的重载 3 子表达式的可能类型集合仅看函数的变元无法完全消除重载单看一个子表达式 可能得到的是一个可能类型的集合例 在Ada中 算符 的标准解释是 integer integer integer如果加入如下的声明 function i j integer returncomplex function i j complex returncomplex 此时 的可能类型包括 integer integer integerinteger integer complexcomplex complex complex对于表达式2 3 5 子表达式3 5的类型是整型 而对于表达式 3 5 z 如果z是复型 则3 5的类型是复型 June5 2000 函数和算符的重载 4 表达式类型检查规则的修改幻灯片32中 一个表达式只能有唯一的类型修改 允许一个表达式对应一个类型集合以函数为例 产生式语义规则E EE types E typesE idE types lookup id entry E E1 E2 E types t E2 types中存在一个s 使得s t属于E1 types 如果函数的可能类型集合为空 则可以作为通知类型错误的条件 June5 2000 函数和算符的重载 5 此时 子表达式的可能类型集合是 integer complex 它的唯一类型的确定要考虑其出现的上下文环境 June5 2000 函数和算符的重载 6 缩小可能类型的集合在一些情况下 完整的表达式要求有唯一的类型根据上下文 缩小每个表达式的类型选择 直至唯一如果最终仍然不能得到唯一的类型 则报告类型错误修改幻灯片46的语法制导定义 增加继承属性unique产生式语义规则E EE types E typesE unique ifE types t thentelsetype errorE code E codeE idE types lookup id entry E code gen id lexeme E unique E E1 E2 E types t E2 types中存在一个s 使得s t属于E1 types t E uniqueS s s E2 typesands t E1 types E2 unique ifS s thenselsetype errorE1 unique ifS s thens telsetype errorE code E1 code E2 code gen apply E unique June5 2000 函数和算符的重载 7 上述语法制导定义的解释如果函数E1 E2 返回类型t 那么可以找到类型s 它对变元E2是可行的 同时s t对该函数是可行的对语法树的两次深度优先遍历实现上述语法制导定义第一遍 属性types的自下而上综合第二遍 属性unique的自上而下传播code在从结点返回时进行综合属性计算 June5 2000 多态函数 1 变元类型的多样性普通函数的一个变元只能有唯一的类型函数体中的语句在固定类型的变元下执行多态函数允许一个变元有不同的类型函数体中的语句可以在不同类型的变元下执行算符也可以是多态的例 内部定义的算符通常是多态的数组索引 函数作用 指针操作等算术运算Ada中的类属函数是多态的在很多语言中可以定义多态函数 June5 2000 多态函数 2 为什么要使用多态函数一些算法便于实现操作于某种数据结构 但不必顾及其成分类型在Pascal中实现链表长度的计算 必须声明info域的类型typelink cell cell recordinfo integer next linkend functionlength lptr link integer varlen integer beginlen 0 whildlptrnildobeginlen len 1 lptr lptr nextend length lenEnd June5 2000 多态函数 3 利用多态函数实现上述算法不必考虑info域的类型 算法只关心该关心的在ML中实现链表长度的计算 Funlength lptr typeifnull lptr then0elselength tl lptr 1 考虑下面的两个例子 Length sun mon tue Length 10 9 8 ML的算法对这两个例子都可以直接进行计算Pascal的算法对第二个例子可以直接进行计算 而对一个例子要修改算法 June5 2000 多态函数 4 类型变量 用变量表示类型在不要求先声明后使用的语言中 类型变量可以检查标识符使用的一致性如果同一个未声明的程序变量的不同出现作为不同的类型属性的变量使用 则可以报告使用不一致的错误如果同一个未声明的程序变量的不同出现使用的类型属性的是唯一的 则可以保证使用的一致性 并由此得到变量的类型属性类型推导 从语言结构的使用方式推导其类型 June5 2000 多态函数 5 例 类型推导技术在Pascal和C语言中的应用 typelink cell proceduremlist lptr link procedurep beginwhilelptrnildobeginp lptr lptr lptr nextendend参数p是一个过程 在第一次出现时没有给定参数 所以不知道参数的个数和类型在p第二次出现时 从表达式p lptr 中可以推导出p的类型必须是 link void对于过程mlist的调用 如果对应于p的实参的类型不满足上述要求 则是一个错误 June5 2000 多态函数 6 类型推导技术与类型检查的关系 有很多共同的地方 都要处理包含变量的类型表达式例 多态函数deref的类型functionderef p beginreturnp end 在p的第一次出现 由于对p的类型不知道 因而用类型变量 代表它的类型在p的第二次出现 由于 的出现 知道p必是指向某个未知类型 的指针 所以 pointer 所以p 的类型是 所以函数deref的类型表达式是 对于任意类型 pointer June5 2000 多态函数 7 一个含多态函数的语言全称量词的引入为了描述 不同类型 引入全称量词前面的deref类型表达式 全称量词所作用的类型变量称为由它约束检查多态函数的语言的文法P D ED D D id QQ T T T T T unary constructor T basic type T E E E E E id June5 2000 多态函数 8 多态函数的类型检查与普通函数的类型检查的区别同一表达式中的多态函数的不同出现不需要变元有相同的类型类型等价概念的不同 通过 合一 判定类型是否等价下图中 如果用pointer integer 代替 i 则pointer i 和pointer pointer integer 结构等价两个子表达式合一的结果的记录通常 类型变量可以出现在几个类型表达式中 如果s和s 的合一使得变量 代表类型t 则在类型检查的过程中 必须继续代表t June5 2000 多态函数 9 代换 实例和合一代换 将类型表达式中的类型变量用其所代表的类型表达式去替换用代换S去替换表达式t中所有类型变量的函数 functionsubst t type expression type expressionbeginift是基本类型thenreturntelseift是变量thenreturnS t elseift是t1 t2thensubst t1 subst t2 end为了方便 用S t 表示subst作用于t后所得的类型表达式 这个结果S t 叫做t的实例 June5 2000 多态函数 10 如果代换S对变量 没有指定表达式 则假定S 是 即S是这种变量的恒等映射例 用s t表示s是t的实例pointer integer pointer pointer real pointer integer integer pointer 下面左边的类型表达式不是右边的实例integerreal 代换不能用于基本类型 integer real 的代换不一致 integer 的所有出现都应代换 June5 2000 多态函数 11 如果存在某个代换S 使得S t1 S t2 则这两个表达式t1和t2能合一最一般的合一代换 对表达式
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 租赁房车协议书样本
- 石材供货合同协议书
- 经销商培训合同范本
- 男女婚前协议书范本
- 缅甸矿山投资协议书
- 礼品定制合同协议书
- 租赁压桩机合同范本
- 石场承包地合同范本
- 电脑店入股合同范本
- 空气能热水合同范本
- 河南省青桐鸣大联考2025-2026学年高三11月月考语文试题(含答案)
- 2025安徽合肥水务集团有限公司招聘56人笔试历年参考题库附带答案详解
- 2025年国企招聘考试(文秘)历年参考题库含答案详解(5卷)
- 射血分数保留的心力衰竭诊断与治疗中国专家共识 2025解读
- 2025~2026学年天津市滨海新区大港实验中学高一上学期第一次月考数学试卷
- 找准位置精准发力高效突破最后180天!-2025-2026学年高三上学期期中考试家长会
- 初一上英语教学大纲教案资料(2025-2026学年)
- 2025年及未来5年市场数据中国促卵泡激素市场发展现状调查及投资趋势前景分析报告
- 劳动工资统计培训
- 无人机植保服务在现代农业推广分析方案
- 2024年广东省航道事务中心所属事业单位招聘笔试真题
评论
0/150
提交评论