是否有java编译器标志允许我使用goto
作为有效构造?如果没有,是否有支持goto
的第三方java编译器?如果没有,是否还有其他支持goto
的语言,同时可以轻松调用用Java编写的方法?
原因是我正在制作一种用Java实现的语言。 Gotos是我语言的重要组成部分;我希望能够将其编译为本机或JVM字节码,尽管它必须能够轻松使用Java库(即.C支持goto
,但要使用它我必须在C中重写库)。
我想生成C或Java等源文件,而不是字节码或机器码。我正在使用第三方编译器来做到这一点。
答案 0 :(得分:9)
答案 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.9的The Java Language Specification。)
因此,至少在Java编程语言中,无法启用goto
。
但是,如前所述,Java虚拟机中的goto
opcode是可用的,并且在Java编译器从源生成字节码时使用。
答案 6 :(得分:0)
Java不允许使用goto
关键字。但是,它允许使用标签并使用带标签的break
或continue
代替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