【PL理论】(16) 形式化语义:语义树 | <Φ, S> ⇒ M | 形式化语义 | 为什么需要形式化语义 | 事实:部分编程语言的设计者并不会形式化语义

  • 💭 写在前面:本章我们将继续探讨形式化语义,讲解语义树,然后我们将讨论“为什么需要形式化语义”,以及讲述一个比较有趣的事实(大部分编程语言设计者其实并不会形式化语义的定义)。

目录

0x00 语义树(Derivation Tree)

0x01 关于实现语言

0x02 为什么需要形式化语义?

0x03 事实:部分编程语言的设计者并不会形式化语义


0x00 语义树(Derivation Tree)

对于程序 \color{} S,如果存在 \color{}M,使得 \left \langle \phi ,S \right \rangle\Rightarrow M,则其语义被定义 (即成功终止) 。 

  • 这里,符号 \color{}\phi 表示初始内存,是空的。

💭 举个例子:用于程序 x=1; y=x+5 的推导树

x = 1
y = x + 5

0x01 关于实现语言

我们可以实现一个解释器来解释我们迄今设计的语言,我们可以尝试使用 F# 来实现解释器。

例如:语义域 \color{}Val=Z+B 可以实现为:

type Val = Int of int | Boolean of bool

例如:表达式的评估可以实现为:

let rec eval (e: Exp) (m: Mem) : Val = ...

归纳定义 (Inductive definition) 可以通过递归实现。

对于某些程序,语义未定义,例如:

y = x + true   // 无法应用任何规则

这类程序可以认为是运行时错误,在实现中,我们将设计解释器让其抛出异常。

0x02 为什么需要形式化语义?

我们上一章到目前为止,都在谈论 形式化语义(formal semantics)

形式化语义是计算机科学和语言学中的一个重要领域。

它旨在使用形式化的数学工具来准确地描述自然语言或计算机程序的含义。

用形式化方法来定义语言的结构和含义,以及推导出语言表达式的含义和行为。

主要目标就是消除歧义,确保语言或程序的含义在不同环境下的一致性和可预测性。

它通常包括以下几种主要方法:

  • 操作语义(Operational Semantics)
  • 语义动态学(Dynamic Semantics)
  • 语义形式学(Denotational Semantics)
  • 公理化语义(Axiomatic Semantics)

.

❓ 思考:为什么需要形式化语义?

因为需要形式地证明某些有用的属性,比如:

  • 证明类型推断算法的正确性。
  • 证明编译器优化的正确性
  • 证明程序分析算法的正确性。

所有这些都与程序的行为 (语义) 相关,因此,我们首先必须定义这种语义,比如:

  • 要证明优化的正确性,我们首先需要定义两个程序的语义等价

0x03 事实:部分编程语言的设计者并不会形式化语义

UUUUnfortunately!!!非常不幸的是,编程语言的爹爹们通常不会 "规范的" 定义其语义!

例如,C 和 JavaScript 的语义是用自然语言口头描述的。

JavaScript 的语义特别复杂,经常令人难以理解(这样产生了许多有趣的研究)

因此,编程语言研究者首先必须正式定义他们想讨论的语言的语义!

例如,CompCert 的作者首先定义了 C 语言的语义,以便制作一个带有正确性证明的编译器。


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

📜 参考资料 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/696705.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【EAI】生成可爱的贴纸

贴纸生成工具上线啦,目前支持贴纸生成、文生图功能。 地址:https://eai.coderbox.cn/ 功能: 贴纸生成 通过简单提示词,生成可爱的贴纸,支持4种像素规格文生图 基于开源模型实现,模型持续集成中作品库 生…

GLM4指令微调实战(完整代码)

GLM4是清华智谱团队最近开源的大语言模型。 以GLM4作为基座大模型,通过指令微调的方式做高精度文本分类,是学习LLM微调的入门任务。 使用的9B模型,显存要求相对较高,需要40GB左右。 在本文中,我们会使用 GLM4-9b-Chat…

1.VMware软件的安装与虚拟机的创建

1. VMware软件的安装 1.1 为什么需要虚拟机 嵌入式Linux开发需要在Linux系统下运行,我们选择Ubuntu。   1、双系统安装     有问题,一次只能使用一个系统。Ubuntu基本只做编译用。双系统安装不能同时运行Windows和Linux。   2、虚拟机软件   …

解决!word转pdf时,怎样保持图片不失真

#今天用word写了期末设计报告,里面有很多过程的截图,要打印出来,想到pdf图片不会错位,就转成了pdf,发现图片都成高糊了,找了好多方法,再不下载其他软件和插件的情况下,导出拥有清晰的…

单片机嵌入式计算器(带程序EXE)

单片机嵌入式计算器 主要功能:完成PWM占空比计算,T溢出时间(延时); [!NOTE] 两个程序EXE; [!CAUTION] 百度网盘链接:链接:https://pan.baidu.com/s/1VJ0G7W5AEQw8_MiagM7g8A?pwdg8…

DDMA信号处理以及数据处理的流程---原始数据生成

Hello,大家好,我是Xiaojie,好久不见,欢迎大家能够和Xiaojie一起学习毫米波雷达知识,Xiaojie准备连载一个系列的文章—DDMA信号处理以及数据处理的流程,本系列文章将从目标生成、信号仿真、测距、测速、cfar…

