2016-07-19 5 views
0

Nashorn은 즉시 JVM 바이트 코드로 컴파일된다는 것을 알고 있습니다. 그러나 Nashorn은 String을 사용하여 eval 함수를 만날 때 무엇을합니까? 문자열 내용을 컴파일하거나 해석합니까?Nashorn Javascript는 "eval"문장을 컴파일합니까?

function sayHi() { 
    console.log("hi world"); 
} 

for (var i=0;i<10;i++) { 
    eval("sayHi()"); // what happens here? 
} 

몇 가지 옵션이 될 수있다 : 예를 들어

1)은 다음 캐시, 평가 후면 2) 번을 컴파일 내에서 문자열을 컴파일하지 않고는 같은 바이트 코드를 재사용 위의 루프에서와 같이 동일한 문자열을 발견하면 3) 매번 eval String의 내용을 다시 컴파일합니다.

물론이 예제는 eval 문자열의 내용 그냥 메서드 호출이지만 그것은 더 복잡한 JS 코드 문자열로 전달되는 상상 int 평가.

+0

하드 코드 된 문자열에'eval()'을 사용하는 것은 거의 요지가 없습니다. 일반적으로'eval()'이 권장되는 것은 아니지만 사용하려고한다면 일반적으로 동적으로 생성 된 문자열을 전달해야합니다 컴파일 타임에 알려지지 않은 값으로 – nnnnnn

+0

자, eval에 대한 문자열이 동적이라고 가정 해 봅시다. 그런 다음 먼저 JIT를 임시 클래스로 컴파일 한 다음 즉시 클래스를 언로드합니다. 아니면, Rhino 해석 모드와 비슷한 방식으로 해석됩니까? 또는 다른 옵션? – adamM

답변

1

Nashorn은 항상 javascript를 바이트 코드로 컴파일하여 실행합니다. JS에 대한 통역사는 없습니다. 예, 컴파일 /로드 된 클래스는 실제 객체에서 도달 할 수없는 경우 언로드됩니다.

+0

그래서 위의 예제에서 루프 내에서 eval이 호출 될 때마다 eval에 과거에 동일한 문자열이 있어도 새로운 다시 컴파일/언로드 클래스가 있습니까? – adamM

+0

아니요, 동일한 코드에 대해 캐시 적중이 발생합니다. 다시 컴파일되지 않습니다. 살아있는 캐시를 사용할 수 있는지 여부에 따라 컴파일이 방지됩니다. 그러나 코드가 다시 실행됩니다. –

+0

그래서 eval (String)에서 재 컴파일을 피하기 위해 String.equals와 비교하여 특정 문자열이 이미 컴파일되었는지 확인합니다. 전문가의 도움에 감사드립니다. – adamM