背景:我继承了一个概念验证项目,该项目为用户提供了一个绘图画布,可以在其上构建流程图。然后它尝试从流程图中生成一些过程代码。
我怀疑这是否真的能成功,部分是因为有太多的错误,但从根本上是因为......
问题:流程图不是绘制GOTO的一种方式吗?因此,从流程图中生成结构良好的过程代码并不一定困难吗?
这是我自己的答案,我不会接受(至少几周),因为我真的想要别人的意见。
使用流程图表示的算法更类似于使用goto
s编写的代码而不是结构化语言(如C#,Pascal或Java)。
流程图连接器有时可以表示代码中的一系列语句。在其他时候,它可以代表结构化构造的一部分,如īf
,while
等。但由于以下原因,它更通常代表goto
:
goto
所做的。goto
可以针对范围内的任何声明。流程图和代码与goto
s之间的这种更接近的相似性可以通过比较一个小变化的影响来说明。让我们看一下流程图的两个版本,看看如何使用goto
s在结构化代码和代码中表示它们。
流程图的两个版本之间的唯一区别在于“已注册投票?否”连接器的目标。
这是版本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作为goto
s的代码
REM Version A
decide who to vote for
IF registered to vote THEN GOTO VOTE
GOTO FINISH
VOTE:
vote
FINISH:
使用goto
s的代码版本B非常相似:
REM Version B
DECIDE:
decide who to vote for
IF registered to vote THEN GOTO VOTE
GOTO DECIDE
VOTE:
vote
FINISH:
使用goto
s对代码的更改类似于流程图中所做的更改:更改连接器的目标,更改goto
目标。相比之下,结构化代码中所需的更改与流程图所做的更改没有任何相似之处:如果条件为真,则版本A执行某些操作而版本B在条件为真之前执行其他操作。
因此,使用goto
s的代码更接近地表示流程图。流程图组件和goto
代码组件之间有更密切的对应关系。流程图连接器直接对应于代码中的goto
s。
结论
通过对流程图进行少量更改,可以显着改变算法的意图。因此,您可能会说虽然流程图可以表示算法的机制,但它并不能很好地表示意图。
这是因为流程图连接器的目的是表示低级别的方式,而不是算法尝试实现的方式。相比之下,if
,while
等结构化代码中的结构更多的是关于什么。
所以回答这个问题:是的,绘制流程图连接器是一种表示goto
s的方法。
脚注
正如slebetman对这个问题所评论的那样,至少在机器代码级别上,我们用Java,C#等编写的结构良好的代码背后都有goto
s。但那只是故事的一部分。在结构化代码中,低级别的goto
总是以精心控制的方式使用,并且通常与其他人工制品(如高级代码中未见的标签)相关联。
我正在为青少年编写一个编程指南,我认为goto很容易解释程序的流程,所以我使用goto替换while / if / for ...
当我绘制流程图时,我使用带有标签的圆圈来描述它。