G盘文件系统损坏:全面解析与应对策略

在数字时代,数据的重要性不言而喻。然而,G盘文件系统损坏却时常给我们的数据安全带来威胁。当G盘文件系统受损时,可能导致文件丢失、数据无法访问等严重后果。本文将深入探讨G盘文件系统损坏的现象、原因、恢复方案以及预防措施,帮…

鸿蒙开发必备:《DevEco Studio 系列一:实用功能解析与常用快捷键大全》

系列文章目录 文章目录 系列文章目录前言一、下载与安装小黑板 二、IDE被忽略的实用功能-帮助(Help)1.Quick Start2. API Reference3.FAQ 三、常用快捷键一、编辑二、查找或替换三、编译与运行四、调试五、其他 前言 DevEco Studio)是基于In…

算法笔记1-高精度模板(加减乘除)个人模板

目录 加法 减法 乘法 ​编辑 除法 加法 #include <iostream> #include <cstring> #include <algorithm> #include <cmath> #include <queue>using namespace std;typedef pair<int,int> PII;const int N 1e5 10;int n; int a[N],…

Spring运维之业务层测试数据回滚以及设置测试的随机用例

业务层测试数据回滚 我们之前在写dao层 测试的时候 如果执行到这边的代码 会在数据库 里面留下数据 运行一次留一次数据 开发有开发数据库&#xff0c;运行有运行数据库 我们先连数据库 在pom文件里引入mysql的驱动和mybatis-plus的依赖 在数据层写接口 用mybatis-plus进…

Qt 布局管理

布局基础 1)Qt 布局管理系统使用的类的继承关系如下图: QLayout 和 QLayoutItem 这两个类是抽象类,当设计自定义的布局管理器时才会使用到,通常使用的是由 Qt 实现的 QLayout 的几个子类。 2)Qt 使用布局管理器的步骤如下: 首先创建一个布局管理器类的对象。然后使用该…

RocketMQ教程(三):RocketMQ的核心组件

四个核心组件 RocketMQ 的架构采用了典型的分布式系统设计理念,以确保高性能、高可用和可扩展性。RocketMQ 主要由四个核心组件构成:NameServer、Broker、Producer 和 Consumer。下面是对这些组件以及它们在 RocketMQ 中的角色和功能的概述: 1. NameServer 角色和功能:Name…

28.找零

上海市计算机学会竞赛平台 | YACSYACS 是由上海市计算机学会于2019年发起的活动,旨在激发青少年对学习人工智能与算法设计的热情与兴趣,提升青少年科学素养,引导青少年投身创新发现和科研实践活动。https://www.iai.sh.cn/problem/744 题目描述 有一台自动售票机,每张票卖 …

C++11:列表初始化 初始化列表initializer_list decltype关键字

目录 前言 列表初始化 初始化列表initializer_list decltype关键字 左值和右值 move 前言 2003年C标准委员会曾经提交了一份技术勘误表&#xff08;简称TC1&#xff09;&#xff0c;使得C03这个名字取代了C98成为了C11前最新的C标准名称。不过由于C03主要是对C98标准中的…

C++必修:探索C++的内存管理

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 贝蒂的主页&#xff1a;Betty’s blog 1. C/C的内存分布 我们首先来看一段代码及其相关问题 int globalVar 1; static…

Java从入门到放弃

线程池的主要作用 线程池的设计主要是为了管理线程&#xff0c;为了让用户不需要再关系线程的创建和销毁&#xff0c;只需要使用线程池中的线程即可。 同时线程池的出现也为性能的提升做出了很多贡献&#xff1a; 降低了资源的消耗&#xff1a;不会频繁的创建、销毁线程&…

Helm离线部署Rancher2.7.10

环境依赖&#xff1a; K8s集群、helm 工具 Rancher组件架构 Rancher Server 包括用于管理整个 Rancher 部署的所有软件组件。 下图展示了 Rancher 2.x 的上层架构。下图中&#xff0c;Rancher Server 管理两个下游 Kubernetes 集群 准备Rancher镜像推送到私有仓库 cat >…

CorelDRAW2024破解激活码序列号一步到位

亲们&#xff0c;今天给大家种草一个神奇的软件——CorelDRAW破解2024最新版&#xff01;&#x1f3a8;这是一款专业级的矢量图形设计软件&#xff0c;无论你是平面设计师、插画师还是设计师&#xff0c;都能在这个软件中找到你需要的工具和功能。✨ 让我来给大家介绍一下这款软…

OpenGauss数据库-7.用户及角色

第1关&#xff1a;创建用户 gsql -d postgres -U gaussdb -W passwd123123 CREATE USER jackson WITH PASSWORD jackson123; 第2关&#xff1a;修改用户 gsql -d postgres -U gaussdb -W passwd123123 ALTER USER jackson WITH PASSWORD Abcd123; 第3关&#xff1a;创建角色 …

MySQL 常见客户端程序

本篇主要介绍MySQL常见的客户端程序 目录 一、mysqlcheck 二、mysqldump 三、mysqladmin 四、mysqldumpslow 五、mysqlbinlog 六、mysqlshow 显示列的具体信息​编辑 七、mysqlslap 一、mysqlcheck mysqlcheck是MySQL的表维护程序&#xff0c;其功能主要包含以下四个方…