自动 GOTO 删除算法

2024-07-02

我听说理论上已经证明可以仅使用结构化编程结构(条件、循环和循环中断以及子例程调用)以图灵完备的语言表达任何控制流,而无需任何任意操作GOTO声明。有没有什么方法可以使用该理论来自动重构包含以下内容的代码:GOTOs 进入没有的代码?

假设我有一个使用简单命令式语言(例如 C 或 Pascal)的任意单个子例程。我还有一个解析器,可以验证该子例程是否有效,并从中生成抽象语法树。但代码中包含GOTOs 和 Labels,它们可以向前或向后跳转到任何任意点,包括进出条件或循环块,但不能跳到子例程本身之外。

是否有一种算法可以采用此 AST 并将其重新加工成语义相同但不包含任何标签或的新代码GOTO声明?


原则上,这样做总是可以的,尽管结果可能不太好。

始终消除 goto 的一种方法是按以下方式转换程序。首先对原始程序中的所有指令进行编号。例如,给定这个程序:

start:
    while (true) {
        if (x < 5) goto start;
        x++
    }

您可以这样对语句进行编号:

0 start:
1     while (x < 3) {
2         if (x < 5) goto start;
3         x++
      }

要消除所有 goto,您可以使用 while 循环、保存程序计数器的显式变量和一堆 if 语句来模拟通过此函数的控制流。例如,您可以将上面的代码翻译成这样:

int PC = 0;
while (PC <= 3) {
    if (PC == 0) {
         PC = 1;             // Label has no effect
    } else if (PC == 1) {
         if (x < 3) PC = 4;  // Skip loop, which ends this function.
         else PC = 2;        // Enter loop.
    } else if (PC == 2) {
         if (x < 5) PC = 0;  // Simulate goto
         else PC = 3;        // Simulate if-statement fall-through
    } else if (PC == 3) {
         x++;
         PC = 1;             // Simulate jump back up to the top of the loop.
    }
}

这是一种非常非常糟糕的翻译方式,但它表明理论上总是可以做到这一点。实际上实现这一点会非常混乱 - 您可能会对函数的基本块进行编号,然后生成将基本块放入循环中的代码,跟踪当前正在执行的基本块,然后模拟运行基本块的效果并从该基本块到适当的下一个基本块的过渡。

