파이썬은 인터프리터 언어일까? - 테크톡 발표

파이썬은 인터프리터 언어일까?

각자 관심있는 주제를 조사하여 간단히 발표하는 테크톡에서, 나는 평소에 명확히 이해되지 않았던 인터프리터 언어라는 개념에 대해 발표했다.

개요

  1. 컴파일이란?
  2. 인터프리터란?
  3. 가상머신과 바이트코드
  4. 파이썬은 무엇인가?
  5. 결론 및 참고자료

컴파일이란?

컴파일 설명자료
  • ‘컴파일러’나 ‘컴파일 언어’를 말할 때의 컴파일은 소스코드(사람이 읽고 이해하는 프로그래밍 언어)를 기계어(CPU 인스트럭션이라 불리는 네이티브 코드, 바이너리 코드로 이루어진 언어)로 바꾸는 것을 말하지만, 넓은 의미에서는 하나의 프로그래밍 언어를 다른 언어의 형태로 바꾸는 것을 모두 컴파일이라고 한다.
  • 컴파일 언어는 실행 이전에 컴파일러에 의해 기계어 코드로 변환되는 명시적인 단계를 거치는 언어로, C나 C++가 대표적이다.
  • 코드가 컴파일 과정을 거치면 결과물로 실행파일이 생성된다.
    • 더 정확히 말하면 컴파일을 거치면 목적파일이 생성되고, 목적파일은 링킹이라는 또다른 처리과정을 거쳐야 실행파일이 된다고 하는데 일단은 이렇게 알아두자.
  • 이 실행파일은 기계가 바로 직접 실행하므로 속도가 어마어마하게 빠르게 돌아간다.
  • 하지만 OS나 CPU에 맞추어 생성된 프로그램은 다른 OS에서 실행할 수 없다.
    • 예컨대 윈도우에서 만든 프로그램은 리눅스에서 실행할 수 없기 때문에 또다른 컴파일과 링킹 과정을 거쳐야 하는데 변경에 따르는 그 밖의 문제들 때문에 이 과정이 수월하지만은 않다.

인터프리터란?

인터프리터 설명자료
  • 인터프리터는 코드를 실행할 때 별도의 컴파일 작업을 거치기보다는, 한 줄씩 기계어로 변환한 뒤 해당 명령어를 즉각 실행한다.
  • 이 의미에 부합하는 프로그래밍 언어는 명령프롬프트인 cmd.exe나 bash와 같은 쉘이라고 한다. (쉘은 beyond my understanding이라 패스)
  • 하지만 자바스크립트도, 파이썬도 분명 인터프리터 언어라고 배웠는데, 어떻게 된 일일까?

Virtual Machine과 Byte Code

가상머신 바이트코드 설명자료
  • 하지만 소스코드에서 기계어로 변환되는 것이 위의 두가지만 있는 것은 아니다. 제3의 방법이 바로 바이트코드를 가상머신을 통해 실행시키는 것이다.
  • 바이트코드(Byte Code): 소스코드와 기계어 사이 중간단계의 언어로, 가상머신이 이해하는 코드이다.
  • 가상머신(Virtual Machine): 프로세서를 모방한 소프트웨어로, 각각의 운영체제에 맞게 설치하기만 하면 바이트코드로 된 명령어를 실행하게끔 프로그래밍 되어있기 때문에 플랫폼에 종속되지 않고 동일한 결과를 생산한다.
  • Java나 C#, Python 등은 이 방법을 통해 실행된다고 하는데, 그렇다면 파이썬은 인터프리터 언어가 아닌 것인가? 과연 무엇이라고 정의해야 할까?

파이썬은 언어가 아니다?!

파이썬 설명자료
  • 물론 파이썬은 프로그래밍 언어다. 하지만 지금껏 내가 ‘실행’해왔던 파이썬이라는 것은, 그 언어를 실행하는 구현체이다.
    • 생각해보면 언어를 그냥 쓰면 되는 거지 다운받아서 사용한다는 것 자체가 이상하긴 했다.
  • 파이썬 공식 홈페이지에서 다운받은 것은 프로그래밍 언어로써의 파이썬이 아닌, 표준 파이썬 구현체인 CPython이라는 프로그램이다.
  • CPython은 파이썬 파일을 실행시킬 때, 바이트코드로의 변환을 거친 파일을 생성한 후 해당 파일을 실행한다.
    • 기계어로의 컴파일은 아니지만, 실행 이전에 바이트코드로의 컴파일 작업이 일어나는 것이다.
    • CPython이 만들어낸 바이트코드 파일은 pycache라는 폴더에 .pyc라는 확장자명으로 저장된다. (이는 Python3 기준이며, Python2에서는 py파일이 있는 경로에 pyc파일이 바로 저장됨)

그러면 파이썬은 뭐라고 정의해야 할까?

파이썬 추가설명자료
  • 파이썬은 REPL(Read-Eval-Print Loop)으로 한 줄씩 입력을 취하고 결과를 반환하는, 즉 인터랙티브 쉘의 형태로 실행할 수 있고 종종 그렇게 실행한다.
  • 표준 파이썬 구현체인 CPython이라는 인터프리터는 소스코드를 바이트코드로 컴파일한 후 실행한다. 그러므로 명시적인 컴파일 작업을 개발자가 하느냐를 기준으로 한다면, 표준 파이썬 구현체로 실행하는 파이썬은 인터프리터에 의해 컴파일 및 실행되니까, 인터프리터 언어라고 분류할 수 있다.
  • 그러나 Cython이나 Nuitka라는 프로젝트 등에서는 파이썬을 C언어 소스로 바꾼 후 C컴파일러를 사용하여 완전한 기계어 실행파일을 생성하기도 한다. 그러면 파이썬은 컴파일되는 언어라고 정의해야 하는 것인가?
  • 이는 언어를 한 개의 구현방식으로 정의하려고 하기 때문에 생기는 혼란이다. 파이썬을 비롯한 모든 프로그래밍 언어는 구현되는 형태를 절대적인 속성으로 갖지는 않는다.

결론

결론 발표자료
  • 컴파일이나 인터프리터는 언어의 속성이 아니라 구현되는 형태를 지칭하며, 마찬가지로 컴파일러(Compiler)와 인터프리터(Interpreter)는 소스코드를 기계어로 변환하는 프로그램이지, 언어 그 자체가 아니다.
  • 우리가 설치하여 ‘실행’하는 파이썬은 프로그래밍 언어가 아니라 인터프리터, 가상머신, 바이트코드로의 컴파일러 역할을 하는 표준 파이썬 구현체인 CPython을 말한다.

느낀 점

  • 남들은 이미 다 그 이면의 뜻까지 다 알고 통상적으로 쓰는 명칭인데 내가 감히 지적질을 하는 건 아닌가, 심지어 내가 이해한 바가 맞는 것인가 떨리는 발표였지만 나 같이 언어와 구현체의 차이를 몰라 대혼란파티 속에 있는 사람들에게 조금이라도 도움이 되었으면 좋겠다.
  • 파이썬 뿐 아니라 프로그래밍 언어와 실행과정까지도 알 수 있었던 좋은 시간이었고, 파이콘 강연을 비롯한 훌륭한 자료들이 널려 있다는 점이 참 감사했다.
  • 한국어로 컴파일 언어, 인터프리터 언어라고 하면 혼란을 가중시킬 수 있으니 영어에서 수동태로 표현하듯 컴파일 되는 언어(Complied Language)와 인터프리터에 의해 구현되는 언어(Interpreted Language)라고 해야 나처럼 혼란을 겪지 않을 것 같다.

참고자료