Language agnostic 流程图-绘制GOTOs的方法?
背景:我继承了一个概念验证项目,该项目为用户提供了一个绘图画布,用户可以在其上构建流程图。然后,它尝试从流程图生成一些程序代码 我非常怀疑这是否真的能成功,部分原因是有太多的bug,但根本原因是Language agnostic 流程图-绘制GOTOs的方法?,language-agnostic,goto,flowchart,Language Agnostic,Goto,Flowchart,背景:我继承了一个概念验证项目,该项目为用户提供了一个绘图画布,用户可以在其上构建流程图。然后,它尝试从流程图生成一些程序代码 我非常怀疑这是否真的能成功,部分原因是有太多的bug,但根本原因是 问题:流程图不只是绘制GOTO的一种方式吗?因此,从流程图中生成结构良好的程序代码不一定很难吗?以下是我自己的答案,我不会接受(至少在几周内),因为我真的需要其他人的意见 使用流程图表示的算法更类似于使用gotos编写的代码,而不是像C#、Pascal或Java这样的结构化语言 流程图连接器有时可以在代
问题:流程图不只是绘制GOTO的一种方式吗?因此,从流程图中生成结构良好的程序代码不一定很难吗?以下是我自己的答案,我不会接受(至少在几周内),因为我真的需要其他人的意见 使用流程图表示的算法更类似于使用
goto
s编写的代码,而不是像C#、Pascal或Java这样的结构化语言
流程图连接器有时可以在代码中表示一系列语句。在其他情况下,它可以表示结构化构造的一部分,如īf
,while
等。但由于以下原因,它更普遍地代表转到
:
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
这是带有goto
s的版本A代码
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
当我画流程图时,我用一个带标签的圆圈来描述它。
如果
,当
,为
和开关
也只是生成GOTO的一种方式。底层代码使用gotos并不重要。重要的是人类不使用gotos。编译器(在您的例子中是流程图编译器)不会被gotos混淆。在代码中使用goto时,往往是人脑忽略了bug。此外,if
、while
、for
和switch
只是以更结构化的方式表达goto
的不同方式而已。大多数情况下,流程图往往表示大量的if
,有时表示while
。因此,如果你真的不想生成goto
@slebetman,那么就生成if
,while
,for
和switch
——是的,我完全知道你的意思。这些整洁的结构,,for
等是goto
s的组合。但是考虑函数调用——它总是将控制返回到它调用的点。这是两个goto
s。流程图允许用户单独放置它们。虽然可以使用goto
s编写结构良好的代码,但它并不强制执行。cites,我觉得很有趣,但它并没有完全回答我的具体问题。事实上,我怀疑我的具体问题的答案是本文发现流程图用处不大的原因。流程图中的函数通常没有语义支持。流程图都是关于if
和循环的。流程图是有限自动机的可视化。在某种程度上,它们与正则表达式具有相同的用途。IEC1131“编程语言”确实有流程图语言中的函数:函数定义从
块开始,并在函数被激活时返回
块