希望这可以帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自动 GOTO 删除算法 的相关文章

  • 有谁知道有一个很好的库可以将一个人的名字映射到他或她的性别吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在寻找一个图书馆或数据库 可以根据一个人的名字或昵称猜测他或她是男性还是女性 就像是 john gt M mary gt F al
  • 缩小位图字体的算法

    这是后续这个问题 https stackoverflow com questions 4179414 low level c display text pixel by pixel 我正在开发一个低级 C 应用程序 我必须在其中绘制文本 我
  • last.fm、groveshark、pandora 等推荐网站背后的算法是什么?

    我正在考虑启动一个基于推荐系统的项目 我需要在这方面提高自己 这看起来是网络端的热门话题 还想知道lastfm groveshark pandora 的推荐系统使用什么算法 如果您知道有关此类算法的任何书籍 网站或任何资源 请告知 看一下协
  • 德尔福 LZMA

    我在 7 zip 网站上找到了一个 LZMA 库 但是没有用 我不使用文件 只使用流 出于某些原因 7 zip 站点上的库只将标头写入流而不压缩流 有人遇到了一些问题吗 有例子吗 知道 Delphi 的其他 LZMA 库吗 Tks 我自己没
  • 矩阵行列式算法 C++

    我是编程新手 我一直在寻找一种找到矩阵行列式的方法 我在网上找到了这段代码 但我很难理解这里的算法 我对递归的基础没有问题 但继续和主循环我很难理解 非常感谢任何可以向我解释该算法的人 int determ int a MAX MAX in
  • 检查一个字符串是否是另一个字符串的旋转而不连接

    有 2 个字符串 我们如何检查其中一个是否是另一个的旋转版本 For Example hello lohel 一种简单的解决方案是concatenating第一个字符串与其自身并检查另一个字符串是否是substring的串联版本 还有其他解
  • 实施数据库——如何开始

    我已经尝试学习编程有一段时间了 我学过 Java 和 Python 并且对它们的语法很满意 最近 我想利用我所学到的知识从头开始编写有形的软件 我想实现一个数据库引擎 类似于 NoSQL 数据库 我整理了一份小文档 类似于我在编码过程中遵循
  • 如何有效地从kd树中找到k个最近邻居

    实际上这个问题之前已经被问过 但据我所知 尚未提供适当的答案 我了解如何实现 k d 树以及最近邻搜索如何工作 然而 即使环顾四周 我也找不到一种有效的方法来使用 k d 树非常有效地搜索 k 个最近邻居 我只能想到找到最近的邻居并将其删除
  • 在带有传送器的网格上 A* 可接受的启发法?

    假设您有一个二维单元格网格 其中一些单元格被墙填充 角色可以从一个方格迈出一步 到达距离该方格水平或垂直一步的任何方格 但不能越过墙壁 给定起始位置和结束位置 我们可以使用具有可接受启发式的 A 算法找到从起始位置到结束位置的最短路径 在当
  • 生成一定范围内的 N 个随机数,其总和为常数

    我想生成从 a b 之间的特定分布 例如均匀随机 抽取的 N 个随机数 其总和为常数 C 我尝试了一些我自己能想到的解决方案 以及在类似线程上提出的一些解决方案 但是他们中的大多数要么适用于有限形式的问题 要么我无法证明结果仍然遵循所需的分
  • 计算整数范围的重叠

    我对这个算法已经被难住很久了 假设有四个整数范围 每个范围都有一个开始值和一个结束值 Range A 0 5 Range B 4 12 Range C 2 10 Range D 8 14 从这些值中 我想得到一个新的集合 它计算特定整数范围
  • 相当于 C++ 中用于缓冲读取的 python 生成器

    Guido Van Rossum 在此展示了 Python 的简单性article http neopythonic blogspot com 2008 10 sorting million 32 bit integers in 2mb h
  • Haskell 中的精确流量控制

    The Idea 你好 我正在尝试在 Haskell 中实现一个基于数据流思想的图像处理库 我遇到了一个与如何处理控制流相关的问题 主要思想是引入一个time The time is a Float 可以在代码中的任何位置访问它 您可以将其
  • 当数组可能包含或不包含主元素时进行就地分区

    有没有一个就地分区 http www cs auckland ac nz jmor159 PLDS210 qsort1a html算法 用于快速排序 http en wikipedia org wiki Quicksort实现 不依赖于数组
  • 求任意顶点到图边界的最小距离

    所以我有近似曲面的三角形网格 它就像具有以下属性的图表 图边界上的顶点是可以轻易识别的 相邻顶点的数量 gt 包含三角形的数量 您可以轻松计算任意两个顶点之间的距离 欧几里德距离 对于任意顶点v 任何不是邻居的顶点v必须有更远的距离v至少比
  • 通过坐标计算二维形状的最小外接矩形

    我有一个解决方案 它使用空间数据来表示地图上的一组点 我需要使用表示簇范围的坐标来查找可以包含所述点簇的最小边界矩形 是否存在能够计算此值的简单算法 或者 C 中是否有任何内置功能可以实现此目的 我知道 NetTopologySuite 但
  • 索引 List 时的最佳 HashMap 初始容量

    我有一个清单 List
  • 是否可以创建一个生成亲笔签名的算法?

    An autogram http en wikipedia org wiki Autogram是一个描述其包含的字符的句子 通常枚举字母表中的每个字母 但也可能枚举它包含的标点符号 这是 wiki 页面中给出的示例 这句话使用了两个a 两个
  • 将营业时间添加到 Java DateTime

    对于问题跟踪系统 我需要计算请求的响应时间 响应时间计时器只能在工作时间内运行 我应该使用什么算法 库来完成此任务 当然 我知道 Joda Time 或 ObjectLab Kit 但找不到任何对我的任务有帮助的东西 我错过了什么吗 Exa
  • 如何实现一个单链表队列,使其入队和出队时间复杂度为O(1)?

    这是一个练习 来自CLRS 3rd 10 2 3 通过单向链表 L 实现队列 ENQUEUE 和 DEQUEUE 操作仍然需要 O 1 时间 使用单链表实现队列并不难 我的问题是关于时间复杂度的 如何实现耗时 O 1 的 ENQUEUE 和

