2011-10-04 3 views

답변

22

예, 생성 된 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?을 참조하십시오 (실제로 재 작성되고 컴파일 및 평가됩니다).

+0

컴파일러는 어떻게 'val args = argv'를 만드나요? println (arguments.mkString)을 입력하면 어떻게 될까요? 'val arguments = argv'가 있을까요? –

+0

@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

+0

고마워, 그걸 몰랐어. 나는 조금 놀랐지 만! 내가 "하드 코딩 된"것을 배웠다면 일반적으로 잘되지는 않을 것이다. –