Компиляторы Java или языки JVM, которые поддерживают goto? - PullRequest
5 голосов
/ 14 июня 2009

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

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

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

Ответы [ 9 ]

9 голосов
/ 14 июня 2009

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

5 голосов
/ 14 июня 2009

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

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

break {labelname}

или

continue {labelname}

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

2 голосов
/ 14 июня 2009

Практически все, что вы можете сделать с помощью 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.
2 голосов
/ 14 июня 2009

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

2 голосов
/ 14 июня 2009

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

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

1 голос
/ 14 июня 2009

Ключевое слово goto зарезервировано, но не используется в языке программирования Java. (С Раздел 3.9 из Спецификация языка Java .)

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

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

Глава 7. Компиляция для виртуальной машины Java из Спецификация виртуальной машины Java может представлять интерес при реализации языка JVM.

0 голосов
/ 03 апреля 2010

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

0 голосов
/ 03 апреля 2010

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

0 голосов
/ 14 июня 2009

Вы никогда не должны использовать goto, так как это ЗЛО; -)

Если серьезно, возможно, вы могли бы взглянуть на знаменитую статью Э. Дейкстры: http://www.u.arizona.edu/~rubinson/copyright_violations/Go_To_Considered_Harmful.html

...