理解编程语言的类型系统

简介: 【7月更文挑战第11天】本文介绍现代软件工程借助形式化方法确保系统正确性。强类型系统如数理逻辑虽能表达普遍属性但复杂,轻量级技术如模型检查(用于芯片设计和通信协议验证)和类型系统则更易用。类型系统是推理工具,起源于解决逻辑悖论,经历多个里程碑发展,分为动态和静态分支,重点在于编程语言应用,特别是AI领域。

1 简介

    探索意味着有一个目标,
    发现却意味着目光自由,胸怀坦然,没有目标。

    --黑塞

当我们在编程世界漫游时,比如声明一个变量并为其赋值,内存会以二进制形式保存此值。我们的计数系统是十进制的,这意味着我们每天知道和使用的数字在二进制中非常不同。而类型系统是一组规则,或多或少是严格的。你不能用某些类型做你想做的一切。

编程语言通常有一整套开箱即用的类型。这些类型称为基元类型。例如:integer,boolean,float,string 等。

如果编程语言的类型迫使我们遵守某些规则,那么编程语言需要一种算法来检查我们是否遵守它们。这称为类型检查,本文尝试从框架和技术方面理解这些内容。

2 语言框架

现代软件工程承认应用范围广泛的形式化方法,

以帮助确保系统在某些特定方面正确运行 隐式或明确地表明其期望的行为。

类型系列的一端是强大的框架,例如 数理逻辑、代数规范语言、模态逻辑和指称语义。不同语言有着不同的语言类型系统。

image.png

现代常用的开发语言:

用于应用程序和程序开发 – C、C#、C++、GO、D、Java、Swift 和 Tcl。
用于人工智能开发 – AIML、C、C#、C++、Prolog 和 Python。
用于数据库开发 – DBASE、FoxPro、MySQL、SQL 和 Visual FoxPro。
用于游戏开发 – C、C#、C++、DarkBASIC 和 Java。
对于计算机驱动程序 – Assembly 和 C。
对于 Internet 和 Web – HDML、HTML、Java、JavaScript、Perl、PHP、Python 和 XML。
用于脚本开发 – AutoHotkey、awk、bash、Batch 文件、Perl、Python 和 Tcl。

这些可以用来表达非常普遍的正确性属性,但通常使用起来很麻烦并要求程序员有大量的复杂性。

从硬件到高级编程语言大致层级框架结构如下所示:

image.png

3 语言技术

在另一端是力量更温和的技术,以至于自动检查器可以内置在编译器、链接器或程序分析器中,

因此即使是不熟悉底层框架的程序员也可以熟练应用理论。

这种轻量级形式方法的一个著名实例是模型检查器,在有限状态机系统中搜索错误的工具,

例如:
    芯片设计
    通信协议

一个经典有限状态机是知名的TCP协议:

image.png

另一个非常流行的是运行时监控比如runtime,它是一组允许系统运行的技术的集合。

动态检测其组件之一的行为是否符合到规范。

但迄今为止最流行和最成熟的轻量级形式化方法是类型系统,是未来的中心焦点。

类型系统是一种易于处理的句法方法,

用于证明不存在通过根据种类对短语进行分类来确定程序行为他们计算的值。

4 类型系统关注点

有几点值得关注。

这个定义标识类型系统作为推理程序的工具。

这一措辞反映了面向编程语言中的类型系统。
编程语言的类型系统也分为强类型或弱类型(也称为松散类型)。
但是,对于强类型或弱类型系统的构成,没有明确的定义。

对于强类型类型系统,普遍接受的行为是:

  变量确实有类型,您无法更改它。我们需要预先指定变量的类型(显式或隐式)。
  该语言不会隐式更改任何变量的类型。我们必须显式地进行所有类型转换。
  如果类型不兼容,则不能在任何操作中使用变量作为操作数。

比如在强类型系统中,即使我们将一个数字存储为字符串,我们也不能在加法运算中将其用作操作数。要首先使用它,我们需要将字符串显式转换为数字。弱类型反之亦然。JavaScript 是弱类型语言的一个例子。
这些规定使代码更加冗长。但它也使代码更容易理解,因为没有(或减少了)隐藏的行为。

具有静态类型检查的强类型语言包括 Java、Pascal、Ada、C、GO 和 C#。另一方面,Python 具有动态类型检查和强类型。

更一般地,术语类型系统(或类型理论)指的是逻辑、数学和哲学的研究领域,这是更广泛概念。

类型这种意义上的系统在 1900 年代初期首次正式化,

为了避免出现威胁数学基础的逻辑悖论,例如罗素的理发师悖论 (Russell, 1902)。

在二十世纪,类型已成为逻辑中的标准工具,

尤其是在证明论中(参见 Gandy,1976 年和 Hindley,1997 年),并已渗透到哲学语言和科学。

该领域的主要里程碑包括:

   罗素的原始类型理论(Whitehead 和 Russell,1910)、
   拉姆齐的简单类型理论(1925)
   Church 的简单类型 lambda 演算的基础 (1940)
   Martin Löf 的构造类型理论 (1973, 1984)
   Berardi、Terlouw 和 Baren dregt 的纯类型系统 
   (Berardi, 1988; Terlouw, 1989;巴伦德雷格特,1992)。

