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

时间:2009-06-14 14:40:21

标签: java programming-languages language-design

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

原因是我正在制作一种用Java实现的语言。 Gotos是我语言的重要组成部分;我希望能够将其编译为本机或JVM字节码,尽管它必须能够轻松使用Java库(即.C支持goto,但要使用它我必须在C中重写库)。

我想生成C或Java等源文件,而不是字节码或机器码。我正在使用第三方编译器来做到这一点。

9 个答案:

答案 0 :(得分:9)

JVM支持转到字节码级别。 如果您使用自己的语言,则应使用BCELASM等库,而不是生成.java文件。

答案 1 :(得分:5)

JVM字节码包含goto指令(例如,请参阅BCEL文档)。

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

break {labelname}

continue {labelname}

有关详细信息,请参阅此JDC tech tip。如果您的语言编译为JVM字节码,那么您可以使用它。

答案 2 :(得分:2)

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

另请注意,Java字节码有一个goto指令,虽然它显然是基于指令而不是基于行的。

答案 3 :(得分:2)

您可以将代码生成器编写为目标Jasmin。您可以根据需要在Jasmin中使用goto。 : - )

答案 4 :(得分:2)

你可以使用goto做任何你可以做的事情。 goto真的是多余的,通常是不可信的编程方式。 IMHO。

如果你想向后转到

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.

答案 5 :(得分:1)

goto关键字保留但在Java编程语言中未使用。 (来自Section 3.9The Java Language Specification。)

因此,至少在Java编程语言中,无法启用goto

但是,如前所述,Java虚拟机中的goto opcode是可用的,并且在Java编译器从源生成字节码时使用。

在实现JVM语言时,来自Chapter 7: Compiling for the Java Virtual Machine

The Java Virtual Machine Specification可能会很有用。

答案 6 :(得分:0)

Java不允许使用goto关键字。但是,它允许使用标签并使用带标签的breakcontinue代替goto。事实上,Java不是没有goto语句的语言,而是一种令人不舒服的语言。

答案 7 :(得分:0)

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

答案 8 :(得分:-1)

你不应该使用goto,因为它是EVIL; - )

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