编译原理 Switch语句的分析

深入解析switch-case语句:原理、优化与实践 多路分支控制是编程中的基础概念,用于根据变量不同取值执行对应代码块。其核心原理是通过跳转表实现O(1)时间复杂度的分支查找,相比if-else链显著提升性能。在编译器优化层面,switch-case会生成高效的跳转指令,特别适合处理枚举值、状态码等离散场景。技术价值体现在代码可读性提升、维护成本降低以及执行效率优化三个方面,广泛应用于协议解析、状态机实现等工程实践。以HTTP状态码处理为例,switch-case结构比多重if更清晰;在实现有限状态机时,配合枚举类型能构建高效的状态转换逻辑。现代语言如Rus 阅读详情
今天我的编译系统中所有类型的语句分析都完成了——但没有做优化——包括Switch语句,因为我的系统地语法是类似C++语言的所以实现的方式也类似于C++。在"C++、Pascal =(赋值),for,case语句,函数,变量空间的区别"中我已介绍过C++的switch和Pascal的case语句的区别。在这里复制一下其中的switch语句与if-goto语句的转换实例:
switch 语句
switch(a){
case 1:
a += 2;
default:
a += 16;
case 2:
a += 4;
break;
case 3:
a += 8;
}
等价的if-goto语句
if(a == 1)
goto a1;
if(a == 2)
goto a2;
if(a == 3)
goto a3;
goto df;
a1:
a += 2;
df:
a += 16;
a2:
a += 4;
goto end;
a3:
a += 8;
end:
这儿有一个重要的转变就是将case 语句都集中在一起并提前到switch语句的开头。要在编译时就做到这样是有点困难的,他必须要收集所有的case条件语句,然后建立一张跳转表格。C++编译其肯定是做到了,并且case语句达到一定数量时他还会在这些条件和跳转的目标之间建立一个合适的hash函数,而不是一个一个的if判断,从而使得switch语句更高效。(题外话:在pascal的case语句的条件值好像不能多于256个,不知道是出于什么目的,可能也是为了优化吧!)
在我做的编译系统中没有做任何的优化,但是和上面的在语义上是完全等价的,先将上面switch语句对应的四元式列举在下面,并作一定的解释:
0: JNE 5 a 1 // if(a!=1) goto 5 如果不等于1跳转到下一个判断
1: + a a 2 // a += 2
2: JMP 3 // goto 3 跳转到下 default 的内部
3: + a a 16 // a += 16
4: JMP 6 // goto 6 跳转到下一个case 的内部
5: JNE 9 a 2 // if(a!=2) goto 9 如果不等于2跳转到下一个判断
6: + a a 4 // a += 16
7: JMP 13 // goto 13 跳转到结束 对应break
8: JMP 10 // goto 10 跳转到下一个case 的内部
9: JNE 12 a 3 // if(a!=2) goto 12 如果不等于3跳转到下一个判断
10: + a a 8 // a += 16
11: JMP 13 // goto 13 跳转到结束
12: JMP 3 // goto 3 如果没有匹配的 跳转到 default
13: END // 结束

这样的编译其实有很多是可以做优化的,比如第2句是没有意义的,第8句是永远也运行不到的。当然能够像C++编译其那样优化才是最好的,等我什么时候有大片的时间再做这个优化吧。更希望看到这个文章并对这个感兴趣的人能够帮我做这个优化,如果您感兴趣请和我联系我会为你提供现在所有的源代码和我的设计思想。我期待作您!

原文地址:http://blog.sina.com.cn/s/blog_5526d40f0100orrc.html


编译原理:常见语句的语法制导翻译 语法制导翻译:常见语句的中间代码生成技术 本文系统介绍了从源语言到中间代码的语法制导翻译方法,重点分析了三种典型语句的翻译技术: 赋值语句翻译 简单赋值通过临时变量存储表达式结果 数组赋值需计算元素地址(基址+偏移量) 结构体赋值处理成员偏移量计算 控制流语句翻译 if语句使用条件跳转指令 if-else结构需要真假分支跳转标签 通过回填技术处理未确定的目标地址 循环语句翻译 while循环包含条件测试和循环体标签 for循环需处理初始化、条件判断和迭代表达式 使用continue和break实现流程控制 阅读详情

