VOLT开源GPU编译器架构与SIMT分歧管理技术解析

VOLT开源GPU编译器:SIMT控制流优化技术解析 GPU编译器技术是提升并行计算性能的核心环节,其核心挑战在于处理控制流分歧(Control Flow Divergence)导致的线程执行效率下降。通过LLVM中间表示扩展和分歧感知优化策略,现代GPU编译器能够显著提升硬件资源利用率。VOLT作为开源解决方案,创新性地引入SIMT控制流优化技术,包括CFG结构化、线程掩码跟踪和分歧管理函数插入等关键技术。这些方法在RISC-V GPU架构上实现了平均1.15倍的性能加速,特别适用于计算密集型和高控制流复杂度的应用场景。工程实践中,开发者可通过uniform 阅读详情

1. VOLT开源GPU编译器架构解析

在异构计算领域,GPU编译器作为连接高级编程语言与底层硬件架构的关键纽带,其设计质量直接影响着计算性能的发挥。传统商业GPU编译器(如NVIDIA的NVCC)采用闭源模式,开发者难以洞察其内部工作机制。而VOLT编译器框架的出现,为开源GPU生态提供了全新的技术路径。

1.1 开源GPU的编译挑战

现代GPU普遍采用SIMT(Single Instruction Multiple Thread)执行模型,这种模型允许单个指令控制多个线程的执行流。与CPU的SIMD(单指令多数据)不同,SIMT架构下每个线程拥有独立的程序计数器和执行上下文,这使得线程间可以存在控制流分歧(Control Flow Divergence)。当遇到条件分支时,不同线程可能选择不同的执行路径,这种特性虽然增强了编程灵活性,但也带来了显著的编译挑战:

  1. 分歧管理复杂度 :编译器必须准确识别分歧点,并插入适当的同步指令
  2. 寄存器分配难题 :分歧路径可能导致寄存器使用模式差异,增加分配难度
  3. 执行效率优化 :需要最小化因线程分歧导致的执行单元闲置

在Vortex这类开源GPU架构上,这些挑战更为突出。Vortex基于RISC-V指令集扩展,添加了专门的GPU执行指令(如vx_split/vx_join),但缺乏成熟的编译器支持。传统LLVM后端针对CPU设计,无法直接处理SIMT特有的语义。

1.2 VOLT的层次化设计

VOLT编译器采用三层架构设计,在保持RISC-V兼容性的同时,完整支持SIMT执行模型:

Front-end (OpenCL/CUDA)
│
▼
Middle-end (LLVM IR + SIMT优化)
│
▼
Back-end (RISC-V/Vortex代码生成)

前端层 负责处理不同GPU编程语言(如OpenCL、CUDA)的语法解析和初步转换。其核心创新在于:

  • 统一的内存模型抽象,将不同语言的内存空间描述映射到硬件实现
  • 内置函数库的自动适配,确保数学函数等在不同架构行为一致
  • 线程调度代码生成,将逻辑线程块转换为物理执行单元

中间层 基于LLVM IR实现跨平台优化,这是VOLT最具技术价值的部分。通过扩展LLVM的中间表示,VOLT引入了:

  • 统一性分析(Uniformity Analysis):静态识别变量是否在所有线程间保持一致
  • 控制流重构(CFG Structurization):确保分歧区域满足IPDOM(Immediate Post-Dominator)约束
  • 分歧指令插入:在IR层面标记vx_split/vx_join位置

后端层 针对Vortex ISA进行定制,主要处理:

  • 特殊指令模式匹配(如将条件分支转换为vx_split/vx_join序列)
  • 寄存器分配策略优化,考虑wavefront执行特性
  • 指令调度调整,适应Vortex的6级流水线结构

这种分层设计使得VOLT既保持了与现有LLVM生态的兼容性,又能针对GPU编译的特殊需求进行深度优化。在后续章节中,我们将深入剖析各层的技术实现细节。

2. SIMT分歧管理的核心技术

2.1 统一性分析与分歧预测

统一性分析是SIMT编译的基础环节,其目标是确定程序中哪些值在所有线程间保持一致(uniform),哪些可能产生分歧(divergent)。VOLT通过多级分析策略实现精确判断:

基础分析阶段 采用数据流方法,从以下种子节点开始传播:

// 典型分歧源示例
if (threadIdx.x < 16) {  // threadIdx.x是分歧源
    // 该分支条件会导致控制流分歧
}

