Compiler http://staff.ustc.edu.cn/~bjhua/courses/compiler/2014/

http://staff.ustc.edu.cn/~bjhua/courses/compiler/2014/readings/typing.pdf

类型检查是什么?对编译有什么作用? - 知乎 https://www.zhihu.com/question/348502876/answer/848425608

类型检查主要是为了判断变量或者参数的实际类型和声明的类型是否匹配的问题。通常我们遇到这个问题的时候,是语义分析阶段的静态类型检查。这个类型检查可以让我们及早的发现类型不匹配的问题,不用等到执行的时候才发现这个问题。提前发现问题,降低问题成本。

大侠素材铺 http://staff.ustc.edu.cn/~chengli7/courses/compiler18/notes/Lecture11_type_check.pdf

记号流
语法分析器
分析树
类型检查器
注释分析树
中间代码生成
中间表示
符号表

程序运行时的执行错误

会被捕获的错误(trapped error)

例:非法指令错误、非法内存访问、除数为零  引起计算立即停止

不会被捕获的错误(untrapped error)

例:下标变量的访问越过了数组的末端;跳到一 个错误的地址,该地址开始的内存正好代表一个 指令序列 错误可能会有一段时间未引起注意 希望可执行的程序不存在不会被捕获的错误

安全语言

良行为的(well-behaved)程序 没有统一的定义 如: 没有任何不会被捕获的错误的程序

安全语言(safe language) 定义: 安全语言的任何合法程序都是良行为的

设计类型系统, 通过静态类型检查拒绝不会被捕获错误 设计正好只拒绝不会被捕获错误的类型系统是困难的

禁止错误(forbidden error) 不会被捕获错误集合+ 会被捕获错误的一个子集

类型化的语言
变量的类型
限定了变量在程序执行期间的取值范围
类型化的语言(typed language)
变量都被给定类型的语言
表达式、语句等程序构造的类型都可以静态确定
例如,类型boolean的变量x在程序每次运行时的值
只 能是布尔值,not (x)总有意义
未类型化的语言(untyped language)
不限制变量值范围的语言,如JavaScript、Perl
显式类型化语言
类型是语法的一部分
隐式类型化的语言
不存在隐式类型化的主流语言,但可能存在忽略
类型信息的程序片段,如不需要程序员声明函数的
参数类型

类型系统
语言的组成部分,其构成成分是一组定型规则
(typing rule),用来给各种程序构造指派类型
设计目的
用静态检查的方式来保证合法程序在运行时的良
行为
类型系统的形式化
类型表达式、定型断言、定型规则
类型检查算法
通常是静态地完成类型检查

类型可靠的语言
良类型的程序(well-typed program)
没有类型错误的程序,也称合法程序
类型可靠(type sound)的语言
所有良类型程序(合法程序)都是良行为的
类型可靠的语言一定是安全的语言
语法的和静态的概念 动态的概念
类型化语言 安全语言
良类型程序 良行为的程序

类型检查与推断
类型检查
Type Checking is the process of verifying fully
typed programs
类型推断
Type Inference is the process of filling in missing
type information

类型检查
未类型化语言
可以通过运行时的类型推断和检查来排除禁止错误
类型化语言
类型检查也可以放在运行时完成,但影响效率
一般都是静态检查,类型系统被用来支持静态检查
通常也需要运行时的检查,如数组访问越界检查

一些编程语言并不安全
禁止错误集合没有囊括所有不会被捕获的错误
用C语言的共用体(union)来举例
union U { int u1; int u2;} u;
int *p;
u.u1 = 10;
p = u.u2;
*p = 0;

C语言
有很多不安全但被广泛使用的特征,如:指针算
术运算、类型强制、参数个数可变
在语言设计的历史上,安全性考虑不足是因为当
时强调代码的执行效率
在现代语言设计上,安全性的位置越来越重要
C的一些问题已经在C++中得以缓和
更多一些问题在Java中已得到解决