相关推荐

编译原理 for 条件语句,while 语句的翻译

编译原理 for 条件语句,while 语句的翻译及各种地质输出,大家慢慢找

编译原理——实验1 词法分析程序设计

编译原理词法分析器实验。 #include <iostream> #include <cstring> using namespace std; char prog[800]; //存储程序 char token[10]; //存储单词字符串 char ch; //当前字符 int syn; //单词种别码 int sum; //整型常数 int p; /...

weixin_44566432的博客 6371

【STM32】433MHz OOK信号软解码实战:从EV1527协议到嵌入式实现

本文详细介绍了基于STM32微控制器实现433MHz OOK信号软解码的完整实战过程。文章从EV1527协议解析入手,重点阐述了利用STM32的GPIO和定时器进行信号采样、脉宽还原、同步头识别以及数据位判决的核心算法,并提供了对抗无线干扰的容错优化策略,帮助开发者深入理解并掌握低成本无线通信的嵌入式实现方案。

weixin_29299807的博客 783

switch语句的几种反汇编结构及效率分析

我们或许知道if…else if…与switch的功能基本相似,而switch也完全可以转换成if…else if…的结构,并且switch总体来说效率要高于if…else if…。但是很少有人知道总体来说if…else if….的效率为什么低于switch,以及为什么说总体来说**switch效率高,而不是一定高,以及什么时候效率一定比**if…else if…。今天我们就从反汇编的层面来看看sw

Apollon_krj的博客 6301

龙芯3A5000开发板PMON升级UEFI固件实战指南

固件是计算机硬件与操作系统之间的关键桥梁,负责初始化硬件并引导系统启动。其工作原理是在上电后执行自检、加载引导程序,最终将控制权移交操作系统。在国产化平台中,采用标准化的UEFI固件具有重要技术价值,它能提供图形化配置界面、统一硬件驱动模型,并支持安全启动等现代特性,从而显著提升硬件兼容性与系统管理效率。这一技术广泛应用于PC、服务器及嵌入式设备,尤其在需要运行银河麒麟等主流操作系统的龙芯开发板场景中,将传统PMON固件升级至UEFI,能实现更流畅的系统安装与更稳定的运行体验。本文基于固件升级与UEFI引导

weixin_42664597的博客 561

PostgreSQL+PostGIS空间数据入库实战:从矢量栅格到GeoServer发布全流程

本文详细介绍了将矢量与栅格空间数据导入PostgreSQL并利用PostGIS扩展进行管理的完整流程。内容涵盖环境搭建、使用shp2pgsql和raster2pgsql工具进行数据入库、基础空间查询验证,以及最终通过GeoServer发布为地图服务的实战步骤,为构建空间数据平台提供清晰指引。

weixin_29268267的博客 289

java中switch编译结果探秘

switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。,其中的数值进行了排序,采用二分法进行查找,效率为O(log n)。当case比较分散时且数值与0距离较远,通常使用。当case比较紧凑时且数值接近0时,通常使用。方法,可以看到多出了几个选项,指向了。版本:jdk11,其他选项默认。:带有key索引和标签的表格。,例如代码下文代码示例中的。

weixin_56838459的博客 1871

如何使用Google Maps API爬取地理数据:详细教程与Python实现

Google Maps API 是一组服务的集合,允许开发者访问地图、地点、路线等地理信息。:将地址转换为地理坐标,或将地理坐标转换为地址。:计算两点之间的行车路线、步行路线等。Places API:获取附近的地点、商店、餐馆等。:计算多个地点之间的距离和时间。在接下来的代码中,我们将结合这些 API,展示如何获取并处理地理数据。本文详细介绍了如何使用 Google Maps API 获取地理数据,涵盖了从地址转经纬度、获取地点详情、计算路线、计算多个地点的距离与时间等多个功能。

2201_76125261的博客 733

【黑客免杀攻防】读书笔记10 - switch-case分支

