2009-06-14 4 views
5

Есть ли флаг java-компилятора, который позволяет мне использовать goto как действительную конструкцию? Если нет, есть ли сторонние java-компиляторы, поддерживающие goto? Если нет, существуют ли какие-либо другие языки, поддерживающие goto, и в то же время можно легко вызвать методы, написанные на Java?Компиляторы Java или языки JVM, поддерживающие goto?

Причина в том, что я делаю язык, реализованный на Java. Готы - важная часть моего языка; Я хочу, чтобы иметь возможность компилировать его на родной или JVM байт-код, хотя он должен иметь возможность легко использовать библиотеки Java (то есть C поддерживает goto, но для его использования мне пришлось бы переписывать библиотеки на C).

Я хочу сгенерировать исходные файлы C или Java и т. Д., А не байт-код или машинный код. Для этого я использую сторонний компилятор.

+2

План B: Скачать OpenJDK и взломать компилятор Java в нем для поддержки goto. :-P –

ответ

9

Поддержка JVM goto на уровне байт-кода. Если вы делаете свой собственный язык, вы должны использовать библиотеки, такие как BCEL или ASM, не генерируя файл .java.

5

Байт-код JVM содержит инструкцию goto (например, см. Документацию BCEL).

Не забывайте, что сам Java поддерживает концепцию вскакивая на этикетках, используя:

break {labelname} 

или

continue {labelname} 

Посмотреть этот JDC tech tip для получения дополнительной информации. Если ваш язык компилируется в байт-код JVM, вы можете использовать это.

+0

синтаксис без скобок: break имя ярлыка; –

+0

Да. Я помещал {labelname}, чтобы указать, что какая-то метка должна быть вставлена ​​туда. Возможно, не очень понятно, я ценю. –

2

По определению, никакой компилятор Java не допускает goto. Компиляторы Java должны реализовывать JLS, а JLS не допускает gotos. Однако также возможно скомпилировать язык с gotos для JVM. AMPC - один компилятор C-to-JVM, который утверждает, что поддерживает C89.

Также обратите внимание, что Java-байт-код имеет инструкцию goto, хотя он явно основан на инструкциях, а не на основе строк.

2

Вы можете написать свой генератор кода для таргетинга Jasmin. Вы можете использовать goto в Jasmin столько, сколько хотите. :-)

+0

Ориентация на Jasmin примерно эквивалентна таргетированию на ASM/BCEL (как в ответе J-16), поэтому meh. :-P –

1

Ключевое слово goto зарезервировано, но не используется на языке программирования Java. (От Section 3.9 от The Java Language Specification.)

Поэтому, по крайней мере, на языке программирования Java нет возможности включить использование goto.

Однако, как уже отмечалось, goto opcode на виртуальной машине Java является функциональным и используется, когда компилятор Java создает байт-код из источника.

Chapter 7: Compiling for the Java Virtual Machine от The Java Virtual Machine Specification может представлять интерес при внедрении языка JVM.

2

Практически все, что вы можете сделать с 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. 
0

Java не позволяет использовать ключевое слово goto. Однако он позволяет использовать метки и использовать break или continue с меткой вместо goto. В действительности, Java не является языком без оператора goto, а языком с неудобной его реализацией.

0

Apache Thrift может использоваться для генерации исходного кода на разных языках программирования из одного источника. http://incubator.apache.org/thrift/

Смежные вопросы