2009-06-14 2 views
5

goto을 유효한 구성으로 사용할 수있는 Java 컴파일러 플래그가 있습니까? 그렇지 않은 경우 goto을 지원하는 타사 Java 컴파일러가 있습니까? 그렇지 않은 경우 goto을 지원하는 다른 언어가 있습니까? 동시에 Java로 작성된 메서드를 쉽게 호출 할 수 있습니까?goto를 지원하는 Java 컴파일러 또는 JVM 언어?

이유는 Java로 구현 된 언어를 만들고 있기 때문입니다. Gotos는 제 언어의 중요한 부분입니다. 그것은 자바 라이브러리 (즉, C는 goto을 지원하지만 쉽게 C에서 라이브러리를 다시 작성해야 겠어)를 사용할 수 있어야하지만 네이티브 또는 JVM 바이트 코드로 컴파일 할 수 있기를 원합니다.

나는 C 또는 Java 등의 소스 파일을 생성하고, 바이트 코드 또는 기계 코드가 아닙니다 싶다. 나는 그렇게하기 위해 서드 파티 컴파일러를 사용하고있다.

+2

Plan B : OpenJDK를 다운로드하고 goto를 지원하기 위해 Java 컴파일러를 해킹합니다. : -P –

답변

9

바이트 코드 수준에서 JVM을 지원합니다. 자신의 언어를 사용하는 경우 .java 파일을 생성하지 않고 BCEL 또는 ASM과 같은 라이브러리를 사용해야합니다.

5

JVM은 바이트 코드는 고토 명령어를 포함 (예를 들어 BCEL 설명서 참조).

break {labelname} 

또는

continue {labelname} 

더 많은 정보를 원하시면이 JDC tech tip를 참조하십시오

자바 자체 사용, 라벨에 점프의 개념을 지원한다는 것을 잊지 마십시오. 귀하의 언어가 JVM 바이트 코드로 컴파일 된 경우, 이것을 사용할 수 있습니다.

+0

구문은 대괄호가 없습니다. break labelname; –

+0

예. {labelname}을 넣어 레이블을 삽입해야 함을 나타냅니다. 아마도 명확하지 않을 수도 있습니다. –

2

정의에 따르면 Java 컴파일러는 goto를 허용하지 않습니다. Java 컴파일러는 JLS을 구현해야하며 JLS는 gotos를 허용하지 않습니다. 그러나, JVM을 사용하여 언어를 컴파일하는 것도 가능합니다. AMPC은 C89를 지원한다고 주장하는 C-to-JVM 컴파일러 중 하나입니다.

는 또한 분명히 명령 기반의 라인을 기반으로하지 비록 자바 바이트 코드는, 고토 명령을 가지고 있습니다.

2

코드 생성기를 Jasmin 대상에 쓸 수 있습니다. 당신은 자스민에서 goto를 원하는만큼 사용할 수 있습니다. :-)

+0

Jasmin 타겟팅은 ASM/BCEL 타겟팅 (J-16 답변과 동일)과 거의 같습니다. :-P –

1

goto 키워드는 예약 있지만, Java 프로그램 언어의 사용되지 않습니다. (Section 3.9 : The Java Language Specification)

따라서 적어도 Java 프로그래밍 언어에서는 goto을 사용할 수있는 방법이 없습니다.

그러나 이미 Java 가상 머신의 goto opcode는 기능적으로 유의 한 자바 컴파일러는 소스에서 바이트 코드를 생성 할 때 사용된다. JVM이 언어를 구현할 때 The Java Virtual Machine Specification에서

Chapter 7: Compiling for the Java Virtual Machine이 관심이있을 수 있습니다.

2

goto로 할 수있는 일은 거의 루프로 수행 할 수 있습니다. 고토는 실제로 중복되고 일반적으로 프로그램에 대한 믿지 않는 방법입니다. IMHO.

당신이 전달 고토에

LABEL: do { 
// code before goto 

// goto LABEL 
continue LABEL; 

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

을 원하는 경우에 당신은 고토 뒤로

LABEL: do { 
// code before goto 

// goto LABEL 
continue LABEL; 

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

하려는 경우 ;-)해야한다, 지금까지 사용 고토, 그것의 악한하지

더 진지하게, 아마도 당신은 E. Dijkstra의 유명한 기사를보실 수 있습니다 : http://www.u.arizona.edu/~rubinson/copyright_violations/Go_To_Considered_Harmful.html

+1

포스터는 이미 이것을 알고있을 것입니다. –

0

자바에서는 goto 키워드를 사용할 수 없습니다. 그러나 레이블을 사용하고 대신 레이블이있는 break 또는 continue을 사용할 수 있습니다. 사실, Java는 goto 문이없는 언어가 아니라 불편한 언어 구현 언어입니다.