流程图 - 绘制GOTO的一种方式?

问题描述 投票:1回答:2

背景:我继承了一个概念验证项目,该项目为用户提供了一个绘图画布,可以在其上构建流程图。然后它尝试从流程图中生成一些过程代码。

我怀疑这是否真的能成功,部分是因为有太多的错误,但从根本上是因为......

问题:流程图不是绘制GOTO的一种方式吗?因此,从流程图中生成结构良好的过程代码并不一定困难吗?

language-agnostic goto flowchart
2个回答
0
投票

这是我自己的答案,我不会接受(至少几周),因为我真的想要别人的意见。

使用流程图表示的算法更类似于使用gotos编写的代码而不是结构化语言(如C#,Pascal或Java)。

流程图连接器有时可以表示代码中的一系列语句。在其他时候,它可以代表结构化构造的一部分,如īfwhile等。但由于以下原因,它更通常代表goto

  1. 连接器的功能只是将控制从一个语句转移到另一个语句。这正是goto所做的。
  2. 连接器的目标可以是页面上的任何节点。同样,goto可以针对范围内的任何声明。

流程图和代码与gotos之间的这种更接近的相似性可以通过比较一个小变化的影响来说明。让我们看一下流程图的两个版本,看看如何使用gotos在结构化代码和代码中表示它们。

流程图的两个版本之间的唯一区别在于“已注册投票?否”连接器的目标。

这是版本A作为结构化代码:

REM Version A
decide who to vote for
IF registered to vote THEN
    vote
END IF

版本A的结构化代码必须进行重构才能获得版本B:

REM Version B
DO
    decide who to vote for
UNTIL registered to vote
vote

这是版本A作为gotos的代码

REM Version A
decide who to vote for
IF registered to vote THEN GOTO VOTE
GOTO FINISH
VOTE:
vote
FINISH:

使用gotos的代码版本B非常相似:

REM Version B
DECIDE:
decide who to vote for
IF registered to vote THEN GOTO VOTE
GOTO DECIDE
VOTE:
vote
FINISH:

使用gotos对代码的更改类似于流程图中所做的更改:更改连接器的目标,更改goto目标。相比之下,结构化代码中所需的更改与流程图所做的更改没有任何相似之处:如果条件为真,则版本A执行某些操作而版本B在条件为真之前执行其他操作。

因此,使用gotos的代码更接近地表示流程图。流程图组件和goto代码组件之间有更密切的对应关系。流程图连接器直接对应于代码中的gotos。

结论

通过对流程图进行少量更改,可以显着改变算法的意图。因此,您可能会说虽然流程图可以表示算法的机制,但它并不能很好地表示意图。

这是因为流程图连接器的目的是表示低级别的方式,而不是算法尝试实现的方式。相比之下,ifwhile等结构化代码中的结构更多的是关于什么。

所以回答这个问题:是的,绘制流程图连接器是一种表示gotos的方法。


脚注

正如slebetman对这个问题所评论的那样,至少在机器代码级别上,我们用Java,C#等编写的结构良好的代码背后都有gotos。但那只是故事的一部分。在结构化代码中,低级别的goto总是以精心控制的方式使用,并且通常与其他人工制品(如高级代码中未见的标签)相关联。


0
投票

我正在为青少年编写一个编程指南,我认为goto很容易解释程序的流程,所以我使用goto替换while / if / for ...

当我绘制流程图时,我使用带有标签的圆圈来描述它。

© www.soinside.com 2019 - 2024. All rights reserved.