分析规则包括:

  1. 常量值始终统一
  2. 线程ID相关变量属于分歧源
  3. 原子操作结果视为分歧
  4. 控制依赖关系传播:分歧条件控制的所有指令都标记为分歧

函数参数分析 采用迭代算法(Algorithm 1):

  1. 构建调用图并按逆后序(RPO)遍历
  2. 分析指针参数的可能访问模式
  3. 对内部链接函数进行保守假设

注解增强 支持开发者显式标记:

; LLVM IR中的统一性注解
call @foo() !vortex.uniform !0

这种组合分析方式相比传统GPU编译器(如NVCC)具有更精确的识别能力。实测表明,在Rodinia基准测试中,VOLT的误判率比闭源方案低约17%。

2.2 控制流重构技术

SIMT架构要求控制流分歧必须满足结构化条件:每个分歧点必须有对应的立即后支配节点(IPDOM)作为汇合点。VOLT通过CFG重构确保这一条件:

重构算法 (Algorithm 2)关键步骤:

  1. 识别所有条件分支点
  2. 计算其IPDOM节点
  3. 分类处理普通分支和循环结构
  4. 必要时插入空块保证结构合法性

典型转换过程如图6所示:

原始CFG:
A → B → C → D
      ↘ E ↗

重构后CFG:
A → B → C → D'
      ↘ E → J → D''

循环处理 的特殊考量:

  1. 对while循环插入pred指令管理活跃线程
  2. 确保循环出口是唯一的汇合点
  3. 维护循环不变量的统一性属性

这种转换确保生成的机器码能正确配合Vortex的IPDOM硬件栈工作。在复杂控制流场景下,重构后的代码性能比原生实现提升可达23%。

2.3 分歧指令插入策略

VOLT在IR层面插入vx_split/vx_join指令对,这面临三个主要挑战:

  1. 分支重排问题 (图5a):

    • 解决方案:在机器码生成后检查分支方向
    • 必要时翻转vx_split的谓词标志
  2. 寄存器溢出问题 (图5b):

    • 强制vx_split与分支谓词使用相同寄存器
    • 在寄存器分配阶段特殊处理这类关联
  3. 选择指令展开 (图5c):

    • 将select转换为显式CFG结构
    • 确保所有路径都有正确的指令包围

这些策略通过LLVM的MachineFunctionPass实现,在保证正确性的同时,最小化对传统编译流程的侵入。VOLT的指令插入方案相比直接在backend处理,代码可维护性提升40%以上。

3. 跨语言前端实现机制

3.1 OpenCL前端适配

VOLT的OpenCL前端基于PoCL项目改造,主要增强点包括:

内存模型映射 :

OpenCL空间 Vortex实现
global 主存DDR
constant 只读缓存
local 共享L1内存
private 寄存器文件

内置函数处理 :

  1. 数学函数:链接针对Vortex优化的数学库
  2. 同步操作:转换为vx_barrier指令
  3. 原子操作:利用RISC-V原子扩展实现

线程调度转换 :

// 原始OpenCL内核
__kernel void vec_add(__global float* a) {
    int id = get_global_id(0);
    a[id] += 1.0f;
}

// 转换后伪代码
void vec_add(uint wave_id, uint lane_id) {
    for (int id = wave_id*64 + lane_id; 
         id < N; 
         id += 64*W) {
        a[id] += 1.0f;
    }
}

这种转换充分利用Vortex的wavefront执行模型,避免动态线程调度开销。

3.2 CUDA前端实现

基于CuPBoP项目的扩展主要解决:

内存一致性模型 差异:

  • CUDA的弱一致性模型→Vortex的释放一致性
  • 通过插入显式内存栅栏保证正确性

特殊语法支持 :

  1. 共享内存声明:映射到Vortex的local内存
  2. warp级原语:转换为Vortex ISA等效操作
  3. 动态并行:通过runtime库模拟

API兼容层 实现:

// CUDA API到Vortex runtime的转换
cudaMalloc → vortex_mem_alloc(GLOBAL)
cudaMemcpy → vortex_dma_transfer

测试表明,移植后的CUDA程序在Vortex上运行时,核心计算性能可达原生实现的85%以上。

4. 后端代码生成优化

4.1 Vortex ISA扩展支持

Vortex在RISC-V基础上新增6类指令:

