类型检查 Type Checking 一些编程语言并不安全 类型化语言的优点 定型环境 (符号表) 断言的种类
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 一些编程语言并不安全 类型化语言的优点 定型环境 (符号表) 断言的种类的更多相关文章
- 类型检查和鸭子类型 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 ...
- Swift编程语言学习12 ——实例方法(Instance Methods)和类型方法(Type Methods)
方法是与某些特定类型相关联的函数.类.结构体.枚举都能够定义实例方法:实例方法为给定类型的实例封装了详细的任务与功能.类.结构体.枚举也能够定义类型方法:类型方法与类型本身相关联.类型方法与 Obje ...
- 苹果新的编程语言 Swift 语言进阶(十三)--类型检查与类型嵌套
一 类型检查 1. 类型检查操作符 类型检查用来检查或转换一个实例的类型到另外的类型的一种方式. 在Swift中,类型检查使用is和as操作符来实现. is操作符用来检查一个实例是否是某种特定类型,如 ...
- 读书笔记 effective c++ Item 19 像设计类型(type)一样设计
1. 你需要重视类的设计 c++同其他面向对象编程语言一样,定义了一个新的类就相当于定义了一个新的类型(type),因此作为一个c++开发人员,大量时间会被花费在扩张你的类型系统上面.这意味着你不仅仅 ...
- Java 泛型优点之编译时类型检查
Java 泛型优点之编译时类型检查 使用泛型代码要比非泛型代码更有优势,下面是 Java 官方教程对泛型其中一个优点的介绍: "Stronger type checks at compile ...
- 读书笔记 effective c++ Item 19 像设计类型(type)一样设计类
1. 你需要重视类的设计 c++同其他面向对象编程语言一样,定义了一个新的类就相当于定义了一个新的类型(type),因此作为一个c++开发人员,大量时间会被花费在扩张你的类型系统上面.这意味着你不仅仅 ...
- 编程笔记:JavaScript 中的类型检查
在Badoo的时候我们写了大量的JS脚本,光是在我们的移动web客户端上面就有大概60000行,可想而知,维护这么多JS可是相当具有挑战性的.在写如上规模js脚本客户端应用的时候我们必须对一件事保持警 ...
- python cookbook第三版学习笔记二十一:利用装饰器强制函数上的类型检查
在演示实际代码前,先说明我们的目标:能对函数参数类型进行断言,类似下面这样: @typeassert(int, int) ... def add(x, y): ... return x + y ...
- 编译器开发系列--Ocelot语言6.静态类型检查
关于"静态类型检查",想必使用C 或Java 的各位应该非常熟悉了.在此过程中将检查表达式的类型,发现类型不正确的操作时就会报错.例如结构体之间无法用+ 进行加法运算,指针和数值之 ...
随机推荐
- CentOS7安装Elasticsearch7
下载地址:https://www.elastic.co/cn/downloads/elasticsearch 使用YUM安装 # 下载并安装公共签名密钥 rpm --import https://ar ...
- Flask基础全套
Flask简介 Flask是主流PythonWeb三大框架之一,其特点是短小精悍以及功能强大从而获得众多Pythoner的追捧,相比于Django它更加简单更易上手,Flask拥有非常强大的三方库,提 ...
- MongoDb学习(五)--Gridfs--上传下载
版本 <dependency> <groupId>org.springframework.data</groupId> <artifactId>spri ...
- ESXi 中重新启动管理代理
使用直接控制台用户界面 (DCUI)重启管理代理: 连接到您的 ESXi 主机的控制台. 按 F2 自定义系统. 以 root 身份登录. 使用上下箭头导航至故障排除选项>重新启动管理代理. 按 ...
- java左移右移运算符详解
在阅读源码的过程中,经常会看到这些符号<< ,>>,>>>,这些符号在Java中叫移位运算符,在写代码的过程中,虽然我们基本上不会去写这些符号,但需要明白这些 ...
- TurtleBot3使用课程-第二节b(北京智能佳)
目录 1.导航 2 1.1 运行导航节点 3 1.1.1 [远程PC]运行roscore 3 1.1.2 [turtlebot3 SBC]运行提出turtlebot3 3 1.1.3[远程PC]运行导 ...
- 技术基础 | 监测Apache Cassandra的简明方式——MCAC
点击这里在GitHub上访问我们,以便深入了解DataStax的开源项目--Apache Cassandra指标收集器(Metric Collector for Apache Cassandra, o ...
- 阿里云centos7安装mysql8数据库
一.安装mysql 1. mysql官网查找仓库源镜像,选择downloads https://www.mysql.com/downloads/ 2. 找到社区版 3. 选择yum仓库 4. 选择对应 ...
- hdp、cdh版本大数据maven仓库
Hdp版本: <repositories> <repository> <id>nexus</id> <name>local private ...
- Spring源码深度解析之数据库连接JDBC
Spring源码深度解析之数据库连接JDBC JDBC(Java Data Base Connectivity,Java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供 ...