goto关键字的底层原理

goto关键字的底层原理

编码文章call10242025-01-12 12:03:1426A+A-


提到goto, 大家一定能想到迪杰斯特拉发表的著名论文goto有害论(Go To Statement Considered Harmful)。正是它推动了结构化程序设计语言的发展。公正地说,goto并非那么可怕,机器码/汇编码本身支持跳转,就是goto的底层形态。计算机程序中条件选择、循环等语句最终依然依靠跳转指令完成,只是高级编程语言不建议用goto, 会造成程序员的困扰。但,机器从来都没困扰过,CPU根据jmp或j*指令的地址改写RIP地址并执行,丝滑无比,从未抱怨过。


"万恶"的goto

  • 越靠近底层的语言可能会支持goto,例如汇编和C/C++, 更高级的编程语言尽可能废弃goto, C#又是个特例,它也支持goto.
  • goto就像一个小孩子,一会哭一会闹,完全get不到他想要什么。但如果是一个专业的技术员,goto能发挥他最大能力,因为他随时都知道应该去哪里做什么。
  • “goto是魔鬼”并不总正确。内核和驱动代码为了更鲁棒,有健全的出错处理机制,出错处理一般会被定义成label, 在出错情形较多时用goto是最佳化跳转,而不是多种条件判断出错处理。
  • Rust改进C语言出错处理逻辑,避免过多判断,引入match语句匹配OK或fail场景,更清晰可靠。
  • Go语言是C语言的进化版,引入defer语句解决延迟错误处理,避免C语言大量出错处理。
  • PHP和C语言类似,也支持goto.


goto的内部实现

  • goto是无条件跳转,可对应汇编jmp.
  • 汇编代码隐式包含所在代码”地址”, 程序员可以手动加上任意label给goto提供跳转位置。
    • 当然也可以根据汇编代码的堆栈相对位置(如EBP/ESP/PC)跳转,不需要额外定义label.
    • 标签label服务于程序员和编译器,不会增加机器码长度。
  • break/continue/return本质都是可控/受限的”goto”.
  • 当然,关键字和数字不能当做label.








若文章对您有帮助,欢迎关注 程序员小迷 。助您在编程路上越走越好!

微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是 程序员小迷 (致力于C、C++、C#、Android、iOS、Java、Kotlin、Objective-C、Swift、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4