2009-06-14 10 views
5

Gibt es ein Java-Compiler-Flag, mit dem ich goto als gültiges Konstrukt verwenden kann? Wenn nicht, gibt es Java-Compiler von Drittanbietern, die goto unterstützen? Wenn nicht, gibt es noch andere Sprachen, die goto unterstützen, während Sie gleichzeitig Methoden aufrufen können, die in Java geschrieben sind?Java-Compiler oder JVM-Sprachen, die goto unterstützen?

Der Grund ist, ich mache eine Sprache, die in Java implementiert ist. Gotos sind ein wichtiger Teil meiner Sprache; Ich möchte in der Lage sein, es zu nativem oder JVM bytecode zu kompilieren, obwohl es in der Lage sein muss, Java-Bibliotheken einfach zu verwenden (dh C unterstützt goto, aber um es zu verwenden, müsste ich die Bibliotheken in C neu schreiben).

Ich möchte C oder Java usw. Quelldateien und nicht Bytecode oder Maschinencode generieren. Ich verwende einen Compiler von Drittanbietern, um das zu tun.

+2

Plan B: Laden Sie das OpenJDK herunter und hacken Sie den Java-Compiler darin, um goto zu unterstützen. :-P –

Antwort

9

JVM-Unterstützung goto auf Bytecode-Ebene. Wenn Sie Ihre eigene Sprache verwenden, sollten Sie Bibliotheken wie BCEL oder ASM verwenden, die keine .java-Datei generieren.

5

Der JVM-Bytecode enthält eine goto-Anweisung (siehe z. B. die Dokumentation BCEL).

Vergessen Sie nicht, dass Java selbst das Konzept Springen auf Etiketten unterstützt, mit:

break {labelname} 

oder

continue {labelname} 

dieses JDC tech tip für weitere Informationen anzeigen. Wenn Ihre Sprache in JVM-Bytecode kompiliert wird, können Sie möglicherweise davon Gebrauch machen.

+0

Syntax ist ohne die Klammern: break labelname; –

+0

Ja. Ich habe {labelname} gesetzt, um anzugeben, dass dort ein Label eingefügt werden soll. Vielleicht nicht sehr klar, schätze ich. –

2

Per Definition erlaubt kein Java-Compiler goto. Java-Compiler müssen die JLS implementieren, und die JLS erlaubt keine gotos. Es ist jedoch auch eindeutig möglich, eine Sprache mit gotos zur JVM zu kompilieren. AMPC ist ein C-to-JVM-Compiler, der C89 unterstützen soll.

Beachten Sie auch, dass der Java-Bytecode einen goto-Befehl hat, obwohl er offensichtlich auf Anweisungen basiert, nicht auf Zeilen basiert.

2

Sie können Ihren Code-Generator auf das Ziel Jasmin schreiben. Sie können Goto in Jasmin so oft benutzen wie Sie möchten. :-)

+0

Targeting Jasmin entspricht ungefähr dem Targeting von ASM/BCEL (wie in J-16s Antwort), also meh. :-P –

1

Das Schlüsselwort goto ist reserviert, wird aber in der Programmiersprache Java nicht verwendet. (Von Section 3.9 von The Java Language Specification.)

daher zumindest in der Programmiersprache Java, gibt es keine Möglichkeit, die Verwendung von goto zu ermöglichen.

Wie bereits erwähnt, ist die goto opcode in der Java Virtual Machine jedoch funktionsfähig und wird verwendet, wenn der Java-Compiler Bytecode von der Quelle erzeugt.

Chapter 7: Compiling for the Java Virtual Machine von The Java Virtual Machine Specification kann bei der Implementierung einer JVM-Sprache von Interesse sein.

2

So ziemlich alles, was Sie tun können, können Sie mit einer Schleife tun. goto ist wirklich redundant und generell diskreditiert. MEINER BESCHEIDENEN MEINUNG NACH.

Wenn Sie goto wollen rückwärts

LABEL: do { 
// code before goto 

// goto LABEL 
continue LABEL; 

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

Wenn Sie goto wollen vorwärts

LABEL: do { 
// code before goto 

// goto LABEL 
continue LABEL; 

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

Java erlaubt nicht die Verwendung von goto Schlüsselwort. Es ermöglicht jedoch die Verwendung von Etiketten und die Verwendung von break oder continue mit Etikett anstelle von goto. In Fakten ist Java keine Sprache ohne eine Anweisung, sondern eine Sprache mit einer unangenehmen Umsetzung.