2011-12-28 8 views
3

는 Foo.java를 컴파일하려면 : javac의의 Foo.java왜 컴파일러에는 .java 접미사가 필요하지만 인터프리터에는 .class 접미사가 필요하지 않습니까?

프로그램을 실행하려면 : 자바 푸 컴파일러는 .java 접미사를 필요로하지만 통역 .class 접미사를 필요로하지 않는 이유는

?

+0

파일 이름이 아닙니다. 그것은'javac pkg/Foo.java'이지만'java pkg.Foo'입니다. 애플릿은 평소처럼 정신적으로 뭔가를합니다. –

답변

7

몇 가지 다른 답변으로 설명했듯이 Java 컴파일러는 파일 이름을 인수로 사용하지만 인터프리터는 클래스 이름을 사용합니다. 따라서 파일 이름의 일부이기 때문에 컴파일러에 .java 확장을 제공하지만 클래스 이름에 속하지 않으므로 인터프리터에 제공하지 않습니다.

그렇다면 왜 Java 인터프리터를 다르게 디자인하여 파일 이름을 사용하지 않았을까? 대답은 클래스가 항상 .class 파일에서로드되지 않는다는 것입니다. 때로 그들은 JAR 자료실에서 왔으며, 때로는 from the internet으로, 때로는 프로그램에 의해 즉시 작성됩니다. 클래스는 필요로하는 이진 데이터를 제공 할 수있는 모든 소스에서 올 수 있습니다 to define it. 아마도 같은 클래스가 서로 다른 소스에서 서로 다른 구현을 가질 수 있습니다. 예를 들어 프로그램은 URL에서 일부 클래스의 최신 버전을로드하려고 시도하지만 실패한 경우 로컬 파일로 폴백합니다. Java 설계자는 프로그램을 실행하려고 할 때 실행중인 클래스를 정의하는 소스를 추적해야하는 것에 대해 걱정할 필요가 없다고 생각했습니다. 당신은 단지 완전한 클래스 이름을주고 Java (또는 그보다는 ClassLoader)가 찾도록 노력합니다.

+0

설명이 잘되어 있습니다. – novice

5

Java 컴파일러는 파일 이름을 입력으로 사용하므로 Foo.java입니다.

Java 인터프리터는 완전한 클래스 이름을 사용하여 클래스 경로와 현재 디렉토리에서 해당 클래스를 검색합니다. java Foo.class를 사용하면 "Foo"패키지에서 "class"라는 클래스를 검색하고 클래스가 기본 패키지에있는 경우 NoClassDefFoundError를 반환합니다.

2

Foo.java is 파일 이름은 간단히 "Foo"는 클래스 이름 (파일 이름 아님)입니다. 기본 ClassLoader는 현재 작업 디렉토리에서 Foo.class 파일을 검색하여로드합니다.

0

모든 언어에는 유사한 당사자 간의 규칙과 이해를 확립하는 구문과 의미가 있습니다. 영어 단어, 시제, 동사 등이 영어를 사용하는 두 사람 사이의 의사 소통을 단순화하는 것과 같습니다. Java 스펙은 컴파일러가 Java 파일 만 이해할 수있는 구문 및 의미를 설정하고 해석기는 .class 파일 만 이해할 수 있습니다.

1

데이비드 Zaslavsky의 설명을 추가 :

자바 소스 코드 중 하나 .java 파일에서 필요하지 않습니다. API javax.tools.JavaCompiler에서와 같이 차이 문자 스트림에서 소스 코드를 사용하는 컴파일러를 사용할 수 있습니다.

cmd line util javac은 파일 소스에서만 작동하기 때문에 파일 경로가 필요합니다.

+0

공정한 지적이지만이 특정 디자인 결정을 설명하기 위해 Java 1을 다시 살펴 봐야합니다.0 FileObject 추상화가 존재하지 않았고, 소스 코드를 처리하는 유일한 방법은 파일에 넣는 것 (또는 처음부터 직접 컴파일러를 작성하는 것)이었습니다. 반대로,'ClassLoader'는 처음부터 주변에있었습니다. –

관련 문제