문제

Haskell에서는 다음과 같은 작업을 수행할 수 있습니다.

#!/usr/bin/runghc
main=putStrLn "Hello World"

그러면 나는 그것을 실행할 수 있습니다 ./hello.hs

내 질문은 왜 첫 번째 줄이 무시됩니까?하스켈의 주석은 다음으로 시작합니다. -- 하지만 첫 번째 줄은 여전히 ​​무시되는 것 같습니다.ghci에서도 로드됩니다.이 트릭은 Python 및 Perl에서도 작동합니다.

하지만 Java에서 비슷한 작업을 수행하면 다음과 같습니다.

#!/usr/local/jdk1.6.0_13/bin/javac
...

Javac에서 컴파일러 오류가 발생했습니다.

그러면 이것이 어떻게 작동하며 Java에서 작동하게 하려면 어떻게 해야 합니까?

감사해요.

도움이 되었습니까?

해결책

#!라 불려진다 "오두막"이며 스크립트를 실행하는 Unix 방식입니다.OS에 파일 실행을 요청하면 이 파일이 일반 .exe 파일이 아니라는 사실을 알게 되며 #!처음에는 #이후에 OS가 명령을 실행하도록 지시하는 매직 마커 역할을합니다!이 파일이 해당 명령의 인수가 되도록 해당 명령을 연결합니다.

myfile.py에 다음이 포함된 경우

#!/usr/bin/python

해당 파일을 실행하는 것은 실행하는 것과 크게 다르지 않습니다.

$ /usr/bin/python myfile.py

내 하스켈 지식이 부족합니다.그러나 귀하의 특정한 경우에 Runghc 명령은 단순히 첫 번째 줄을 읽는 것 같습니다. 해당 #에 주어진 주장을 구문 분석합니다!행, 파일의 나머지 부분을 임시 파일에 쓰고 해당 임시 파일에서 ghc를 실행합니다(첫 번째 선취권이 제거됩니다. 자세한 내용은 ghc 소스의 runghc.hs를 참조하세요.)

javac로 동일한 작업을 수행하려면 runghc와 동일한 접근 방식을 사용할 수 있습니다.파일의 첫 번째 줄을 먹고 파일의 나머지 부분을 임시 파일에 쓰고 해당 파일에서 javac를 실행하는 래퍼를 작성합니다.

다른 팁

파일이 hello.hs이고 첫 번째 줄이 "#!/usr/bin/runghc"이면 쉘이 실행됩니다.

/usr/bin/runghc hello.hs

첫 번째 줄은 기본적으로 스크립트를 실행하는 데 사용할 항목을 쉘에 알려줍니다.

Java 예제의 경우 첫 번째 줄은 실행 파일이어야 합니다. 달린다 대본은 그게 아니고 컴파일 스크립트.

내 질문은 왜 첫 번째 줄이 무시됩니까?하스켈의 주석은 --로 시작하지만 첫 번째 줄은 여전히 ​​무시되는 것 같습니다.ghci에서도 로드됩니다.이 트릭은 Python 및 Perl에서도 작동합니다.

'트릭'은 Python과 Perl에서 작동합니다. # 해당 언어로 주석을 시작하므로 통역사는 해당 줄을 주석으로 보고 무시합니다.그러므로 그들에게는 그것이 특별한 것이 아닙니다.

하스켈에서는 # 주석을 시작하지 않으므로 일반적으로 작동하지 않습니다.그러나 GHC(메모리가 제공되는 경우 다른 구현도 가능)는 shebang 라인에 대한 특별한 경우를 가지고 있습니다.파일의 첫 번째 줄이 다음으로 시작하는 경우 #!, 주석으로 처리됩니다.언어 사양과의 이러한 차이는 다음과 같이 정확하게 통합되었습니다.

$ chmod +x hello.hs
$ ./hello.hs

일하다.그것은 작동하지 않습니다 javac shebang 라인에는 특별한 케이스가 내장되어 있지 않기 때문입니다.

shebang은 해석된 언어에서만 작동합니다....일반적으로 대부분의 경우 오류가 발생하는 컴파일러에는 아무 의미가 없습니다.

이것이 작동하는 이유는 Python, Perl 및 분명히 Haskell이 모두 해석 언어이기 때문입니다.이는 스크립트를 실행할 인터프리터를 지정하는 표준 Unix 방식입니다.Java는 컴파일된 언어이므로 인터프리터로 실행할 수 없습니다.

Javac은 인터프리터가 아니라 컴파일러입니다.

'마법'을 일으키는 원인이라고 생각되는 대화형 모드가 부족합니다.동일한 기능이 없기 때문에 GCC에서는 동일하게 작동하지 않습니다.

예를 들어 dmd(D 컴파일러)는 이러한 종류의 대화형 편집(#!/usr/bin/dmd -run)이 있는 해석을 지원하는 컴파일러의 예입니다.

스크립트를 해석하기 위한 컴퓨터의 실행 파일 위치입니다.Java는 컴파일된 언어이므로 이러한 명령문이 필요하지 않습니다.

또한 요점은 그것이 특별한 주석이라는 것입니다. #은 합법적인 주석 표시가 아니기 때문에 Java에서의 구성은 합법적이지 않습니다.그런 구조가 의미가 있다면 ...그건 그렇지 않아...그것은 다음과 같을 것이다:

//!/usr/local/jdk1.6.0_13/bin/javac

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top