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. Code-Review-Maven编译(第三方jar包引用)

    Code-Review-SpringBoot-Maven编译(第三方jar包引用) 在使用maven编译项目时,有时候咱们可能会使用一些第三方的jar包依赖库,比如第三方支付类的接入,大多出于安全考虑 ...

  2. sql将两个查询结果拼接到一块,去掉重复,动态sql

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-/ ...

  3. IDEA 远程debug

    远程debug tomcat 的Catalina.sh 里面有个参数 JPDA_ADDRESS="5555",默认为5555.启动tomcat时,用 ./catalina.sh j ...

  4. 听说又有兄弟因为用YYYY-MM-dd被锤了...

    还记得去年分享过一篇日期格式化使用 YYYY-MM-dd 的潜在问题的文章不? 历史又重演了... 事故现场 我们来写个单元测试,重现一下这个问题. 测试逻辑: 创建两个日期格式化,一个是出问题的YY ...

  5. node-sass 安装失败报错的原因及解决办法(整理)

    npm install 时偶尔遇到报错:没有安装python或node-sass 安装失败的问题,百度之后发现是被墙了,但根据百度的方法换了淘宝镜像和用了vpn都安装失败,最后发现原来是因为没有卸载之 ...

  6. Scriptable Render Pipeline

    Scriptable Render Pipeline SRP的核心是一堆API集合,使得整个渲染过程及相关配置暴露给用户,使得用户可以精确地控制项目的渲染流程. SRP API为原有的Unity构件提 ...

  7. Spring Cloud Hystrix应用篇(十一)

    一.背景 分布式系统环境下,服务间类似依赖非常常见,一个业务调用通常依赖多个基础服务.如下图,对于同步调用,当库存服务不可用时,商品服务请求线程被阻塞,当有大批量请求调用库存服务时,最终可能导致整个商 ...

  8. 讲讲Java8的Optional类

    前言 Java 8中引入了 Optional 类来解决 NullPointerException 与繁琐的 null 检查,该类首次出现在 Guava.Java 8 才成为类库中的一部分. 入门 Op ...

  9. AI智能皮肤测试仪助力美业数字化营销 实现门店与用户双赢局面

    当皮肤遇到AI智能,会有怎么样的火花呢?随着生活水平的提升,人们对肌肤保养护理的需求也越来越高,人要美,皮肤养护也要更精准,数字化必将成为美业发展的新契机.新机遇下肌肤管家SkinRun为美业客户提供 ...

  10. 技术基础 | Cassandra RBAC助你打击“虚拟海盗”,让他们对数据“战利品”望而不得

    现如今,我们称虚拟世界里的海盗们为"黑客",他们所追寻的战利品就是在你数据库某处的数据.   而我们能够保证你的数据安全的工具之一,就是"Cassandra基于角色的访问 ...