2013-07-11 2 views
3

Dart는 컴파일 된 언어 또는 해석 된 언어로 간주됩니까? JavaScript에 대해서도 동일한 질문이 적용됩니다.다트 대 자바 스크립트 - 컴파일 된 언어 또는 해석 된 언어입니까?

질문에 대한 이유 :

나는 다트의 창시자와 watching an interview 있었고, 7시 10분 라스 박에는 말했다 :

"하면 [...]에 JavaScript 프로그램인데 실제 프로그램을 실행하기 전에 실제로 JavaScript를 실행합니다 .Dart에서는 main의 첫 번째 명령이 실행되기 전에 아무 것도 실행하지 않습니다. "

다트가 해석 언어 인 반면 JavaScript는 컴파일 된 언어라고 말한 것 같습니다. 사실입니까?

Dart VM이 컴파일러가 아닌가?

답변

7

"해석 된"및 "컴파일 된"언어의 정의에 따라 다릅니다. 그리고 그때조차도 항상 구현에 의존합니다.

Lars가 의미하는 바는 JavaScript가 코드를 실행하여 클래스 구조 (및 기타 전역 상태)를 작성한다는 것입니다. Dart에서 전역 상태는 언어 구문에 의해 설명되므로 파싱 만 필요합니다 (심지어 대부분이 먼저 건너 뛸 수 있습니다). 결과적으로 다트 프로그램은 자바 스크립트 프로그램보다 "실제"코드를 빠르게 실행할 수 있습니다.

JavaScript로 컴파일 된 프로그램은 클래스를 작성하는 데 JavaScript 메커니즘을 사용해야하므로 분명히 Dart VM에만 적용됩니다.

편집 (자세한 내용) :

포획, 예를 들어, 다음과 같은 매우 간단한 클래스 A : 다트에서

: 자바 스크립트에서

class A { 
    final x; 
    A(this.x); 
    foo(y) => y + x; 
} 

:

function A(x) { this.x = x; } 
A.prototype.foo = function(y) { return y + this.x; } 

다트 VM이 시작되면 프로그램을 통해 시작됩니다. class 키워드를보고 클래스 이름 (A)을 읽고 클래스의 끝으로 건너 뛸 수 있습니다 (여는 중괄호와 닫는 중괄호를 계산하여 문자열에 없는지 확인). A이 실제로 인스턴스화 될 때까지 A의 내용을 고려하지 않습니다. 이제 실제로 클래스를 살펴보고 모든 멤버를 찾습니다.하지만 이 아니라면은 필요하기 전까지 메서드 내용을 읽습니다. 어쨌든 매우 빠른 처리 단계에서이 작업을 수행합니다.

자바 스크립트에서 일이 더 복잡해집니다 : 빠른 VM은 A (Dart가하는 것과 비슷합니다)의 실제 본문을 건너 뛸 수 있지만 A.prototype.foo = ...을 보면 프로토 타입 객체를 만드는 코드를 실행해야합니다.즉, 함수 객체 (A)를 할당하고 프로토 타입 속성을 찾아보고이 객체 (새 속성 추가)를 새 함수 객체로 변경해야합니다. 다른 말로하면 : 클래스가 있다는 것을보기 위해서라도 코드를 실행해야합니다.

+0

고마워요 @Florian Loitsch,하지만 당신이 "다트에서, 글로벌 상태는 언어 구문에 의해 기술되어 파싱 만 필요합니다"라는 의미를 설명해 주실 수 있습니까? 모든 언어가 구문 분석 할 필요는 없습니까? 네가 다시 설명해 주시면 감사하겠습니다. – Cheshie

+0

고마워요. @FlorianLoitsch – Cheshie

+0

'결과적으로 다트 프로그램은 JavaScript 프로그램보다 빠른 "실제"코드를 실행할 수 있습니다. DOM이로드 된 후에'main()'이 호출되기 때문에 이것은 브라우저에서 완전히 올바르지 않습니다. JS는 DOM이 준비되기 전에 실행될 수 있으므로 실제 애플리케이션에서는 JS가 더 빨리 실행될 수 있습니다. [출처] (http://stackoverflow.com/questions/8435519/how-to-tell-when-the-dom-is-ready-in-dart). 그러나 언어 측면에서 당신은 옳습니다. – tjameson

