명령 줄에서 다음과 같이 실행하면 실제로 어떻게됩니까?'.scala'프로그램을 실행할 때 실제로 Scala 런타임/REPL 뒤에 발생하는 문제는 무엇입니까?
> scala hello.scala
hello.class가 생성되어 실행되었지만 삭제 되었습니까? 아니면 스칼라가 어떻게 든이 통역사처럼 행동합니까? 물론 자바에 대해서도 똑같이 할 수 없다고 생각하고 있습니다.
> java hello.java
명령 줄에서 다음과 같이 실행하면 실제로 어떻게됩니까?'.scala'프로그램을 실행할 때 실제로 Scala 런타임/REPL 뒤에 발생하는 문제는 무엇입니까?
> scala hello.scala
hello.class가 생성되어 실행되었지만 삭제 되었습니까? 아니면 스칼라가 어떻게 든이 통역사처럼 행동합니까? 물론 자바에 대해서도 똑같이 할 수 없다고 생각하고 있습니다.
> java hello.java
예, 생성 된 hello.class가 있습니다. scala -Xprint:parser hello.scala foo bar
당신이 코드를 다시 작성되는 방식을 볼 수 있습니다 : 당신이 -Xprint:parser
옵션을 실행하는 경우 컴파일러는 그 다음 Main.main
을 실행 컴파일하는 Main
객체의 내부
println(args.mkString)
println(argv.mkString)
의 주어진 hello.scala를 코드를 바꿈됩니다
package <empty> {
object Main extends scala.ScalaObject {
def <init>() = {
super.<init>();
()
};
def main(argv: Array[String]): scala.Unit = {
val args = argv;
{
final class $anon extends scala.AnyRef {
def <init>() = {
super.<init>();
()
};
println(args.mkString);
println(argv.mkString)
};
new $anon()
}
}
}
}
이 코드는 컴파일 된 것입니다. (메모리 파일 시스템을 믿습니다.하지만 확실하지 않습니다.) 실행되었습니다. ScriptRunner
을 보면 임시 폴더가 기본 임시 폴더 아래에 만들어져있는 것을 볼 수 있습니다. 예를 들어, 내 시스템을 보면, 나는 %TEMP%/scalascript*
폴더들을 볼 수있다.
인터프리터에서도 코드가 해석되지 않습니다. 자세한 내용은 Scala: Is there a default class if no class is defined?을 참조하십시오 (실제로 재 작성되고 컴파일 및 평가됩니다).
컴파일러는 어떻게 'val args = argv'를 만드나요? println (arguments.mkString)을 입력하면 어떻게 될까요? 'val arguments = argv'가 있을까요? –
@PeterSchmitz,'args' 및'argv'는 하드 코딩되어 있습니다. https://github.com/scala/scala/blob/master/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala를 참조하십시오. # L358과 388 번 줄.이 이름들은 C ('argv')와 Java 프로그래밍 ('args')의 단순한 관례입니다. 'println (arguments.mkString)'을 입력하면'arguments'가 정의되지 않았기 때문에 컴파일러 오류가 발생합니다. – huynhjl
고마워, 그걸 몰랐어. 나는 조금 놀랐지 만! 내가 "하드 코딩 된"것을 배웠다면 일반적으로 잘되지는 않을 것이다. –