2009-06-14 12 views
5

¿Hay un indicador de compilador de Java que me permita usar goto como una construcción válida? Si no, ¿hay compiladores de Java que sean compatibles con goto? Si no es así, ¿hay otros idiomas que admitan goto mientras que al mismo tiempo pueden llamar fácilmente a los métodos escritos en Java?¿Compiladores Java o lenguajes JVM que soportan goto?

La razón es que estoy haciendo un lenguaje que se implementa en Java. Gotos son una parte importante de mi lenguaje; Quiero poder compilarlo en bytecode nativo o JVM, aunque tiene que poder usar bibliotecas de Java (es decir, C admite goto, pero para usarlo tendría que volver a escribir las bibliotecas en C).

Quiero generar archivos fuente C o Java, etc., y no bytecode o código de máquina. Estoy usando un compilador de terceros para hacer eso.

+2

Plan B: descargue el OpenJDK y corte el compilador de Java para admitir goto. :-P –

Respuesta

9

Soporte de JVM en el nivel de bytecode. Si está haciendo su propio idioma, debe utilizar bibliotecas como BCEL o ASM, sin generar el archivo .java.

5

El bytecode de JVM contiene una instrucción goto (por ejemplo, consulte la documentación BCEL).

No se olvide que el propio Java soporta el concepto de saltar a las etiquetas, usando:

break {labelname} 

o

continue {labelname} 

ver este JDC tech tip para obtener más información. Si su idioma está compilado en código de byte JVM, entonces puede hacer uso de esto.

+0

sintaxis sin los paréntesis: break nombre de etiqueta; –

+0

Sí. Estaba poniendo {nombre de etiqueta} para indicar que alguna etiqueta debe insertarse allí. Tal vez no muy claro, lo aprecio. –

2

Por definición, ningún compilador de Java permite goto. Los compiladores de Java deben implementar el JLS, y el JLS no permite los gotos. Sin embargo, también es claramente posible compilar un lenguaje con gotos para la JVM. AMPC es un compilador C-to-JVM que afirma que es compatible con C89.

También tenga en cuenta que Java bytecode tiene una instrucción goto, aunque obviamente está basada en instrucciones y no en línea.

2

Puede escribir su generador de código para apuntar Jasmin. Puedes usar goto en Jasmin tanto como quieras. :-)

+0

Targeting Jasmin es equivalente a segmentar ASM/BCEL (como en la respuesta de J-16), entonces meh. :-P –

1

La palabra clave goto está reservada pero no se usa en el lenguaje de programación Java. (De Section 3.9 de The Java Language Specification.)

Por lo tanto, al menos en el lenguaje de programación Java, no hay forma de habilitar el uso de goto.

Sin embargo, como ya se indicó, el goto opcode en la máquina virtual Java es funcional y se usa cuando el compilador Java produce bytecode desde la fuente.

Chapter 7: Compiling for the Java Virtual Machine de The Java Virtual Machine Specification pueden ser de interés cuando se implementa un lenguaje JVM.

2

Casi todo lo que puede hacer con goto lo puede hacer con un ciclo. goto es realmente una forma redundante y generalmente desacreditada de programar. EN MI HUMILDE OPINIÓN.

Si desea Goto hacia atrás

LABEL: do { 
// code before goto 

// goto LABEL 
continue LABEL; 

// code after goto 
break; 
} while(true); 

Si desea Goto hacia delante

LABEL: do { 
// code before goto 

// goto LABEL 
continue LABEL; 

// code after goto 
break; 
} while(false); 
// Label is effectively here 
// code after LABEL. 
0

Java no permite usar la palabra clave goto. Sin embargo, permite el uso de etiquetas y el uso de break o continue con etiqueta en lugar de goto. En realidad, Java no es un lenguaje sin declaración goto, sino un lenguaje con una implementación incómoda.

Cuestiones relacionadas