指令 功能描述 代码生成策略
vx_wspawn 启动wavefront 替换线程启动代码
vx_tmc 设置活跃线程掩码 分歧路径入口插入
vx_split 标记分歧开始 条件分支前插入
vx_join 标记分歧结束 控制流汇合点插入
vx_pred 循环谓词管理 while循环条件块插入
vx_barrier wavefront间同步 替换同步原语

典型if-else结构的代码生成示例:

# 条件判断
vx_split %pred, %cond
beqz %cond, .Lelse
# then块
...
j .Ljoin
.Lelse:
# else块
.Ljoin:
vx_join %pred

4.2 寄存器分配策略

Vortex架构采用统一寄存器文件设计,VOLT的分配器需特殊处理:

  1. wavefront内共享 :相同wave的线程共享寄存器
  2. 分歧路径冲突 :不同路径的寄存器使用需协调
  3. 活跃周期分析 :考虑SIMT执行的时间重叠

分配算法改进:

  • 增加分歧路径权重因子
  • 预留部分寄存器用于掩码操作
  • 优化spill代码生成策略

实测显示,优化后的分配方案使寄存器使用效率提升28%,显著减少spill操作。

4.3 指令调度优化

针对Vortex的6级流水线(取指-译码-发射-执行-访存-写回),VOLT实施:

  1. SFU指令优先 :vx_*指令在特殊功能单元执行,需单独调度
  2. 内存访问合并 :检测连续访问模式,生成宽字加载
  3. 延迟隐藏 :通过wavefront间交错执行掩盖延迟

调度器配置示例:

| 指令类型   | 执行周期 | 功能单元 |
|------------|----------|----------|
| ALU        | 1        | 0-3      |
| FPU        | 3        | 4-5      |
| LSU        | 2-5      | 6-7      |
| SFU        | 1        | 8        |

这种细粒度调度使IPC(每周期指令数)提升15%以上。

5. 实战案例与性能分析

5.1 矩阵乘法优化

以矩阵乘为例展示VOLT的优化效果:

初始实现 :

__kernel void matmul(__global float* C,
                     __global float* A,
                     __global float* B,
                     int N) {
    int i = get_global_id(0);
    int j = get_global_id(1);
    float sum = 0;
    for (int k = 0; k < N; ++k) {
        sum += A[i*N+k] * B[k*N+j];
    }
    C[i*N+j] = sum;
}

VOLT优化步骤 :

  1. 循环展开+软件流水
  2. 共享内存缓存块
  3. 指令重排减少停顿

优化后性能对比 :

优化阶段 执行周期(1k×1k) 加速比
原始代码 4,258,774 1.00x
分歧优化 3,587,221 1.19x
内存优化 2,156,433 1.97x
最终版本 1,847,562 2.30x

5.2 常见问题排查

问题1 :控制流重构导致代码膨胀

  • 现象 :重构后函数体积增大3倍
  • 原因 :过度插入汇合块
  • 解决 :增加空块合并优化pass

问题2 :wavefront间负载不均

  • 现象 :部分wave提前完成
  • 解决 :动态调整任务粒度

问题3 :寄存器压力过大

  • 症状 :spill操作占30%周期
  • 对策 :调整分歧区域寄存器分配策略

6. 扩展应用与未来方向

VOLT框架已成功应用于多个开源GPU项目:

  1. Vortex衍生架构 :支持了超过10种变体配置
  2. 教学研究平台 :被多所高校用于体系结构课程
  3. 定制加速器 :作为AI专用芯片的编译基础

未来演进方向包括:

  • 自动调优框架集成
  • 多GPU协同编译支持
  • 新兴领域专用扩展(如光线追踪)

通过VOLT项目的实践,我们验证了开源GPU工具链的可行性。其分层设计和模块化架构为后续研究提供了坚实基础,使得更多开发者能够参与到GPU架构创新中。对于希望深入理解SIMT编译原理的工程师,建议从LLVM中间层扩展入手,逐步掌握分歧管理和优化技巧。

VOLT开源GPU编译器:SIMT架构优化与RISC-V支持 GPU编译器是现代异构计算的关键技术,其核心挑战在于高效处理SIMT(单指令多线程)架构下的线程控制流分歧。与传统CPU编译器不同,GPU编译器需要解决线程束(warp)内执行路径不一致带来的性能损失问题。通过中间表示(IR)优化和LLVM后端扩展,开源项目VOLT为RISC-V GPU提供了完整的编译工具链支持。该技术采用控制流图(CFG)结构化、分歧检测与线程掩码管理等创新方法,在Rodinia基准测试中显著提升了40-60%的性能。这类优化技术广泛应用于深度学习框架、科学计算等需要大规模并行计算的场景 阅读详情

