문제

좋아, 나는 내 오래된 CS 노트를 가져 와서 컴파일러 이론을 조금 더 살펴볼 것이라고 생각했다. 나는이 모든 것이 어떻게 작동하는지 기억할 수 없다고 말해야하지만 대학 시절의 멋진 샘플 응용 프로그램이 몇 가지를 이해하는 데 도움이됩니다.

이 샘플 응용 프로그램은 언어를 작성하여 언어와 같은 중간 어셈블리 코드로 컴파일합니다. 그런 다음이 중간 언어를 취하고 진술을 실행하는 간단한 VM 구현이 있습니다.

내가 머리를 잡을 수없는 것은, 이것이 내가 똑바로 해석자라면 컴파일러가 아니라면 여전히 이러한 중간 명령을 메모리에 구축 할 것이라는 것입니다. 아니면 통역사가 실제로 한 번에 코드 청크의 Descreet 섹션을 "실행"합니까?

도움이 되었습니까?

해결책

파서는 컴파일하지 않습니다. 실제로 프로그램을 번역 할 때 (C ++와 같은 높은 수준의 언어에서 기계 코드로) 관련된 단계가 실제로 있습니다. 한 번 이동 또는 입력을 여러 번 통과 한 후에 실행되는 경우 디자인에 따라 다릅니다. 질문을 좀 더 구체적으로 만들 수 있습니까? 한편, 당신은 그것을 싫어하지만,보세요 여기 - 특히 프론트 엔드 및 백엔드 섹션.

다른 팁

그것은 언어에 따라 다릅니다. 대부분의 현대 해석 된 언어 (Perl, Python 및 Ruby)는 소스 코드를 일부 중개 형식으로 소환하여 끝에 실행할 수 있습니다 (소환).

나는 입력의 구문 분석 토큰에 직접 행동하는 통역사와 함께 글을 쓰거나 일했으며, 이는 파서가 구축 한 AST (Abstract-Syntax 트리)에 직접 작용하며 AST를 효율적인 실행을 위해 설계된 양식으로 변환합니다. 그래서 대답은 때에 따라 다르지.

  • 대상 기계에 8K의 RAM이 있으면 직접 패시어 통역사가 합리적인 선택이 될 것입니다 (생각).
  • 통역사를 사용하여 프로그래밍 언어의 구조와 의미론에 대해 가르치거나 배우는 경우 AST를 구축하고 해석하는 것이 좋습니다.
  • 휴대 성을 위해 통역사를 사용하고 빠른 실행을 원하는 경우 레지스터 기반 가상 머신으로 컴파일하는 것이 좋습니다. (David Gregg와 다른 사람들은 등록 기반 VM에 해석 적 간접비가 적다는 것을 보여주었습니다. 루아 Java VM과 같은 스택 기반 VM보다 VM.)

대부분의 현대 통역사는 나중에 해석되는 중간 코드로 프로그램을 구문 분석합니다. 일부는이 중간 코드를 명시 적으로 저장합니다 (예 : Python 's .pyc). 예를 들어 쉘 스크립트는 직접 해석 한 다음 중간 형식으로 구문 분석됩니다.

더 발전된 "통역사"는 실제로 해석하지 않지만 JIT (JUST-IN-TIME) 컴파일 (예 : Java 또는 .NET)을 수행합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top