0x1 switch-case分支 switch-case其实就是if-else语句的另一种体现形式。但大于3之后的switchc-case。编译器会对代码进行优化。 1.1 简单switch-case分支识别技巧 C源代码: int _tmain(int argc, _TCHAR* argv[]) { int nNum = 2; switch (nNum) { ...

weixin_30820151的博客 203

《UDS协议从入门到精通(UDS速查手册)》(完结撒花版)

专栏总目录,文中介绍了UDS协议相关的基础知识和一些术语,给出了详细介绍6大类26种服务的跳转目录。

车载系统攻城狮 9万+

百度AI架构师亲授:Agentic智能体在教育领域的落地(附个性化学习案例)

当我们谈论“教育智能化”时,我们真正需要的不是“更聪明的工具”,而是“能懂人的伙伴”——一个能像优秀教师那样主动观察、精准判断、动态调整的“数字助手”。Agentic智能体(智能体)正是这样的存在:它具备“自主性”(主动决策)、“反应性”(感知环境)、“目标导向”(聚焦学习目标)和“社会性”(与人/其他智能体协作),完美匹配教育场景中“个性化、动态化、协同化”的核心需求。本文将从底层逻辑到工程实现为什么Agentic是教育AI的“下一站”?(痛点与价值)Agentic智能体的核心架构是什么?

AI天才研究院 356

C语言switch执行原理,Switch 底层执行原理

Switch 底层执行原理switch 底层执行原理switch 语句根据一个整数索引值进行多重分支, 底层采用跳转表这种数据结构跳转表是一个数组, 表项 i 对应代码段的地址, 当 switch 索引值等于表项 i 时采取对应的程序操作简单可理解为: 执行 switch 时生成一个长度为最大 case 常量+1 的数组, 程序首先判断 switch 变量是否大于最大 case 常量, 若大于, ...

weixin_33201531的博客 2818

从入门到精通!Arduino 全栈开发深度指南

本文围绕 Arduino 开发撰写全攻略,从基础入门到高级应用层层递进。开篇介绍 Arduino 概念、优势及硬件家族,引导读者完成开发环境搭建与首个 LED 闪烁项目;深入讲解编程语法、I/O 控制及通信协议;详细阐述传感器、模块应用与调试优化技巧;最后以自定义库开发、低功耗设计等高级内容收尾,并给出综合项目案例与产品化思路。无论新手入门,还是开发者进阶,均可从中系统学习 Arduino 知识,掌握从理论到实践的全流程开发技能。

邓邓子的博客 2755

透过IL看C# (2)——switch语句(下)

透过IL看C# (2)switch语句(下) 原文地址:http://www.cnblogs.com/AndersLiu/archive/2008/11/06/csharp-via-il-switch-2.html 原创:Anders Liu 摘要:switch语句是C#中常用的跳转语句,可以根据一个参数的不同取值执行不同的代码。本文介绍了当向switch语句中传入不同类型...

weixin_33774615的博客 109

逆向分析-SeparationPreview.aip-分色预览-结构分析(一)-x64dbg条件日志打印-命令表达式-PS脚本

从功能上分析,仅显示使用的专色这个功能,并没有触发插件接口。使用X64dbg加载illustrator进程,切换到句柄窗口,在窗口过程中,右键刷新获取界面。在x64dbg中,在UI中可以输入一些条件表达式,能够计算出对应的值,并打印在日志中。常用的,如果非暂停,输出第一个参数。参数二是utf16的指针,utf16@字符串地址,这里的字符串地址为[[ebp-108]]参数一是utf8的,utf8@字符串地址,这里的字符串地址为[ebp-28]从界面上分析,一个颜色列表,及仅显示专色的多选框组成。

插件开发 644

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C语言switch编译,高效的C编程之:Switch语句-嵌入式系统-与非网

14.6Switch语句编译器通常将C语言中的Switch语句编译一个查找表(TableLookup)以便跳转到合适的入口处。下面的例子显示了编译器如何处理程序中的Switch语言的。C源程序如下。char*ConditionStr1(intcondition){switch(condition){case0:return"EQ";case1:return"NE";case...

weixin_42315966的博客 592

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

c语言 switch反汇编

switch语句反汇编 一、switch语句 1、在正向编码时,switch语句可以看做是if语句的简写 2、break在switch语句的妙用 1、当switch存在3个分支时 当去掉break的时候 二、switch语句的反汇编 1、当switch存在3个分支时 #include<stdio.h> void Function(int x) { switch (x) { case 1: printf("1"); case 2: printf("2"); cas

qq_45951598的博客 1098

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【编译原理】第七章 语义分析和中间代码生成

目录语义分析语法制导翻译属性文法中间语言后缀式图表示法抽象语法树DAG图三地址代码四元式三元式多目运算符的翻译三元式和四元式的比较:间接三元式说明语句赋值语句的翻译只含有简单算术表达式含有数组元素控制语句的翻译条件语句ifswitch循环语句while静态语义分析中间代码也叫中间语言(Intermediate code /language) 是源程序的一种内部表示,不依赖目标机的结构, 易于机械生成目标代码的中间表示。常见的几种形式:(1)后缀式(2)图表示法(抽象语法树、DAG图)(3)三地

wuyufei_sun的博客 882

C++反汇编->多分支if与switch分析

先敲一段代码: #include <iostream> using namespace std; void main() { cout<<"hello world"<<endl; int i=1; if (i<0) { cout<<"i < 0"<<endl; } else i...

weixin_34315665的博客 133

PHP下switch-case 和 if-else效率的比较

早晨在写一个PHP的程序,因为要处理很大的数据量,所以不得不考虑运行时间的问题。然后在计算每项的权值时遇到了问题,在考虑应该用switch-case还是if-else,在网上看了一下,大家都说switch-case的效率要比if-else高的多,自己写了几个程序测试了一下,是这样

SoloSun的专栏 1万+

哈工大编译原理 | 6.中间代码生成

哈工大编译原理 | 6.中间代码生成,笔记内容非常详细,适合考试复(预)习

m0_55763458的博客 1287

CSAPP讨论课-switch跳转表

CSAPP讨论课-switch跳转表

Wall_e_47的博客 1918

字节码层面理解枚举类Enum在switch中的使用

1.本文从字节码层面来探究,switch的case变量值为java枚举Enum时,编译器究竟做了什么工作。 2.源码如下 枚举类Color public enum Color { RED,BLUE,YELLOW } switch中使用Color public class MySwitchTest { int chooseColor(Color c){ ...

没有格子衬衫的程序员 1293

C语言汇编案例,C语言汇编代码分析(切换案例)

让我们看下面的示例:switch-case控制语句维护一个跳转表,该跳转表不能通过一系列if-else实现. 在上面的示例中,它是标签L7标记值得纪念的地方.跳转表方法的总体思路是这样的使用case语句中的最大值减去最小值来找到一个间隔,这里是106-100 = 6,即0到6有7种可能的情况,那么编译器为切换案例控件分配一个长度为7的数组c语言对应汇编语句,然后编译器将查询存在的案例,并填写数组中...

weixin_28960699的博客 444

深入解析switch语句:从语法糖到跳转表优化的底层原理

在编程中,分支控制是基础且核心的概念,它决定了程序在不同条件下的执行路径。其底层实现原理通常涉及条件判断与跳转指令,编译器会根据分支条件的特性进行不同级别的优化。从技术价值看,高效的分支处理能显著提升程序性能,尤其在密集分支场景下。在应用场景上,状态机处理、协议解析和字节码解释器等都需要高效的分支分发机制。本文以switch语句为例,深入探讨其如何通过跳转表机制实现O(1)时间复杂度跳转,并分析case穿透特性和不同编程语言中的变体实现,帮助开发者编写对编译器更友好的代码。

weixin_32705179的博客 254

为什么miniC没有for循环?迷你C语言的设计边界与哲学

如果你刚刚接触 miniC——这个能在浏览器里直接运行 C 语言的迷你虚拟机项目,很可能会在写第一段代码时愣住:`for` 循环呢?居然没有 `for` 关键字?没错,miniC(迷你 C 语言)刻意砍掉了 `for` 和 `switch`,只保留 `while` 作为唯一的循环结构。这看起来像个功能缺失,实际上是这个"浏览器运行 C 语言的栈式虚拟机"最用心的一处设计。本文带你拆解 miniC

gitblog_00477的博客 259
上一篇: Swing简介
下一篇: java中关键字:final
Jast_Zhang
博客等级 码龄15年 12粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值