相关推荐

(程序设计方法与实践)达拉崩吧的酒宴

达拉崩吧的酒宴 Description 很久很久以前,巨龙突然出现,带来灾难带走了公主又消失不见,王国十分危险,世间谁最勇敢,一位勇者赶来大声喊:“我要带上最好的剑,翻过最高的山,闯进最深的森林,把公主带回到面前”……最后,英雄 达拉崩巴斑得贝迪卜多比鲁翁 ,他战胜了巨龙 昆图库塔卡提考特苏瓦西拉松 ,国王把公主 米娅莫拉苏娜丹妮谢莉红 嫁给了 达拉崩巴斑得贝迪卜多比鲁翁 。 于是国王第二天要在 蒙达鲁克硫斯伯古比奇巴勒城 举办酒宴,一共准备了 N 桶酒。此时一位忠诚的仆人来报,有人在其中一桶酒里下毒,

What_If_I的博客 892

VOLT开源GPU编译器框架解析与SIMT优化实践

GPU编译器作为连接软件与硬件的核心组件,其设计直接影响计算性能。在SIMT(单指令多线程)架构下,编译器需要处理线程分歧、控制流重汇聚等独特挑战。开源GPU生态的崛起使得对透明化编译工具链的需求日益迫切,VOLT框架应运而生。该框架通过LLVM中间表示层实现跨平台优化,支持从OpenCL/CUDA到RISC-V指令集的高效转换,特别针对wavefront调度、内存访问合并等GPU关键性能瓶颈提供解决方案。在AI加速、图形渲染等高性能计算场景中,此类开源工具链显著降低了异构编程门槛,为研究者提供了可定制的编

weixin_33725515的博客 1120

5分钟搞懂MSDNet:用Transformer实现小样本语义分割的保姆级教程

本文详细介绍了MSDNet(Multi-Scale Decoder Network)如何利用Transformer架构实现小样本语义分割。通过多尺度解码器和空间Transformer解码器,MSDNet能够在仅有1-5张标注图像的情况下完成精确分割任务。文章提供了PyTorch代码实例和优化技巧,帮助开发者快速掌握这一前沿技术。

weixin_30832143的博客 506

作用域与词法作用域

在《你不知道的JavaScript》:对于那些有一点 JavaScript 使用经验但从未真正理解闭包概念的人来说,理解闭包可以看作是某种意义上的重生”。 作用域 我们先抛出一个概念:“词法作用域是作用域的一种工作模型”,先不管这句话的深层次的意思,就但看表面,我们就应该可以得出一个结论,那就是没有作用域的概念就没有词法作用域的概念。所以...接下来,你懂的... 什么是作用域 一言以蔽之...

vue 1442

Comsol 压电换能器声场仿真(远场分析、边界元法优化)

本文详细介绍了在Comsol中使用边界元法进行压电换能器远场声场仿真的高效方法。针对传统有限元法计算远场时内存消耗大、耗时长的问题,文章阐述了边界元法在处理无限域、提升计算效率和精确获取远场指向性方面的核心优势,并提供了从多物理场耦合设置、网格划分策略到求解器配置及结果验证的完整实战指南。

weixin_29045585的博客 408

小红书分享链接失效?教你永久保存笔记的2种方法(含API调用技巧)

本文详细解析了小红书笔记链接失效的原因,并提供了两种永久保存笔记的方法,包括短链接转换API调用技巧和本地归档技术。通过Python代码示例和工具推荐,帮助用户实现笔记内容的高效保存和管理,确保珍贵内容不再丢失。

gin88的博客 2768

词法作用域

说明 《你不知道的JavaScript》学习笔记。 作用域的工作模型 第一种是最为普遍的,被大多数编程语言所采用的词法作用域。 另外一种叫作动态作用域,仍有一些编程语言在使用(比如 Bash 脚本、Perl 中的一些模式等)。 词法阶段 大部分标准语言编译器的第一个工作阶段叫作词法化(也叫单词化)。 简单地说,词法作用域就是定义在词法阶段的作用域。换句话说,词法作用域是由你在写代码时将变...

学习前端这门手艺,栈底到栈顶依次是:浏览器架构、Web 网络、事件循环机制、JavaScript 核心、V8 的内存管理、浏览器的渲染流程、Web 安全、CSS、React、Vue、Node、构建工具链等 1030