类型化语言的优点

从工程的观点看
开发的实惠:较早发现错误、类型信息具有文档作用
编译的实惠:程序模块可以相互独立地编译
运行的实惠:可得到更有效的空间安排和访问方式

取类型信息进行检查

定型环境 (符号表)

断言的形式
|– S S的所有自由变量都声明在中
其中
 是一个静态定型环境(编译器实现中的符号表),
如 x1
:T1
, …, xn
:Tn
S的形式随断言形式的不同而不同
断言有三种具体形式

断言的种类
环境断言
 |–  该断言表示是良形的环境
将用推理规则来定义环境的语法(而不是用文法)
语法断言
 |– nat 在环境下,nat是类型表达式
将用推理规则来定义类型表达式的语法
定型断言
 |– M : T 在环境下, M具有类型T
例: |– true : boolean x : nat |– x+1 : nat
将用推理规则来确定程序构造实例的类型

类型检查与推断
类型检查(type checking)
用语法制导的方式,根据上下文有关的定型规则来
判定程序构造是否为良类型的程序构造的过程
可以边解析边检查,也可以在访问AST时进行检查
类型推断(type inference)
类型信息不完全情况下的定型判定问题
例如:f (x : t) = E 和f (x) = E的区别

类型检查
设计语法制导的类型检查器
设计依据是上节的类型系统
类型环境的信息进入符号表
对类型表达式采用抽象语法
具体:array [N] of T 抽象:array (N, T)
T pointer (T)
考虑到报错的需要,增加了类型type_error

类型检查 Type Checking 一些编程语言并不安全 类型化语言的优点 定型环境 (符号表) 断言的种类的更多相关文章

  1. 类型检查和鸭子类型 Duck typing in computer programming is an application of the duck test 鸭子测试 鸭子类型 指示编译器将类的类型检查安排在运行时而不是编译时 type checking can be specified to occur at run time rather than compile time.

    Go所提供的面向对象功能十分简洁,但却兼具了类型检查和鸭子类型两者的有点,这是何等优秀的设计啊! Duck typing in computer programming is an applicati ...

  2. Swift编程语言学习12 ——实例方法(Instance Methods)和类型方法(Type Methods)

    方法是与某些特定类型相关联的函数.类.结构体.枚举都能够定义实例方法:实例方法为给定类型的实例封装了详细的任务与功能.类.结构体.枚举也能够定义类型方法:类型方法与类型本身相关联.类型方法与 Obje ...

  3. 苹果新的编程语言 Swift 语言进阶(十三)--类型检查与类型嵌套

    一 类型检查 1. 类型检查操作符 类型检查用来检查或转换一个实例的类型到另外的类型的一种方式. 在Swift中,类型检查使用is和as操作符来实现. is操作符用来检查一个实例是否是某种特定类型,如 ...

  4. 读书笔记 effective c++ Item 19 像设计类型(type)一样设计

    1. 你需要重视类的设计 c++同其他面向对象编程语言一样,定义了一个新的类就相当于定义了一个新的类型(type),因此作为一个c++开发人员,大量时间会被花费在扩张你的类型系统上面.这意味着你不仅仅 ...

  5. Java 泛型优点之编译时类型检查

    Java 泛型优点之编译时类型检查 使用泛型代码要比非泛型代码更有优势,下面是 Java 官方教程对泛型其中一个优点的介绍: "Stronger type checks at compile ...

  6. 读书笔记 effective c++ Item 19 像设计类型(type)一样设计类

    1. 你需要重视类的设计 c++同其他面向对象编程语言一样,定义了一个新的类就相当于定义了一个新的类型(type),因此作为一个c++开发人员,大量时间会被花费在扩张你的类型系统上面.这意味着你不仅仅 ...

  7. 编程笔记:JavaScript 中的类型检查

    在Badoo的时候我们写了大量的JS脚本,光是在我们的移动web客户端上面就有大概60000行,可想而知,维护这么多JS可是相当具有挑战性的.在写如上规模js脚本客户端应用的时候我们必须对一件事保持警 ...

  8. python cookbook第三版学习笔记二十一:利用装饰器强制函数上的类型检查

    在演示实际代码前,先说明我们的目标:能对函数参数类型进行断言,类似下面这样: @typeassert(int, int) ... def add(x, y): ...     return x + y ...

  9. 编译器开发系列--Ocelot语言6.静态类型检查

    关于"静态类型检查",想必使用C 或Java 的各位应该非常熟悉了.在此过程中将检查表达式的类型,发现类型不正确的操作时就会报错.例如结构体之间无法用+ 进行加法运算,指针和数值之 ...