-1

다트는 자바 스크립트로 컴파일되며 자바 스크립트는 해석 된 언어입니다. 일반적으로 '컴파일 된'언어로 플랫폼 특정 기계 코드로 컴파일 된 언어를 이해하고 CPU에서 바로 실행하며 인터프리터를 실행할 필요가 없습니다. JS 나 Dart의 경우에는 해당되지 않습니다. 그래서 저는 JS와 다트가 모두 해석된다고 말할 것입니다.

+0

감사합니다. Wraychus,하지만 먼저 : 내가 이해 한 것에서 다트는 다트 VM에 의해 해석되거나 컴파일 될 수 있습니다. 그래서 제 질문은 : 다트 VM을 사용할 때 컴파일 또는 해석됩니까? 두 번째로, 두 언어가 모두 해석된다면, Lars Bak이 인용 한 문장은 나에게 의미가 없습니다. 다른 설명은 없습니까? – Cheshie

+0

다트 VM은 다트 소스 코드를 실행하므로 먼저 다트 코드를 바이트 코드로 컴파일 할 필요가 없습니다 (예를 들어 Java와 반대). –

+0

그래서 오래 전이었습니다. 현재 최소한 4 가지 기술이 존재합니다. 1. 해석 (원시 언어). 2. 바이너리 파일로 컴파일됩니다. 3. 실행 전에 컴파일 된 VM +에서 실행 된 바이트 코드 +로 번역됩니다. 4. 실행 전에 컴파일 된 VM +에서 실행되는 스크립트 +로 배포됩니다. 자바 스크립트와 다트는 4 번입니다. – mezoni

3

프로그래밍 언어로 사용되는 Dart는 해당 언어로 작성된 프로그램의 런타임 인 ​​virtual machine (VM)으로 표시 할 수 있습니다.

현재 virtual machine"just-in-time" (JIT) 런타임 환경 엔진으로 구현됩니다.

즉, not interpreted이지만 compiled 인 프로그램을 의미합니다. 그러나이 컴파일 과정 (source codemachine instructions으로 번역)은 알 수없는 기간 동안 stretched in time입니다.

이렇게하면 가상 컴퓨터가 defer performing certain operations indefinitely 또는 never performing them이됩니다.

매우 big and complex program이고 lot of classes 인 것으로 가정하면 may be never be은 프로그램 실행의 현재 short lifetime session에 사용됩니다.

JIT 컴파일 미사용 클래스를 모두 컴파일하지 않고 특수한 tokens으로 구문 분석하도록 허용합니다. 을 구성하기 위해이 토큰을 나중에 intermadiate language으로 변환하는 데 사용됩니다 (on demand).

이 프로세스는 transparent for user of program입니다. 프로그램의 올바른 작동에 필요한 소스 코드 만 (기계어로) 컴파일했습니다.

일부 소스 코드는 컴파일되지 않을 수 있습니다. save a lot of time.

결론 : 다트 언어는 가상 머신 다음 compiled to machine code로를 기본 상태로 사용하는 경우

.

+0

죄송합니다, @ mezoni, 전적으로 그것을 얻지 못했습니다 : 다트가 JIT를 사용하여 컴파일된다는 말입니까? 감사. – Cheshie

+0

다트 소스는'토큰'파일로 강제 변환 될 수 있습니다. 이 프로세스는'snapshot' 파일 생성을 호출합니다.스냅 샷은 바이트 코드 파일이 아니라 토큰을 구문 분석 한 것입니다. 이 스냅 샷은 VM에서 실행될 수 있습니다. 내부적으로 VM은 JIT 기술을 사용하여 소스 코드 또는 스냅 샷을 실행합니다. – mezoni

관련 문제