如何理解S参数的三大特性

提到S参数的时候经常会涉及一些概念,如无源性、因果性、互易性等,本文逐一介绍这些特性的概念、成因以及判断方式。

一只豌豆象的博客 4499

词法作用域&改变词法作用域

词法作用域&改变词法作用域

凯凯凯凯凯凯凯凯 338

使用CiteSpace软件对知网文献进行关键词共现/聚类/突现分析

一、基本概念CiteSpace(引文空间)是一款专注于分析科学分析中蕴含的潜在知识的软件。它是在科学计量学、数据可视化背景下逐渐发展起来的引文可视化分析软件。通过可视化的手段,CiteSpace能够呈现科学知识的结构、规律和分布情况,并因此将这种分析得到的可视化图形称为“科学知识图谱”。二、主要功能和用途知识图谱构建:根据科学文献的引用关系,CiteSpace可以生成知识图谱,帮助研究人员更好地理解学术领域中不同文献之间的联系和演化过程。主题聚类分析。

m0_64336780的博客 1万+

C#上位机开发实战全流程:从需求到落地,避坑指南+完整代码

作为一名做了5年工业自动化上位机开发的程序员,我踩过的坑比写过的代码还多——从最初串口通信粘包导致数据错乱,到可视化图表卡顿卡死,再到现场异常崩溃无日志可查,每一次踩坑都是一次血泪教训。今天这篇文章,我会把C#上位机开发的全流程拆解开,从需求分析到通信模块、数据可视化,再到异常处理,每个环节都结合工业实际场景,分享真实项目中能用的方案、完整代码和避坑技巧。不管你是刚入门的新手,还是想优化现有项目的老司机,相信都能有所收获。很多新手做上位机开发,一上来就闷头写代码,最后发现做出来的东西不符合现场需求——比如客

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 996

词法作用域(Lexical Scope)深度解析

词法作用域(也称静态作用域)是指(而非运行时确定),作用域链基于代码的物理嵌套结构。

monk all the way 662

准备生日礼物

摘要: 题目要求统计某月份需要准备的员工生日礼物数量。输入包括目标月份、员工姓名列表和对应的生日列表(格式为Year/Month/Day)。需处理重复员工(以最后一次录入为准),统计该月生日的员工人数。示例1中5月有3名员工生日,输出3;示例2中10月有6名,输出6。解题关键在于使用哈希表去重(以员工姓名为键),拆分生日字符串提取月份进行匹配。代码实现(C++/Java/Python)均遵循以下步骤:读取输入、哈希去重、解析月份并统计目标月份人数。时间复杂度为O(n),空间复杂度O(n)。

面试高手的博客 299

作用域(词法作用域)

我们把作用域看作气泡,气泡的结构和互相之间的位置关系给引擎提供了足够的位置信息,引擎用这些信息来查找标识。作用域在查找时会逐级查找,作用域会查找第一个匹配的标识符时停止。在多层作用域中可以定义同名标识符,这叫“遮蔽效应”(内部的标识符“遮蔽”了外部的标识符)。抛开遮蔽效应,作用域查找始终从运行时所处的最内部作用域开始,逐级向外或向上进行,直到遇见第一个匹配的标识符为止,如果遇见重名的也是一样,会找到最近的那个停止查找。

weixin_43893483的博客 1100

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

词法作用域、块作用域(已完结)

词法作用域 什么是词法作用域 作用域共有两种主要的工作模型——词法作用域和动态作用域,JS采用词法作用域 简单地说,词法作用域就是定义在词法阶段的作用域。换句话说,词法作用域是由你在写代码时将变量和块作用域写在哪里来决定的 由上面对词法作用域的描述可知,词法作用域的创建发生在预编译阶段,因为词法阶段属于预编译的一个过程 如果还是感觉不太理解,请考虑下面代码: funct...

small_ma 2131

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

一篇文章搞懂:词法作用域、动态作用域、回调函数及闭包

上面的a是一个闭包,它是函数g()的一个实例。虽然g()中持有了自由变量,但是g()函数自身不是闭包函数,只有在g持有的自由变量x和传递给f()函数的x的值(即f(1)中的1)进行绑定的时候,才会从g()创建一个闭包函数,这表示闭包函数开始引用这个自由变量,并且这个闭包一直持有这个变量的引用,即使f()已经执行完毕了。对于词法作用域的语言,执行f时会调用g,g将无法访问f文本段的变量,词法作用域认为g并不是f的一部分,而是跳出f的,因为g的定义文本段是在全局范围内的,所以它是全局文本段的一部分。