5 小结

即使在计算机科学中,也有两个主要的研究分支类型系统,动态和静态的。

而更实用的,面向人工智能的,涉及到编程语言的应用,将是重点。

目录
相关文章
|
1月前
|
存储 人工智能 JavaScript
Prompt、Context、Harness:AI Agent 工程的三层架构解析
2023年重“Prompt”(如何说),2025年重“Context”(看到什么),2026年跃升至“Harness”(系统级约束与验证)。三者非替代而是分层:Prompt优化表达,Context管理信息环境,Harness构建可信执行系统——模型是马,Harness才是缰绳、马鞍与路。
570 10
Prompt、Context、Harness:AI Agent 工程的三层架构解析
|
机器学习/深度学习 数据可视化 搜索推荐
Python在社交媒体分析中扮演关键角色,借助Pandas、NumPy、Matplotlib等工具处理、可视化数据及进行机器学习。
【7月更文挑战第5天】Python在社交媒体分析中扮演关键角色,借助Pandas、NumPy、Matplotlib等工具处理、可视化数据及进行机器学习。流程包括数据获取、预处理、探索、模型选择、评估与优化,以及结果可视化。示例展示了用户行为、话题趋势和用户画像分析。Python的丰富生态使得社交媒体洞察变得高效。通过学习和实践,可以提升社交媒体分析能力。
481 1
|
5月前
|
Rust 安全 JavaScript
掌握Option类型(Rust中优雅处理空值的利器)
Option是Rust处理“可能无值”的核心类型,通过Some和None枚举强制显式处理空值情况,避免空指针异常。它结合unwrap、map、and_then等方法,实现安全、优雅的空值控制,是Rust内存安全设计的基石,助力开发者写出健壮的代码。来源:https://www.vpshk.cn/
|
8月前
|
自然语言处理 安全 搜索推荐
ERP系统上手指南:首页导航+常见操作详解!
本文是ERP系统入门教程首篇,针对新手解决“如何上手”问题。涵盖登录、界面导航、基础操作、权限管理及常见问题,以简道云为例,手把手教你从0开始使用ERP,打通企业数字化第一关。
|
存储 JSON 安全
【C++ 泛型编程 综合篇】泛型编程深度解析:C++中的五种类型泛型策略综合对比
【C++ 泛型编程 综合篇】泛型编程深度解析:C++中的五种类型泛型策略综合对比
528 1
|
机器学习/深度学习 人工智能 PyTorch
【AI系统】计算图原理
本文介绍了AI框架中使用计算图来抽象神经网络计算的必要性和优势,探讨了计算图的基本构成,包括标量、向量、矩阵、张量等数据结构及其操作,并详细解释了计算图如何帮助解决AI工程化中的挑战。此外,文章还通过PyTorch实例展示了动态计算图的特点和实现方法,包括节点(张量或函数)和边(依赖关系)的定义,以及如何通过自定义Function实现正向和反向传播逻辑。
948 7
【AI系统】计算图原理
|
机器学习/深度学习 人工智能 自然语言处理
利用AI实现情感分析的实践与探索
本文主要介绍了利用AI技术进行情感分析的实践过程。通过阿里云自然语言处理服务(NLP)提供的情感分析API,结合Python编程语言和Jupyter Notebook开发环境,实现对社交媒体上产品评论的情感分析。具体步骤包括数据收集、预处理和调用API进行分析。示例代码展示了如何使用Python SDK调用API并获取情感分析结果。通过情感分析,企业能快速了解用户反馈,优化产品策略。未来,情感分析在客户服务、市场调研等领域将有更广泛应用,而阿里云平台为实现情感分析提供了便捷高效的工具和服务。
2065 2
|
Java 索引
Java“StringIndexOutOfBoundsException”解决
Java中“StringIndexOutOfBoundsException”异常通常在字符串索引超出其边界时抛出。解决方法包括检查字符串长度、确保索引值有效,以及使用条件语句避免越界访问。
864 2
|
SQL 缓存 网络协议
网络信息安全实验 — 网络攻击技术实验(Kali系统,John、lc7、arpspoof、ettercap、SQL注入...)
本人深感网络安全实验有点麻烦,花了一个晚上弄了部分,特此将笔记贡献造福后人,个人能力有限,还会继续更新。。。 汇报题目:**15分钟教你用 Python 写一个 arpspoof**(课件准备ing,如果弄完后续补上) 第一次网络安全实验(密码学)也是我做的,这里先放个自制工具:[Java实现密码学工具,集成了对称加密算法DES,AES,IDEA,公开加密算法RSA,ECC,散列算法MD5,SHA1,CRC32,以及RSA,DSA,ECDSA数字签名验证示例。](https://blog.csdn.net/weixin_43734095/article/details/105303562)
2129 0
网络信息安全实验 — 网络攻击技术实验(Kali系统,John、lc7、arpspoof、ettercap、SQL注入...)