Language agnostic 流程图-绘制GOTOs的方法?

Language agnostic 流程图-绘制GOTOs的方法?,language-agnostic,goto,flowchart,Language Agnostic,Goto,Flowchart,背景:我继承了一个概念验证项目,该项目为用户提供了一个绘图画布,用户可以在其上构建流程图。然后,它尝试从流程图生成一些程序代码 我非常怀疑这是否真的能成功,部分原因是有太多的bug,但根本原因是 问题:流程图不只是绘制GOTO的一种方式吗?因此,从流程图中生成结构良好的程序代码不一定很难吗?以下是我自己的答案,我不会接受(至少在几周内),因为我真的需要其他人的意见 使用流程图表示的算法更类似于使用gotos编写的代码,而不是像C#、Pascal或Java这样的结构化语言 流程图连接器有时可以在代

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

我非常怀疑这是否真的能成功,部分原因是有太多的bug,但根本原因是


问题:流程图不只是绘制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“编程语言”确实有流程图语言中的函数:函数定义从
    块开始,并在函数被激活时返回