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

2024-06-18 16:36

本文主要是介绍【PL理论】(31) 类型系统:静态分析 (Static Analysis) | 静态类型系统 | 什么是类型?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 💭 写在前面:本章我们将进入类型系统的讲解,回顾一下之前我们整理的 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]. []. .

这篇关于【PL理论】(31) 类型系统:静态分析 (Static Analysis) | 静态类型系统 | 什么是类型?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1072530

相关文章

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

Python主动抛出异常的各种用法和场景分析

《Python主动抛出异常的各种用法和场景分析》在Python中,我们不仅可以捕获和处理异常,还可以主动抛出异常,也就是以类的方式自定义错误的类型和提示信息,这在编程中非常有用,下面我将详细解释主动抛... 目录一、为什么要主动抛出异常?二、基本语法:raise关键字基本示例三、raise的多种用法1. 抛

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

github打不开的问题分析及解决

《github打不开的问题分析及解决》:本文主要介绍github打不开的问题分析及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、找到github.com域名解析的ip地址二、找到github.global.ssl.fastly.net网址解析的ip地址三

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断

CnPlugin是PL/SQL Developer工具插件使用教程

《CnPlugin是PL/SQLDeveloper工具插件使用教程》:本文主要介绍CnPlugin是PL/SQLDeveloper工具插件使用教程,具有很好的参考价值,希望对大家有所帮助,如有错... 目录PL/SQL Developer工具插件使用安装拷贝文件配置总结PL/SQL Developer工具插

Mysql的主从同步/复制的原理分析

《Mysql的主从同步/复制的原理分析》:本文主要介绍Mysql的主从同步/复制的原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录为什么要主从同步?mysql主从同步架构有哪些?Mysql主从复制的原理/整体流程级联复制架构为什么好?Mysql主从复制注意

java -jar命令运行 jar包时运行外部依赖jar包的场景分析

《java-jar命令运行jar包时运行外部依赖jar包的场景分析》:本文主要介绍java-jar命令运行jar包时运行外部依赖jar包的场景分析,本文给大家介绍的非常详细,对大家的学习或工作... 目录Java -jar命令运行 jar包时如何运行外部依赖jar包场景:解决:方法一、启动参数添加: -Xb

Windows 系统下 Nginx 的配置步骤详解

《Windows系统下Nginx的配置步骤详解》Nginx是一款功能强大的软件,在互联网领域有广泛应用,简单来说,它就像一个聪明的交通指挥员,能让网站运行得更高效、更稳定,:本文主要介绍W... 目录一、为什么要用 Nginx二、Windows 系统下 Nginx 的配置步骤1. 下载 Nginx2. 解压

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