类型检查 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 的各位应该非常熟悉了.在此过程中将检查表达式的类型,发现类型不正确的操作时就会报错.例如结构体之间无法用+ 进行加法运算,指针和数值之 ...
随机推荐
- easyui模板页面 不良调查
<%@page import="com.xy.cc.util.CUtil" %><%@page import="com.xy.cc.bean.UserP ...
- .NET 5 源代码生成器——MediatR——CQRS
在这篇文章中,我们将探索如何使用.NET 5中的新source generator特性,使用MediatR库和CQRS模式自动为系统生成API. 中介者模式 中介模式是在应用程序中解耦模块的一种方式. ...
- [leetcode]62.UniquePaths
/** * Created by lvhao on 2017/7/6. * A robot is located at the top-left corner of a m x n grid (mar ...
- [leetcode]39combinationsum回溯法找几个数的和为目标值
import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Given a set of can ...
- Qt学习笔记-Qtcreator的webkit和qt4.7.0的版本有关
之前下载了一个最新的是qtcreator,是通过ubuntu的是apt-get下载的.可是里面没有webkit控件.网上的网友说是最新的没有了.要用老版的,于是下载了一个2.5.2的就正常了. 用老版 ...
- freemarker读取session里面的值
项目背景:springMVC+freemarker模板开发web 时代和信后台管理界面 代码示例: 后台服务: HttpSession session = request.getSession(); ...
- redis系列:分布式锁
redis系列:分布式锁 1 介绍 这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁.会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁. 本篇文章会将分布式锁的实现分 ...
- 24位PCM采样数据转成16位算法,已实现PCM转WAV在线工具源码支持24bits、16bits、8bits
目录 算法来源 js版24位PCM转8位.16位代码 js版8位.16位PCM转成24位 附:浏览器控制台下载数据文件代码 相关实现 最近收到几个24位的PCM录音源文件,Recoder库原有的PCM ...
- 关于.NET中的控制反转(二)- 依赖注入之 MEF
一.MEF是什么 Managed Extensibility Framework (MEF) 是用于创建可扩展的轻量级应用程序的库. 它让应用程序开发人员得以发现和使用扩展且无需配置. 它还让扩展开发 ...
- linux IP 注释
DEVICE=name,这里name是物理设备的名字(动态分配的PPP设备应当除外,它的名字是"逻辑名". IPADDR=addr, 这里addr是IP地址. NETMASK=ma ...