2009-06-14 4 views
5

C'è un flag compilatore java che mi permette di usare goto come costrutto valido? In caso contrario, ci sono dei compilatori java di terze parti che supportano goto? In caso contrario, esistono altri linguaggi che supportano lo goto e allo stesso tempo possono richiamare facilmente metodi scritti in Java?Compilatori Java o lingue JVM che supportano goto?

Il motivo è che sto creando un linguaggio implementato in Java. I Gotos sono una parte importante della mia lingua; Voglio essere in grado di compilarlo in bytecode nativo o JVM, sebbene debba essere in grado di usare facilmente le librerie Java (ad esempio C supporta goto, ma per utilizzarlo dovrei riscrivere le librerie in C).

Voglio generare file sorgente C o Java, ecc. E non codice bytecode o macchina. Sto usando un compilatore di terze parti per farlo.

+2

Piano B: scaricare OpenJDK e inserire il compilatore Java al suo interno per supportare goto. :-P –

risposta

9

JVM supporta goto a livello di codice byte. Se stai facendo la tua lingua, dovresti usare librerie come BCEL o ASM, non generare file .java.

5

Il codice byte JVM contiene un'istruzione goto (ad esempio, consultare la documentazione BCEL).

Non dimenticare che Java si sostiene il concetto di saltare alle etichette, utilizzando:

break {labelname} 

o

continue {labelname} 

Vai a questa JDC tech tip per maggiori informazioni. Se la tua lingua è compilata in bytecode JVM, potresti essere in grado di farne uso.

+0

la sintassi è senza parentesi: break labelname; –

+0

Sì. Stavo mettendo {labelname} per indicare che alcune etichette dovrebbero essere inserite lì. Forse non molto chiaro, lo apprezzo. –

2

Per definizione, nessun compilatore Java consente goto. I compilatori Java devono implementare lo JLS e il JLS non consente il gotos. Tuttavia, è anche chiaramente possibile compilare una lingua con gotos alla JVM. AMPC è un compilatore C-to-JVM che afferma di supportare C89.

Si noti inoltre che il bytecode Java ha un'istruzione goto, sebbene sia ovviamente basato sull'istruzione e non sulla linea.

2

È possibile scrivere il generatore di codici su target Jasmin. Puoi usare goto in Jasmin quanto vuoi. :-)

+0

Targeting Il targeting di Jasmin equivale al targeting ASM/BCEL (come nella risposta di J-16), quindi meh. :-P –

1

La parola chiave goto è riservata ma non utilizzata nel linguaggio di programmazione Java. (Da Section 3.9 di The Java Language Specification.)

Pertanto, almeno nel linguaggio di programmazione Java, non è possibile abilitare l'uso di goto.

Tuttavia, come già notato, lo goto opcode nella macchina virtuale Java è funzionale e viene utilizzato quando il compilatore Java genera codice bytecode dall'origine.

Chapter 7: Compiling for the Java Virtual Machine da The Java Virtual Machine Specification può essere di interesse quando si implementa una lingua JVM.

2

Praticamente qualsiasi cosa che puoi fare con goto puoi farlo con un ciclo. goto è un modo veramente ridondante e generalmente screditato per programmare. A PARER MIO.

Se si vuole goto all'indietro

LABEL: do { 
// code before goto 

// goto LABEL 
continue LABEL; 

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

Se si vuole goto avanti

LABEL: do { 
// code before goto 

// goto LABEL 
continue LABEL; 

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

Java non consente l'utilizzo della parola chiave goto. Tuttavia, consente di utilizzare etichette e utilizzare break o continue con etichetta anziché goto. In realtà, Java non è una lingua senza istruzione goto, ma una lingua con un'implementazione scomoda.