代码之家  ›  专栏  ›  技术社区  ›  Lucky

支持GOTO的Java编译器或JVM语言?

  •  5
  • Lucky  · 技术社区  · 16 年前

    是否有Java编译器标志允许我使用 goto 作为有效构造?如果没有,是否存在支持的第三方Java编译器 古托 ?如果没有,是否有其他语言支持 古托 同时可以轻松调用Java编写的方法吗?

    原因是我正在制作一种用Java实现的语言。GOTOS是我的语言的重要组成部分,我希望能够将它编译成本机或JVM字节码,尽管它必须能够容易地使用Java库(例如,C支持)。 古托 ,但要使用它,我必须用c重写库)。

    我想生成C或Java等源文件,而不是字节码或机器代码。我正在使用第三方编译器来完成这项工作。

    9 回复  |  直到 12 年前
        1
  •  9
  •   J-16 SDiZ    16 年前

    JVM支持字节码级别的GoTo。 如果你在使用自己的语言,你应该使用像 BCEL ASM 不生成.java文件。

        2
  •  5
  •   Brian Agnew    16 年前

    jvm字节码包含goto指令(例如,请参见 BCEL 文件)。

    不要忘记Java本身支持跳转到标签的概念,使用:

    break {labelname}
    

    continue {labelname}
    

    看到这个 JDC tech tip 更多信息。如果您的语言被编译成了JVM字节码,那么您可以利用它。

        3
  •  2
  •   Matthew Flaschen    16 年前

    根据定义,没有Java编译器允许GOTO。Java编译器必须实现 JLS 和JLS不允许Gotos。但是,显然也可以用goto编译一种语言到JVM。 AMPC 是一个声称支持C89的C-to-JVM编译器。

    还要注意,Java字节码有一个GOTO指令,尽管它显然是基于指令的,不是基于行的。

        4
  •  2
  •   C. K. Young    16 年前

    您可以将代码生成器编写到目标 Jasmin . 你可以在茉莉花中任意使用Goto。-)

        5
  •  2
  •   Peter Lawrey    16 年前

    你可以用goto做的任何事情都可以用循环来做。goto确实是多余的,而且通常是不可信的编程方式。恕我直言。

    如果你想退后一步

    LABEL: do {
    // code before goto
    
    // goto LABEL
    continue LABEL;
    
    // code after goto
    break;
    } while(true);
    

    如果你想前进

    LABEL: do {
    // code before goto
    
    // goto LABEL
    continue LABEL;
    
    // code after goto
    break;
    } while(false);
    // Label is effectively here
    // code after LABEL.
    
        6
  •  1
  •   reevesy onejigtwojig    13 年前

    这个 goto 关键字在Java编程语言中保留但未使用。(从 Section 3.9 属于 The Java Language Specification )

    因此,至少在Java编程语言中,无法使用 古托 .

    然而,正如已经指出的那样, goto opcode 在Java虚拟机中是功能性的,并且当Java编译器从源代码生成字节码时使用。

    Chapter 7: Compiling for the Java Virtual Machine The Java Virtual Machine Specification 在实现JVM语言时可能会感兴趣。

        7
  •  0
  •   Michael Munsey    15 年前

    ApacheThrift可以用于从单个源代码生成不同编程语言的源代码。 http://incubator.apache.org/thrift/

        8
  •  0
  •   Andrei Volgin    12 年前

    Java不允许使用 goto 关键字。但是,它允许使用标签和 break continue 用标签代替 古托 . 事实上,Java不是一种没有GOTO语句的语言,而是一种语言,它具有令人不快的实现。

        9
  •  -1
  •   Michael Zilbermann    16 年前

    你永远不应该使用Goto,因为它是邪恶的;-)

    更严重的是,也许你可以看看E.Dijkstra的著名文章: http://www.u.arizona.edu/~rubinson/copyright_violations/Go_To_Considered_Harmful.html