随机推荐

  • 带转义引号的带引号字符串的正则表达式

    如何获取子字符串 It s big problem 使用正则表达式 s function return It s big problem 适用于 Regex Coach 和 PCRE Workbench JavaScript 测试示例 va
  • 在django中使用pre_save时取消保存模型

    我有一个模型 class A models Model number models IntegerField 但是当我调用 A save 时 我想确保该数字是素数 或其他条件 否则应该取消保存指令 那么如何取消pre save信号接收器中的
  • boost-build / bjam:安装后执行脚本(使“安装”成为执行脚本的依赖项)

    Using boost build bjam 是否可以在install规则已完成 我有一个Jamfile它定义了一个可执行文件 exe 然后安装它 install 我想在之后执行一个脚本install step Jamfile exe my
  • 格式化具有 X 位小数和 InvariantCulture 的数字?

    我想使用格式化数字ToString CultureInfo InvariantCulture 并且精确到小数点后 5 位 这可以使用ToString N5 我怎样才能同时做这两件事 怎么样使用重载既需要格式又需要文化 http msdn m
  • 混合声音的算法

    我有两个原始声音流需要添加在一起 出于此问题的目的 我们可以假设它们具有相同的比特率和位深度 例如 16 位样本 44 1khz 样本率 显然 如果我将它们加在一起 我的 16 位空间就会溢出和下溢 如果我将它们加在一起并除以二 那么每个人
  • Sublime Text 3 PHP 单元

    在 Sublime Text 3 PHP 单元中不起作用 捆绑包已正确安装 但插件处于非活动状态 有人解决了这个问题吗 提前致谢 我强烈建议你使用这个包isn t可在包控制上使用 Sublime PHPUnit https github c
  • 在 OpenCV C++ 中使用 gpu::GpuMat

    我想知道如何修改gpu GpuMat 事实上我想知道是否可以使用gpu GpuMat like a cv Mat 我想做这样的事情 cv namedWindow Result cv Mat src host cv imread lena j
  • 如何将“书”添加到/shelves/1/books

    我不知道如何做一些本应非常简单的事情 我有两个实体 书架和书 一个书架可以放置一本或多本书 这些实体中的每一个都有一个相应的 JpaRepository 使用 Spring Data Rest 作为剩余存储库公开 当我运行该应用程序时 所有
  • 规避模板专业化

    假设我是某个模板库的用户 CTL 它定义了一个模板 命名为 Hector template
  • 基于区域设置的 SimpleDateFormat 模式,但强制使用 4 位数年份

    我需要建立一个像这样的日期格式dd MM yyyy 几乎就像DateFormat SHORT 但包含 4 个年份数字 我尝试用它来实现它 new SimpleDateFormat dd MM yyyy locale format date
  • 我们如何在 GitHub 中强制执行强制审查,但仍然允许从 CI 进行 Maven 发布构建?

    我们希望对 GitHub Enterprise 2 10 中的拉取请求使用强制代码审查 使用存储库受保护分支设置中的 合并前需要拉取请求审查 功能 但是 当我们启用此功能时 Maven 发布构建会失败 因为发布插件尝试使用运行 TeamCi
  • RouteValueDictionary 的字符串 URL

    有没有简单的方法将字符串 URL 转换为 RouteValueDictionary 集合 有些方法像UrlToRouteValueDictionary string url 我需要这样的方法 因为我想根据我的路由设置 解析 URL 修改一些
  • 如何在 Anaconda(Jupyter 笔记本)中导入 python 自定义类

    我无法找到如何使用 anaconda 中的 Jupyter 笔记本在 Python 中导入自定义类 在我的工作文件夹中有一个文件 用户 ipynb 包含类名User 在同一文件夹中的其他文件中 我尝试使用以下命令导入此类 从用户导入用户 我
  • 解析:删除用户及其相关记录

    我有带有实体的解析表 用户 默认类别 Commets 带有指向 User 实体的指针的类 我需要从实体 User 中删除用户及其所有评论 位于 Comments 实体中 现在我有 JS Cloud 代码 Parse Cloud define
  • Jersey/JAX-RS :在响应标头中返回内容长度而不是分块传输编码

    我正在使用 Jersey 创建 RESTful API 资源 并且ResponseBuilder生成响应 RESTful 资源的示例代码 public class infoResource GET Path service id Produ
  • R:需要用正则表达式替换不可见/重音字符

    我正在处理从具有不同区域设置的几台不同机器生成的文件 因此我最终得到了一列数据框 其中同一单词具有不同的文字 C RDOBA C RDOBA C RDOBA 我想将所有这些转换为CORDOBA 我试过做 t lt gsub O t igno
  • PyCharm 中的进程已完成,退出代码为 137

    当我在 PyCharm 中手动停止脚本时 进程以退出代码 137 结束 但我没有停止脚本 仍然得到退出代码 137 有什么问题吗 Python版本是3 6 运行xgboost train 方法时处理完成 退出代码 137 意味着您的进程被
  • 复制行并更改一小部分列?

    首先 我先说一下我知道类似问题的 INSERT SELECT 解决方案 请参阅here https stackoverflow com questions 2783150 mysql how to copy rows but change
  • 在 Oracle 中将 varchar 拆分为单独的列

    我有点困惑 我被要求接受以数据库中的特定字符串开头的注释 并将结果分成单独的列 例如 如果返回值是这样的 COLUMN ONE D7ERROR username 回报必须是 COL ONE COL TWO D7ERROR username
  • 自动 GOTO 删除算法

    我听说理论上已经证明可以仅使用结构化编程结构 条件 循环和循环中断以及子例程调用 以图灵完备的语言表达任何控制流 而无需任何任意操作GOTO声明 有没有什么方法可以使用该理论来自动重构包含以下内容的代码 GOTOs 进入没有的代码 假设我有