2012-07-11 5 views
11

저는 제 자신의 장난감 프로그래밍 언어를 연구하고 있습니다. 지금은 AST에서 소스 언어를 해석 중이며 바이트 코드로 컴파일 할 때 어떤 이점이 있는지 궁금해하며이를 해석하면 나에게 도움이 될 수 있습니다. 배열에서 지침을 실행하는 것보다 속도가 느려질 수 있습니다 시간의 구문 트리 수백 순회바이트 코드로 컴파일하는 동기는 무엇입니까?

  • 특히 배열 지원 O (1) 랜덤 액세스의 경우 (예 : 들어

    지금 나는 3 마음에 일이있다. 10 개의 명령을 위아래로 움직이면서).

  • 입력 된 실행 환경에서 내 대서 문자를 입력했기 때문에 실행 시간이 얼마 남았고 끊임없이 탐색하고 있습니다 (예 : 10 가지 유형의 노드가 있으며 지금 어떤 형식인지 확인해야합니다. 실행). 형식이 지정되지 않은 바이트 코드로 컴파일하면 형식을 검사하고 컴파일 한 후에 유형이 지정되지 않은 값과 코드가 있기 때문에이를 향상시키는 데 도움이 될 수 있습니다.
  • 바이트 코드로 컴파일하면 더 나은 이식성을 제공 할 수 있습니다.

요점은 올바른가요? 바이트 코드로 컴파일하는 다른 동기는 무엇입니까?

+0

해석자에서 실행하면 코드의 이식성이 향상됩니다. – Luis

+0

@ 루이스 (Luis, 예, 내 마음에 이미 있습니다.) 추가하는 것을 잊었습니다. – sinan

+0

@Luis : 그건 가짜입니다. 직렬화 된 AST는 동등하게 이식 가능합니다. 실제로 바이트 코드는 이식 가능하지 않을 수 있습니다. 파이썬 바이트 코드는 각 버전의 인터프리터에 따라 다릅니다. –

답변

5

속도가 주된 이유입니다. AST 해석은 실제로 너무 느립니다.

바이트 코드를 사용하는 또 다른 이유는 간단히 직렬화 (디스크에 저장)하여 배포 할 수 있다는 것입니다. 이것은 Java가하는 것입니다.

+0

흠, 그래서 기본적으로 이것입니다. 다른 흥미로운 동기를 찾고 싶었습니다. – sinan

+0

"이것은 자바가하는 일입니다." 파이썬 않는거야? –

6

바이트 코드 (또는 스레드 코드와 같은 다른 "쉽게 해석되는"형식)를 생성하는 지점은 본질적으로 성능입니다.

다음 작업을 결정할 때 AST 인터프리터가 트리를 탐색하고 노드를 검사하고 노드 유형을 결정하고 피연산자 유형을 확인하고 적법성을 확인하고 AST- 지정된 연산자가 적용됩니다 ("+"가 표시되지만 16 비트 추가 또는 문자열 연결을 의미합니까?).

최종 행동을 취하고 쉽게 해석되는 구조를 생성하는 경우 "실행"시간에 통역사는 모든 검사/특수 사례 결정없이 작업 수행에만 집중할 수 있습니다.

또 다른 최근 변명은 잘 알려진 가상 머신 (JVM, MSIL, 앵무새 등) 중 하나에 대해 바이트 코드를 생성하면 인터프리터를 코딩 할 필요조차 없다는 것입니다. JVM과 MSIL의 경우에는 JIT 컴파일러와 관련된 JIT 컴파일러의 이점을 누리고 Java와 C#의 진정한 매력 인 언어의 신중한 설계, 거대한 라이브러리와의 호환성을 통해 얻을 수 있습니다.

관련 문제