 MoonBit月兔编程语言 现代编程思想 第十四课 案例:堆栈虚拟机现代编程思想 案例:栈式虚拟机 Hongbo Zhang 1 编译与解释 编译 源程序 x 编译器 -> ⽬标程序 ⽬标程序 x 输⼊数据 -> 输出数据 解释 源程序 x 输⼊数据 x 解释器 -> 输出数据 CPU可以被视为⼴义上的解释器 拓展阅读:⼆村映射/部分计算 部分计算:程序优化,根据已知信息,运算进⾏特化 已知源程序与解释器,进⾏部分运算,获得⽬标程序 ⽬标程序 ⽬标程序 x 输⼊数据 -> 输出数据 2 虚拟机 ⼀处编写,处处运⾏ 定义⼀个不基于任何平台的指令集 在不同平台上实现解释器 两种常⻅的虚拟机 堆栈虚拟机:运算数存储在栈上,数据遵循先进后出原则 寄存器虚拟机:运算数存储在寄存器中 3 寄存器虚拟机 例:Lua VM (The Implementation of Lua 5.0) 取最⼤值 MOVE 2 0 0 ; R(2) JUMP -> 5 (4 + 1) MOVE 2 1 0 ; R(2) = R(1) RETURN 2 2 0 ; return R(2) RETURN 0 1 0 ; return 4 堆栈虚拟机 例:WebAssembly Virtual Machine 取最⼤值 fn max(a : Int, b : Int) -> Int 1. local.get $a local.set $m0 码力 | 31 页 | 594.38 KB | 1 年前3 MoonBit月兔编程语言 现代编程思想 第十四课 案例:堆栈虚拟机现代编程思想 案例:栈式虚拟机 Hongbo Zhang 1 编译与解释 编译 源程序 x 编译器 -> ⽬标程序 ⽬标程序 x 输⼊数据 -> 输出数据 解释 源程序 x 输⼊数据 x 解释器 -> 输出数据 CPU可以被视为⼴义上的解释器 拓展阅读:⼆村映射/部分计算 部分计算:程序优化,根据已知信息,运算进⾏特化 已知源程序与解释器,进⾏部分运算,获得⽬标程序 ⽬标程序 ⽬标程序 x 输⼊数据 -> 输出数据 2 虚拟机 ⼀处编写,处处运⾏ 定义⼀个不基于任何平台的指令集 在不同平台上实现解释器 两种常⻅的虚拟机 堆栈虚拟机:运算数存储在栈上,数据遵循先进后出原则 寄存器虚拟机:运算数存储在寄存器中 3 寄存器虚拟机 例:Lua VM (The Implementation of Lua 5.0) 取最⼤值 MOVE 2 0 0 ; R(2) JUMP -> 5 (4 + 1) MOVE 2 1 0 ; R(2) = R(1) RETURN 2 2 0 ; return R(2) RETURN 0 1 0 ; return 4 堆栈虚拟机 例:WebAssembly Virtual Machine 取最⼤值 fn max(a : Int, b : Int) -> Int 1. local.get $a local.set $m0 码力 | 31 页 | 594.38 KB | 1 年前3
 Comprehensive Rust(简体中文) 20241253.5.1 Bitflags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269 53.5.2 多个寄存器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 53.5.3 驱动程序 . . . . . . . . write(|w| w.pin21().set()); loop {} } • SVD(系统视图描述)文件通常是由芯片供应商提供的 XML 文件,用于描述设备的内存映射。 – 这些文件按照外围设备、寄存器、字段和值进行组织分类,其中包含名称、内容描述、地址等信 息。 – 由于 SVD 文件常常存在错误和不完整的情况,因此有许多项目会修复这些错误,补充缺失的 相关信息,并发布生成的 crate。 • CPU 中的异常级别,x86 中的铃声级 别)的功能,而应用处理器则具备这些功能。 • QEMU 支持针对每种架构模拟不同的机器或板级模型。 “虚拟”开发板并不适用于任何特定的真实 硬件,而是专为虚拟机设计的。 53.1 准备使用 Rust 在开始运行 Rust 代码之前,我们需要进行一些初始化设置。 .section .init.entry, "ax" .global entry entry:0 码力 | 359 页 | 1.33 MB | 10 月前3 Comprehensive Rust(简体中文) 20241253.5.1 Bitflags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269 53.5.2 多个寄存器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 53.5.3 驱动程序 . . . . . . . . write(|w| w.pin21().set()); loop {} } • SVD(系统视图描述)文件通常是由芯片供应商提供的 XML 文件,用于描述设备的内存映射。 – 这些文件按照外围设备、寄存器、字段和值进行组织分类,其中包含名称、内容描述、地址等信 息。 – 由于 SVD 文件常常存在错误和不完整的情况,因此有许多项目会修复这些错误,补充缺失的 相关信息,并发布生成的 crate。 • CPU 中的异常级别,x86 中的铃声级 别)的功能,而应用处理器则具备这些功能。 • QEMU 支持针对每种架构模拟不同的机器或板级模型。 “虚拟”开发板并不适用于任何特定的真实 硬件,而是专为虚拟机设计的。 53.1 准备使用 Rust 在开始运行 Rust 代码之前,我们需要进行一些初始化设置。 .section .init.entry, "ax" .global entry entry:0 码力 | 359 页 | 1.33 MB | 10 月前3
 洛佳 组件化驱动、ROM运行环境与RustSBI准 的 抽 象 设 计 适配embedded-hal等外设功能标准抽象 面 向 功 能 的 外 设 结 构 联合所有权、泛型等,暴露外设所有功能 外 设 及 其 寄 存 器 表 示 封装寄存器、位域表示和数据结构 分享性外设:以GPIO为例 • 从前级环境获取所有权,如从ROM 运行环境的#[entry]获得; • 配置GPIO状态后,只有对应外设类 型允许的操作函数能通过编译,否则 支 持 , 填 入 常 量 泛 型 , 即 可 用 于 运 行 环 境 ROM运行环境 第 02 部分 裸机和引导程序的ROM阶段 高级语言环境 初始化bss段、data段, 加载栈寄存器,构成高级 语言运行的最小环境 生成镜像结构 外设和时钟 提供具备所有权的外设 列表,提供ROM初始化 完成的时钟配置 编译时生成镜像头,通 常包含处理器配置、时 钟和闪存配置等部分 RustSBI软件架构更新 • RISC-V SBI可运用于机器态和虚拟化 的宿主态,此时RustSBI实现应为虚 拟机提供电源、核管理等功能。 • 嵌套虚拟化存在时,RustSBI实现应 当为内部虚拟机软件模拟H指令集。 在这方面,Dramforever的项目1提 供了很好的例子。 • LARVa2项目是固件充当模拟器的例 子,这里RustSBI被编译到RISC-V之 外的指令集。 • Ydr0 码力 | 21 页 | 3.12 MB | 1 年前3 洛佳 组件化驱动、ROM运行环境与RustSBI准 的 抽 象 设 计 适配embedded-hal等外设功能标准抽象 面 向 功 能 的 外 设 结 构 联合所有权、泛型等,暴露外设所有功能 外 设 及 其 寄 存 器 表 示 封装寄存器、位域表示和数据结构 分享性外设:以GPIO为例 • 从前级环境获取所有权,如从ROM 运行环境的#[entry]获得; • 配置GPIO状态后,只有对应外设类 型允许的操作函数能通过编译,否则 支 持 , 填 入 常 量 泛 型 , 即 可 用 于 运 行 环 境 ROM运行环境 第 02 部分 裸机和引导程序的ROM阶段 高级语言环境 初始化bss段、data段, 加载栈寄存器,构成高级 语言运行的最小环境 生成镜像结构 外设和时钟 提供具备所有权的外设 列表,提供ROM初始化 完成的时钟配置 编译时生成镜像头,通 常包含处理器配置、时 钟和闪存配置等部分 RustSBI软件架构更新 • RISC-V SBI可运用于机器态和虚拟化 的宿主态,此时RustSBI实现应为虚 拟机提供电源、核管理等功能。 • 嵌套虚拟化存在时,RustSBI实现应 当为内部虚拟机软件模拟H指令集。 在这方面,Dramforever的项目1提 供了很好的例子。 • LARVa2项目是固件充当模拟器的例 子,这里RustSBI被编译到RISC-V之 外的指令集。 • Ydr0 码力 | 21 页 | 3.12 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 12 从计算机组成原理看 C 语言指针64 位的,一些很老的网吧和学校的机房里偶尔能看见古董级的 32 位计算机, 16 位计算机则是几乎只能在博物馆里看到了。 • 字的长度决定了计算机中寄存器的大小,从而决定计算机一次能处理多大的整数。 • 例如 32 位计算机的寄存器都是 32 位,因此只能做 32 位整数的加减乘除,超过 32 位 整数的加减乘除就要用特殊的指令来模拟了。 整数的表示范围受位数限制 • 8 位长的整数能表示的范围是 范围的整数,也就是两个字节组成的字。 • 处理器去读写内存的时候靠的是寄存器提供的地址,因此寄存器的大小(也就是字的大 小)决定了他能读写的内存大小,例如: • 由于 16 位计算机的寄存器只能存储 16 位,他只能访问 65536 字节( 64 KB )的内存 。 • 由于 32 位计算机的寄存器只能存储 32 位,他只能访问 4 GB 的内存。 • 由于 64 位计算机的寄存器能存储 64 位,他理论上能访问 16777216 • 因此,如果你的电脑内存超过了 4 GB ,那肯定是 32 位电脑不用说了。 • 而 64 位计算机理论上能访问如此大量的内存,虽然目前看来是用不到。 知识拓展 • 虽然 64 位计算机的寄存器能处理 64 位的整数,实际上的内存地址并没有 64 位。 • 实际上地址的高 16 位始终和第 48 位一致(符号扩展),也就是虚拟地址空间只有 48 位。 • 而经过 MMU 映射后实际给内存的地址只有0 码力 | 128 页 | 2.95 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 12 从计算机组成原理看 C 语言指针64 位的,一些很老的网吧和学校的机房里偶尔能看见古董级的 32 位计算机, 16 位计算机则是几乎只能在博物馆里看到了。 • 字的长度决定了计算机中寄存器的大小,从而决定计算机一次能处理多大的整数。 • 例如 32 位计算机的寄存器都是 32 位,因此只能做 32 位整数的加减乘除,超过 32 位 整数的加减乘除就要用特殊的指令来模拟了。 整数的表示范围受位数限制 • 8 位长的整数能表示的范围是 范围的整数,也就是两个字节组成的字。 • 处理器去读写内存的时候靠的是寄存器提供的地址,因此寄存器的大小(也就是字的大 小)决定了他能读写的内存大小,例如: • 由于 16 位计算机的寄存器只能存储 16 位,他只能访问 65536 字节( 64 KB )的内存 。 • 由于 32 位计算机的寄存器只能存储 32 位,他只能访问 4 GB 的内存。 • 由于 64 位计算机的寄存器能存储 64 位,他理论上能访问 16777216 • 因此,如果你的电脑内存超过了 4 GB ,那肯定是 32 位电脑不用说了。 • 而 64 位计算机理论上能访问如此大量的内存,虽然目前看来是用不到。 知识拓展 • 虽然 64 位计算机的寄存器能处理 64 位的整数,实际上的内存地址并没有 64 位。 • 实际上地址的高 16 位始终和第 48 位一致(符号扩展),也就是虚拟地址空间只有 48 位。 • 而经过 MMU 映射后实际给内存的地址只有0 码力 | 128 页 | 2.95 MB | 1 年前3
 Java 应用与开发 - 线程编程更专 业的表述为: 线程是程序内部的顺序控制流。 大纲 线程基础 线程控制 线程的同步 相关知识回顾 线程和进程的区别和联系 代码 数据 进程空间 打开文件 寄存器 栈 线程 1 寄存器 栈 线程 2 寄存器 栈 线程 3 线程与进程的关系 1. 每个进程都有独立的代码和数据空间(进程上下文),进程切换的 开销大。 2. 线程作为“轻量的进程”,同一类线程共享代码和数据空间,每个 多线程——在同一应用程序中有多个顺序流同时执行。 大纲 线程基础 线程控制 线程的同步 相关知识回顾 线程和进程的区别和联系 代码 数据 进程空间 打开文件 寄存器 栈 线程 1 寄存器 栈 线程 2 寄存器 栈 线程 3 线程与进程的关系 1. 每个进程都有独立的代码和数据空间(进程上下文),进程切换的 开销大。 2. 线程作为“轻量的进程”,同一类线程共享代码和数据空间,每个 ▶ AWT-EventQueue-n 线程 ▶ AWT-Shutdown 线程 ▶ DestroyJavaVM 线程 在所有其他用户线程退出后,负责释放任意线程所占用系统 资源并卸载 Java 虚拟机。该线程在主线程运行结束时由系 统自动启动,但要等到所有其他用户线程均退出后才开始其 卸载工作。 大纲 线程基础 线程控制 线程的同步 ���� 线程基础 相关知识回顾 线程的概念模型 创建线程0 码力 | 82 页 | 1010.73 KB | 1 年前3 Java 应用与开发 - 线程编程更专 业的表述为: 线程是程序内部的顺序控制流。 大纲 线程基础 线程控制 线程的同步 相关知识回顾 线程和进程的区别和联系 代码 数据 进程空间 打开文件 寄存器 栈 线程 1 寄存器 栈 线程 2 寄存器 栈 线程 3 线程与进程的关系 1. 每个进程都有独立的代码和数据空间(进程上下文),进程切换的 开销大。 2. 线程作为“轻量的进程”,同一类线程共享代码和数据空间,每个 多线程——在同一应用程序中有多个顺序流同时执行。 大纲 线程基础 线程控制 线程的同步 相关知识回顾 线程和进程的区别和联系 代码 数据 进程空间 打开文件 寄存器 栈 线程 1 寄存器 栈 线程 2 寄存器 栈 线程 3 线程与进程的关系 1. 每个进程都有独立的代码和数据空间(进程上下文),进程切换的 开销大。 2. 线程作为“轻量的进程”,同一类线程共享代码和数据空间,每个 ▶ AWT-EventQueue-n 线程 ▶ AWT-Shutdown 线程 ▶ DestroyJavaVM 线程 在所有其他用户线程退出后,负责释放任意线程所占用系统 资源并卸载 Java 虚拟机。该线程在主线程运行结束时由系 统自动启动,但要等到所有其他用户线程均退出后才开始其 卸载工作。 大纲 线程基础 线程控制 线程的同步 ���� 线程基础 相关知识回顾 线程的概念模型 创建线程0 码力 | 82 页 | 1010.73 KB | 1 年前3
 简明 X86 汇编语言教程 ........................4 2.1 寄存器........................................................................................................................4 2.2 使用寄存器................................. .....36 5.2 局部优化:表达式预计算和子表达式提取.........................................................37 5.3 全局寄存器优化................................................................................................. ............................................................................................52 七、寄存器...................................................................................................0 码力 | 63 页 | 598.28 KB | 1 年前3 简明 X86 汇编语言教程 ........................4 2.1 寄存器........................................................................................................................4 2.2 使用寄存器................................. .....36 5.2 局部优化:表达式预计算和子表达式提取.........................................................37 5.3 全局寄存器优化................................................................................................. ............................................................................................52 七、寄存器...................................................................................................0 码力 | 63 页 | 598.28 KB | 1 年前3
 RISC-V 开放架构设计之道 1.0.0rs2,imm 栈指针无损加4倍立即数 CIW C.ADDI4SPN rd′,imm 跳转并链接 跳转并链接 J JAL rd,imm 减 CA C.SUB rd′,rs2′ 寄存器跳转并链接 I JALR rd,imm(rs1) 与 CA C.AND rd′,rs2′ 同步 同步线程 I FENCE 与立即数 CB C.ANDI rd′,imm 异或 CA C.XOR rd′,rs2′ 环境断点 I EBREAK 传送 CR C.MV rd,rs2 装入立即数 CI C.LI rd,imm 控制状态寄存器(CSR) 装入高位立即数 CI C.LUI rd,imm 读后写 I CSRRW rd,csr,rs1 移位 逻辑左移立即数 CI C.SLLI CSRRCI rd,csr,imm 跳转 跳转 CJ C.J imm 寄存器跳转 CR C.JR rs1 跳转并链接 跳转并链接 CJ C.JAL imm 取数 取字节 I LB rd,imm(rs1) 寄存器跳转并链接 CR C.JALR rs1 取半字 I LH rd,imm(rs1) 系统0 码力 | 223 页 | 15.31 MB | 1 年前3 RISC-V 开放架构设计之道 1.0.0rs2,imm 栈指针无损加4倍立即数 CIW C.ADDI4SPN rd′,imm 跳转并链接 跳转并链接 J JAL rd,imm 减 CA C.SUB rd′,rs2′ 寄存器跳转并链接 I JALR rd,imm(rs1) 与 CA C.AND rd′,rs2′ 同步 同步线程 I FENCE 与立即数 CB C.ANDI rd′,imm 异或 CA C.XOR rd′,rs2′ 环境断点 I EBREAK 传送 CR C.MV rd,rs2 装入立即数 CI C.LI rd,imm 控制状态寄存器(CSR) 装入高位立即数 CI C.LUI rd,imm 读后写 I CSRRW rd,csr,rs1 移位 逻辑左移立即数 CI C.SLLI CSRRCI rd,csr,imm 跳转 跳转 CJ C.J imm 寄存器跳转 CR C.JR rs1 跳转并链接 跳转并链接 CJ C.JAL imm 取数 取字节 I LB rd,imm(rs1) 寄存器跳转并链接 CR C.JALR rs1 取半字 I LH rd,imm(rs1) 系统0 码力 | 223 页 | 15.31 MB | 1 年前3
 《Java 应用与开发》课程讲义 - 王晓东6.1 Java 内存模型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 6.1.1 Java 虚拟机(Java Virtual Machine, JVM) . . . . . . . . . . . . . . 59 6.1.2 JVM 内存模型 . . . . . . . . . . . . 5.1 Java 多态 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 6.1 Java 虚拟机架构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 6.2 JVM 内存模型 . . . . . . . 引入Swing 2000.5 2002.2 2004.10 2006.11 J2SE1.3 J2SE1.4 J2SE1.5 J2SE5.0 JavaSE6.0 支持XML,采用新的虚拟机Hotspot 引入Assert语言特性 增加范型、for-each循环、可变数目参数、注解、自动装箱和拆箱 将Java2重新做回Java,性能、易用性前所未有的提高 Java7 Ora0 码力 | 330 页 | 6.54 MB | 1 年前3 《Java 应用与开发》课程讲义 - 王晓东6.1 Java 内存模型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 6.1.1 Java 虚拟机(Java Virtual Machine, JVM) . . . . . . . . . . . . . . 59 6.1.2 JVM 内存模型 . . . . . . . . . . . . 5.1 Java 多态 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 6.1 Java 虚拟机架构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 6.2 JVM 内存模型 . . . . . . . 引入Swing 2000.5 2002.2 2004.10 2006.11 J2SE1.3 J2SE1.4 J2SE1.5 J2SE5.0 JavaSE6.0 支持XML,采用新的虚拟机Hotspot 引入Assert语言特性 增加范型、for-each循环、可变数目参数、注解、自动装箱和拆箱 将Java2重新做回Java,性能、易用性前所未有的提高 Java7 Ora0 码力 | 330 页 | 6.54 MB | 1 年前3
 RISC-V 手册 v2(一本开源指令集的指南).................................................................................. 23 2.3 RV32I 寄存器 .................................................................................................. ...................................................................................... 55 5.2 浮点寄存器 .................................................................................................. ...................................................................................... 76 8.3 向量寄存器和动态类型 .............................................................................................0 码力 | 164 页 | 8.85 MB | 1 年前3 RISC-V 手册 v2(一本开源指令集的指南).................................................................................. 23 2.3 RV32I 寄存器 .................................................................................................. ...................................................................................... 55 5.2 浮点寄存器 .................................................................................................. ...................................................................................... 76 8.3 向量寄存器和动态类型 .............................................................................................0 码力 | 164 页 | 8.85 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 08 CUDA 开启的 GPU 编程读取 sum[0] 到寄存器 A • 读取 arr[i] 到寄存器 B • 让寄存器 A 的值加上寄存器 B 的值 • 写回寄存器 A 到 sum[0] • 这样有什么问题呢? 经典案例:数组求和 • 假如有两个线程分别在 i=0 和 i=1 ,同时执行: • 线程 0 :读取 sum[0] 到寄存器 A ( A=0 ) • 线程 1 :读取 sum[0] 到寄存器 A ( A=0 ) arr[0] 到寄存器 B ( B=arr[0] ) • 线程 1 :读取 arr[1] 到寄存器 B ( B=arr[1] ) • 线程 0 :让寄存器 A 加上寄存器 B ( A=arr[0] ) • 线程 1 :让寄存器 A 加上寄存器 B ( A=arr[1] ) • 线程 0 :写回寄存器 A 到 sum[0] ( sum[0]=arr[0] ) • 线程 1 :写回寄存器 A 到 sum[0] 中有的为真有的为假,则会导致两个分 支都被执行!不过在 cond 为假的那几个线程 在真分支会避免修改寄存器和访存,产生副作 用。而为了避免会产生额外的开销。因此建议 GPU 上的 if 尽可能 32 个线程都处于同一个 分支,要么全部真要么全部假,否则实际消耗 了两倍时间! 避免修改寄存器和访存相当于 CPU 的 SIMD 指令 _mm_blendv_ps 和 _mm_store_mask_ps0 码力 | 142 页 | 13.52 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 08 CUDA 开启的 GPU 编程读取 sum[0] 到寄存器 A • 读取 arr[i] 到寄存器 B • 让寄存器 A 的值加上寄存器 B 的值 • 写回寄存器 A 到 sum[0] • 这样有什么问题呢? 经典案例:数组求和 • 假如有两个线程分别在 i=0 和 i=1 ,同时执行: • 线程 0 :读取 sum[0] 到寄存器 A ( A=0 ) • 线程 1 :读取 sum[0] 到寄存器 A ( A=0 ) arr[0] 到寄存器 B ( B=arr[0] ) • 线程 1 :读取 arr[1] 到寄存器 B ( B=arr[1] ) • 线程 0 :让寄存器 A 加上寄存器 B ( A=arr[0] ) • 线程 1 :让寄存器 A 加上寄存器 B ( A=arr[1] ) • 线程 0 :写回寄存器 A 到 sum[0] ( sum[0]=arr[0] ) • 线程 1 :写回寄存器 A 到 sum[0] 中有的为真有的为假,则会导致两个分 支都被执行!不过在 cond 为假的那几个线程 在真分支会避免修改寄存器和访存,产生副作 用。而为了避免会产生额外的开销。因此建议 GPU 上的 if 尽可能 32 个线程都处于同一个 分支,要么全部真要么全部假,否则实际消耗 了两倍时间! 避免修改寄存器和访存相当于 CPU 的 SIMD 指令 _mm_blendv_ps 和 _mm_store_mask_ps0 码力 | 142 页 | 13.52 MB | 1 年前3
共 128 条
- 1
- 2
- 3
- 4
- 5
- 6
- 13














