支持goto的Java编译器或JVM语言?
是否有一个java编译器标志允许我使用goto
作为有效的构造? 如果没有,是否有支持goto
的第三方java编译器? 如果没有,是否有任何其他支持goto
语言,同时可以轻松调用用Java编写的方法?
原因是我正在制作一种用Java实现的语言。 Gotos是我语言的重要组成部分; 我希望能够将其编译为本机或JVM字节码,尽管它必须能够轻松使用Java库(即.C支持goto
,但要使用它我必须在C中重写库)。
我想生成C或Java等源文件,而不是字节码或机器代码。 我正在使用第三方编译器来做到这一点。
JVM支持转到字节码级别。 如果您使用自己的语言,则应使用BCEL或ASM等库,而不是生成.java文件。
JVM字节码包含goto指令(例如,参见BCEL文档)。
不要忘记Java本身支持跳转到标签的概念,使用:
break {labelname}
要么
continue {labelname}
有关详细信息,请参阅此JDC技术提示 。 如果您的语言编译为JVM字节码,那么您可以使用它。
根据定义,没有Java编译器允许goto。 Java编译器必须实现JLS ,而JLS不允许使用。 但是,显然可以将带有gotos的语言编译到JVM。 AMPC是一个声称支持C89的C-to-JVM编译器。
还要注意Java字节码有一个goto指令,虽然它显然是基于指令而不是基于行的。
您可以编写代码生成器来定位Jasmin 。 您可以根据需要在Jasmin中使用goto。 🙂
几乎任何你可以用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.
goto
关键字保留但在Java编程语言中未使用。 (摘自Java语言规范的 第3.9节 。)
因此,至少在Java编程语言中,没有办法启用goto
。
但是,如前所述,Java虚拟机中的goto
操作码是可用的,并在Java编译器从源生成字节码时使用。
第7章:在实现JVM语言时,可能会对Java虚拟机规范中 的Java虚拟机进行编译 。
Apache Thrift可用于从单一来源生成不同编程语言的源代码。 http://incubator.apache.org/thrift/
Java不允许使用goto
关键字。 但是,它允许使用标签并使用break
或continue
使用标签而不是goto
。 事实上,Java不是没有goto语句的语言,而是一种令人不舒服的语言。
你不应该使用goto,因为它是EVIL 😉
更严重的是,也许你可以看看E. Dijkstra的着名文章: http : //www.u.arizona.edu/~rubinson/copyright_violations/Go_To_Considered_Harmful.html