컴파일 된 언어가 의미를 해석하는 언어가 반드시 의미하지 않는 방식으로 의미를 제한하기 때문에 구별이 매우 의미가 있습니다. 일부 해석 기술은 컴파일하기가 매우 어렵습니다 (실제로는 불가능합니다).
해석 된 코드는 런타임시 코드 생성과 같은 작업을 수행하고 해당 코드에 기존 범위의 어휘 바인딩에 대한 가시성을 제공 할 수 있습니다. 하나의 예입니다. 또 다른 방법은 인터프리터가 코드를 평가하는 방법을 제어 할 수있는 해석 된 코드로 확장 될 수 있다는 것입니다. 이것은 고대 Lisp "fexprs"의 기초입니다. 평가되지 않은 인수로 호출되고 함수로 무엇을할지 결정하는 함수 (코드를 걷고 변수를 평가하는 데 필요한 환경에 대한 전체 액세스 권한을 가짐) 컴파일 된 언어에서는 실제로이 기술을 사용할 수 없습니다. 대신 매크로를 사용합니다. 컴파일 할 때 평가되지 않은 인수로 호출되는 함수이며 해석하는 대신 코드를 변환합니다.
일부 언어 구현은 이러한 기술을 중심으로 구축되었습니다. 그들의 저자는 컴파일을 중요한 목표로 삼는 것을 거부하고 오히려 이런 종류의 유연성을 받아들입니다.
해석은 항상 컴파일러를 부트 스트랩하는 기술로 유용합니다. 구체적인 예는 CLISP (Common Lisp의 일반적인 구현)를 살펴보십시오. CLISP에는 자체적으로 작성된 컴파일러가 있습니다. CLISP를 빌드하면 초기 빌드 단계에서 해당 컴파일러가 해석됩니다. 자체 컴파일에 사용되며 일단 컴파일되면 컴파일 된 컴파일러를 사용하여 컴파일이 수행됩니다.
인터프리터 커널이 없으면 SBCL처럼 기존 Lisp로 부트 스트랩해야합니다.
해석을 통해 어셈블리 언어부터 시작하여 절대적으로 처음부터 언어를 개발할 수 있습니다. 기본 I / O 및 핵심 루틴을 개발 한 후 여전히 기계 언어의 평가를 작성하십시오. 평가가 끝나면 고급 언어로 작성하십시오. 머신 코드 커널이 평가를 수행합니다. 이 기능을 사용하면 더 많은 루틴을 사용하여 라이브러리를 확장하고 컴파일러도 작성할 수 있습니다. 컴파일러를 사용하여 해당 루틴과 컴파일러 자체를 컴파일하십시오.
해석 : 편집으로 이어지는 길에서 중요한 디딤돌입니다!