随机推荐

  1. 我的 2020:出书、办签售会、发展 VS Code 中文社区、成为开源先锋、全网 10 万粉丝、10 场演讲、内推 21 人、955.WLB 发扬光大

    感觉写 2019 年终总结还是在不久之前.转眼间,2020 已经接近尾声了.是时候来写写 2020 年的年终总结了. 出书 今年最高兴的事情之一,就是出了全球首本 VS Code 中文书 -- < ...

  2. JavaDailyReports10_13

    今天完成了课堂测试二的内容要求,开阔了编程的思路,学到了很多程序设计思想,为以后的学习提供了很多帮助. 明天开始继续完善四则运算的程序,并且开始JavaWeb的学习!

  3. 企业集群架构-03-NFS

    NFS 目录 NFS NFS基本概述 NFS应用场景 NFS实现原理 NFS总结 NFS服务端安装 环境准备 服务端安装NFS 服务端NFS配置 服务端开机自启 服务端验证配置 NFS客户端挂载卸载 ...

  4. reactor模式:单线程的reactor模式

    reactor模式称之为响应器模式,常用于nio的网络通信框架,其服务架构图如下 不同于传统IO的串行调度方式,NIO把整个服务请求分为五个阶段 read:接收到请求,读取数据 decode:解码数据 ...

  5. elasticsearch基本概念和基本语法

    Elasticsearch是基于Json的分布式搜索和分析引擎,是利用倒排索引实现的全文索引. 优势: 横向可扩展性:增加服务器可直接配置在集群中 分片机制提供更好的分布性:分而治之的方式来提升处理效 ...

  6. windows7 错误0xc00000ba;无法进入系统;

    事件背景:电脑windows7 错误0xc00000ba无法进系统:无法进入安全模式:无法进入最后一次正确配置: 事件处理:提示系统文件丢失,注册表异常:知乎有人提及更换WS2_32.DLL; 使用P ...

  7. SpringCloud --服务调用Feign

    介绍 服务间通信简介 一个系统可以由不同的微服务构成,比如一个电商系统可以由订单服务.商品服务.用户服务等共同组成. 这些服务相互独立,但又相互依赖.由于它们相互依赖,所以需要通过通信的方式来进行相互 ...

  8. js--获取滚动条位置,并实现页面滑动到锚点位置

    前言 这篇来记录下最近工作中遇到的一个问题,在app原生和前端h5混合开发的过程中,其中一个页面是选择城市列表的页面,类似于美团饿了么城市选择,银行app中银行列表选择,通讯录中快速定位到联系人选择的 ...

  9. [每日一题]面试官问:谈谈你对ES6的proxy的理解?

    [每日一题]面试官问:谈谈你对ES6的proxy的理解? 关注「松宝写代码」,精选好文,每日一题 作者:saucxs | songEagle 一.前言 2020.12.23 日刚立的 flag,每日一 ...

  10. SpringCloud Gateway快速入门

    SpringCloud Gateway cloud笔记第一部分 cloud笔记第二部分Hystrix 文章目录 SpringCloud Gateway Zull的工作模式与Gateway的对比 Rou ...