【PL理论】(31) 类型系统:静态分析 (Static Analysis) | 静态类型系统 | 什么是类型?

news/2024/7/5 4:01:37

  • 💭 写在前面:本章我们将进入类型系统的讲解,回顾一下之前我们整理的 F- 语言,然后介绍一下静态分析和静态类型系统。讨论程序员该如何处理一些 bug,有没有完美的静态分析器。

目录

0x00 回顾:F- 语言

0x01 静态分析(Static Analysis)

0x02 静态类型系统(Static Type System)

0x03 什么是类型?


0x00 回顾:F- 语言

我们之前定义了简化版 F# 的语法和语义,并将其命名为 F-。

这是没有匿名 / 递归函数的版本:

我们还实现了一个解释器,根据语义定义运行程序,程序的执行意味着对F中的表达式进行求值。

floyd:~/Lab3$ cd FMinus/
floyd:~/Lab3/FMinus$ ls
FMinus.fsproj src testcase
floyd:~/Lab3/FMinus$ ls src
AST.fs FMinus.fs Lexer.fsl Main.fs Parser.fsy Types.fs

(let rec evalExp (exp: Exp) (env: Env) : Val =)

请记住,某些在语法上有效的 F 程序未定义其语义。直观地说,这种情况相当于程序错误(漏洞),例如:类型不匹配、使用未绑定变量、除零错误,到目前为止,这些错误是在运行时捕获的(通过引发异常)

在现实世界中的编程语言中,还可能存在各种其他类型的错误(bug),例如:缓冲区溢出、悬空指针、未初始化数据的使用,等等。

有时,即使程序的语义定义是明确的,也可能存在问题,例如:逻辑错误、内存泄漏,等等。

0x01 静态分析(Static Analysis)

每个人都知道漏洞普遍存在且很重要,程序员无法避免犯错,我们应该如何处理这些漏洞?

开发一种能够在运行前检测漏洞的自动化技术怎么样?

  • 自动化:由程序分析,而非人工
  • 运行前:防止其在实际运行中引发严重问题

这种技术(或用于此的工具/程序)被称为静态分析(静态分析器),请记住,在编程语言中,静态表示 "在运行前决定"。

但遗憾的是,完美的静态分析器是不存在的,编写一个完美的程序分析算法被证明是不可能的(不可判定问题),参见自动机理论中的停机问题。

这里,完美是指健全性和完备性:

  • 健全性:有错误的程序总是被拒绝 / 从不遗漏错误 / 如果程序通过检查,保证没有错误
  • 完备性:没有错误的程序总是被接受 / 从不拒绝安全的程序 / 如果被拒绝,必定有错误

我们必须在健全性和完备性之间做出取舍,有时,我们甚至两者都要放弃。

尽管如此,这样的静态分析器(带有近似性)仍然是有用的。

0x02 静态类型系统(Static Type System)

静态类型系统是最原始和最流行的静态分析器形式之一,其目标是在运行前自动检测类型错误,通常作为编译器或解释器的一部分配备。

我们应该选择哪一方面:健全性还是完备性? F# 采用的是健全(但不完备)的类型系统,本专栏我们也将讨论 F- 的健全类型系统。

0x03 什么是类型?

类型是一组值,或者可以将其视为值的抽象。

bool: { 真, 假 }

int: { … , -2, -1, 0, 1, 2, … }

int -> int:接受一个整数并返回一个整数的函数集合:

let incr : int -> int = fun x -> x + 1 

'a -> 'a:接受任意类型 'a 并返回相同类型的函数集合:

let identity : 'a -> 'a = fun x -> x


📌 [ 笔者 ]   王亦优
📃 [ 更新 ]   2024.6.10
❌ [ 勘误 ]   /* 暂无 */
📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,
              本人也很想知道这些错误,恳望读者批评指正!

📜 参考资料 

Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .


http://lihuaxi.xjx100.cn/news/2219854.html

相关文章

多态深度剖析

前言 继承是多态的基础, 如果对于继承的知识还不够了解, 可以去阅读上一篇文章 继承深度剖析 基本概念与定义 概念: 通俗来说,就是多种形态。具体点就是去完成某个行为, 当不同的对象去完成时会产生出不同的状…

jEasyUI 转换 HTML 表格为数据网格

jEasyUI 转换 HTML 表格为数据网格 jEasyUI 是一个基于 jQuery 的框架,它为用户提供了一套完整的用户界面组件,使得网页开发变得更加简单快捷。在本文中,我们将探讨如何使用 jEasyUI 将一个普通的 HTML 表格转换为功能丰富的数据网格(datagrid)。 为什么使用数据网格? …

UART基本定义、三种编程方式、freertos内怎么用、怎么封装

文章目录 串口基本概念串口的三种编程方式uart编程查询方式不常用、其他两个方式用的多中断方式:代码原理 DMA方式:配置DMA原理代码 效率最高的UART编程方式:是什么?操作 在freertos里面调用uart应该怎么做?代码 面向对…

和鲸101领航北中医:助力健康医疗AI实验室建设,培养交叉数据人才

2024 年 3 月开学季,北京中医药大学(简称“北中医”)的健康医疗人工智能实验室迎来了正式投入使用后的第一堂课。除了配备全新的桌椅和尖端的硬件服务器外,实验室还引入了先进的人工智能实训平台,为大数据管理与应用专…

HTML(7)——无语义的布局标签和字符实体

无语义的布局标签 作用&#xff1a;布局网页&#xff08;划分网页区域&#xff0c;摆放内容&#xff09; div&#xff1a;独占一行 span&#xff1a;不换行 字符实体 作用&#xff1a;在网页中显示预留字符 显示结果描述实体名称空格 <小于号<>大于号> 在代码中…

博瓦科技产品亮相湖北安博会啦!!!

6月12日&#xff0c;第二十三届2024中国&#xff08;武汉&#xff09;社会公共安全产品暨数字城市产业展览会&#xff08;简称&#xff1a;湖北安博会&#xff09;在武汉国际会展中心隆重开幕。作为行业内最具影响力的展会之一&#xff0c;此次盛会将汇聚来自全球的顶尖企业、专…

实现锚点链接点击tab跳转到指定位置 并且滚动鼠标顶部锚点的样式也跟随变化

实现效果如下 不管是点击还是 滚动鼠标 顶部的样式也会跟随变化 点击会跳转到指定的位置 通过IntersectionObserver 监听是否可见 下面代码可以直接执行到vue的文件 <template><div><ul class"nav"><li v-for"tab in tabs" :key…

Vue实现无限滚动加载更多内容(懒加载)或实现查看更多按钮

在Vue中实现无限滚动加载更多内容&#xff0c;通常可以使用vue-infinite-loading插件。以下是一个简单的例子&#xff1a; 1、首先&#xff0c;安装vue-infinite-loading&#xff1a; npm install vue-infinite-loading --save2、在Vue组件中使用它&#xff1a; <templat…