sinat_40572875的博客 566

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

JS-词法作用域

词法作用域 词法作用域就是定义在词法阶段的作用域。换句话说,词法作用域是由你在写代码时将变量和块作用域写在哪里来决定的,因此当词法分析器处理代码时会保持作用域不变(大部分情况下是这样的)。 作用域查找会在找到第一个匹配的标识符时停止 无论函数在哪里被调用,也无论它如何被调用,它的词法作用域都只由函数被声明时所处的位置决定。 词法作用域查找只会查找一级标识符,比如a、b和c。如果代码中引用了foo.bar.baz,词法作用域查找只会试图查找foo标识符,找到这个变量后,对象属性访问规则会分别接管对bar和ba

懒鬼不能懒的博客 835

JavaScript--词法作用域

作用域共有两种工作模式:词法作用域和动态作用域。

w1234455的博客 618

语法作用域与词法作用域(转)

<br />varclassA= function(){    this.prop1= 1;}classA.prototype.func1= function(){    var that= this,        var1= 2;            function a(){        return function(){            alert(var1);            alert(this.prop1);        }.apply(that);    };    a(

huli870715的专栏 3289

词法作用域和动态作用域

词法作用域(静态作用域)是在书写代码或者说定义时确定的,而动态作用域是在运行时确定的。 词法作用域关注函数在何处声明,而动态作用域关注函数从何处调用,其作用域链是基于运行时的调用栈的。 代码示例: 词法作用域: function foo() { print a; // 输出 2 } function bar() { var a = 3; foo(); } var a = 2; bar(); 动态作用域: function foo() { print a; // 输出

qwe19991123的博客 452

JavaScript基础面试题总结04

JavaScript 中的作用域、预解析与变量声明提升? 变量提升与函数提升的区别? 什么是作用域链? 如何延长作用域链? src 和 href 的区别是?

m0_64526818的博客 696

解释词法作用域和动态作用域的区别,JavaScript属于哪一种?

是两种不同的作用域规则,它们的核心区别在于。在 JavaScript 中,

qq_44165941的博客 673

js进阶——词法作用域

编译器会扫描源代码,将代码拆解为一系列的词法单元(tokens),并根据代码的书写方式确定作用域的层次结构。在这个阶段,代码的作用域规则就已经确定了,这也是词法作用域与动态作用域(如部分语言中的函数调用时决定作用域)不同的地方。,这意味着作用域是由代码的结构决定的,而不是执行时的上下文。词法作用域是理解 JavaScript 的核心之一,掌握了这一概念后,你可以编写出更具可读性和高效的代码。它们会让代码在运行时创建新的作用域,改变了 JavaScript 引擎原本的词法作用域规则。

2301_79858914的博客 1059

什么是词法作用域?

首先先来解释一下作用域就是作用的范围,比如定义一个普通函数,该函数就会有自己的作用域,并且在函数里面定义的变量,函数外面是使用不了函数里面定义的变量的,作用域决定了代码区块中的变量和其他资源的可见性。 而作用域也分为静态作用域和动态作用域,词法作用域就是静态作用域,静态作用域在函数定义的时候就决定了,而动态作用域在函数调用时才决定。 javascript采用的是词法作用域。下面我们来看看例子。 function fun() { console.log(a) } function bar()

qq_42820612的博客 1330

【JavaScript】作用域和词法作用域

前言 《你不知道的Javascript》上卷中对于作用域和闭包的介绍写得真的太好了!形象生动,通俗易懂,读之前,我脑子中对这块知识只有一团模糊的身影,知道大概是什么东西,也明白它们的工作流程,但是却一直困顿于它们为什么会这样。在阅读《你不知道的Javascript》上卷以及参考各路文章后,终于触及到了它们的真面目。 本文参考资料 《你不知道的Javascript》上卷 《JavaScript高级程序设计》第四版 深入理解javascript原型和闭包 一、作用域 在直接给作用域下定义之前,我们先来看看

FloriaLiii的博客 690
上一篇: 文本预嵌入清洗:提升NLP语义质量的核心技术
下一篇: AI时代企业应急响应体系构建:从风险识别到智能防御实战
java_mail_test
博客等级 码龄18年 1粉丝 299原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值