해피 코딩!

컴파일러와 인터프리터 언어 본문

Python

컴파일러와 인터프리터 언어

지속가능한 성장을 2021. 5. 16. 03:44

참고자료

  • 컴퓨터사이언스 부트캠프 with 파이썬 11장 - 프로그래밍 언어

학습 동기

python 개발자가 되며 언어에 대한 추가적인 이해를 돕기 위해 학습합니다.
5, 6월 달에는 추가적으로 effective python의 내용을 블로그에 정리하며
추가적인 지식을 습득 및 공유하고자 합니다.

파이썬에서는 compile() 이란 함수가 있어 문자열을 컴파일 할 수 있습니다.

컴파일러 언어와 인터프리터 언어는 컴파일 타임이 있느냐 없느냐 즉, 소스 코드를 분석하는 시점과 입력 데이터를 받는 시점이 언제이냐에 따라 나뉩니다.

컴파일러 언어인 C와 인터프리터 언어인 python를 통해 비교해보며 차이점을 알게 되었습니다.

C 언어 : 컴파일러 언어

소스 코드를 컴파일하여 목적코드인 기계어로 인스트럭션을 만들어낸다.
링커는 필요한 라이브러리를 가져오고 여러개의 목적 파일을 함께 묶어 실행 파일을 생성한다. 이제 프로그램을 실행하고 데이터르 ㄹ입력하면 데이터가 출력됩니다.

중요한점은 소스코드를 분석하는 컴파일 타임과 실제 데이터를 입력받아 결과를 출력하는 런타임이 분리되었다는 점 입니다.

파이썬 : 인터프리터 언어 분석

파이썬도 소스 코드가 있으므로 이를 분석하는 컴파일러가 있습니다.
목적코드로 기계어를 생성하는 c 언어와 달리 파이썬은 바이트코드를 생성하빈다.

바이트코드가 생성된 후에는 PVM 에서 바이트코드를 하나씩 해석하여 프로그램을 실행합니다. 이러한 이유로 PVM(python virtual machine 을 파이썬 인터프리터라고 부르기도 합니다.

중요한점은 소스코드를 분석하는 컴파일 타임이 따로 없고, 실행과 동시에 분석을 실행한다는 점 입니다. 즉, 소스코드와 입력 데이터가 같은 시점에 삽입됩니다. 컴파일러 언어와 비교하였을 때 가장 큰 차이점 입니다.

파이썬 : 소스 코드부터 실행까지

해당 내용은 학과에서 컴파일러 강의를 통해 학습을 하였었지만 아직까지도, 개발에 어떻게 적용을 해야 할지 이해가 부족한 내용입니다. 이후, 추가적인 지식이 생긴다면 추가하겠습니다. 내용에 대한 설명이 부족한점 양해 부탁드립니다.

일반적인 컴파일러는 렉서파서로 구분됩니다. 소스코드가 렉서와 파서에 의해 어떻게 변하는지 정리합니다.

문자 -> 렉서 ->토큰->파서 분석트리

렉서로 입력되는 것은 소스코드이며, 소스코드도 결국 문자에 불과합니다.
이 문자들이 렉서를 거치면서 여러 개의 토큰으로 변경됩니다.

토큰은 문장을 종류별로 쪼갠다음 종류와 문자를 함께 나타낸 것을 토큰이라 합니다.

파서는 토큰을 분석하여 분석트리를 구성합니다. 컴파일러마다 분석 트리를 생성하기도 하고 생성하지 않기도 합니다. 분석트리가 만들어지면 이를 이용해 목적 코드는 기계어, 파이썬은 바이트코드를 생성합니다. 이를 코드 생성이라 합니다.

파이썬은 파이썬 컴파일러를 통해 다음과 같은 과정을 거쳐 바이트 코드를 생성합니다.

  1. 소스 코드 -> 분석 트리
  2. 분석 트리 -> 추상 구문 트리
  3. 심벌 테이블 생성
  4. 추상 구문 트리 -> 바이트 코드

정리 후기

이전에 정리하였던 내용들과 달리 학과에서 4학년 때 배웠던 컴파일러 강의 부분이 등장하였으며 그때도 개발에 어떻게 적용해야 할지 감이 잘 오지 않았는데 해당 내용을 정리하면서도 똑같은 느낌이었습니다.

정리한 내용을 블로그에 올릴 까 고민하였지만, 추 후 추가적인 내용을 공부한 후 보완하자는 마음으로 글을 올립니다.

Comments