컴퓨터 공학

👉 [CS] Python 은 정말로 인터프리터 언어일까?

bitcodic 2023. 4. 13. 03:14

뜬금 없이 궁금해진 Python 동작 방식에 대해 알아보던 중...

 

"파이썬 컴파일 과정에서, 실제로 기계어로 바로 번역되는 단계는 없다. 대신, 최종적으로 실행되는 것은 바이트코드(bytecode)이며, 이는 미리 컴파일된 파이썬 모듈(.pyc 파일)에 저장된다. 이렇게 저장된 바이트코드는 나중에 같은 모듈이 다시 로드될 때 재사용된다. 따라서, 같은 모듈이 두 번째로 로드될 때는 컴파일 과정을 거치지 않고 바이트코드를 즉시 실행한다."

 

파이썬은 Byte-code 형태 파일로 컴파일 된다고 이해하였다. 그렇다면 파이썬을 과연 인터프리터 언어라고 봐도 되는건가? Byte-code로 컴파일 되는데? 라는 의문이 생겼다. 기계어로 번역되어야만 컴파일 언어라고 표현하지 않으니 말이다. 분명 대학 새내기 시절을 생각해보면 인터프리터 언어라고 배웠다. 순진하게도.. 그냥 그렇게 알고 있었다.

 

하지만 과거와 달리 이제는 세상 모든 만물에 의심을 하는 의심병이 생겼기 때문에 직접 알아봤다.

 

우선 인터프리터 언어의 반대라고 표현되는 컴파일 언어의 정의를 살펴보자. (위키피디아 출처. 그나마 공신력 있다)

 

Compiled language?

A compiled language is a programming language whose implementations are typically compilers (translators that generate machine code from source code), and not interpreters (step-by-step executors of source code, where no pre-runtime translation takes place).

The term is somewhat vague. In principle, any language can be implemented with a compiler or with an interpreter. A combination of both solutions is also common: a compiler can translate the source code into some intermediate form (often called p-code or bytecode), which is then passed to an interpreter which executes it.

 

두번째 문단에서도 내가 우려한 부분을 일컫고 있다. "원론적으로 어떤 언어든지 컴파일러나 인터프리터에 의해 구현될 수 있다(=In principle, any language can be implemented with a compiler or with an interpreter)" 라고 표현한다.

 

오우. 그럼 어쩌란말인가. 실행 되기 전에는 컴파일 언어인지 아닌지 알 수 없는 슈뢰딩거의 고양이 같은 건가?

 

(1) 첫번째 문단에서 실마리를 조금 찾을 수 있다. "whose implementations are typically compilers"

대게 컴파일러에 의해 구현되는 녀석들을 일컫는다고 한다. 

 

(2) 아래 링크의 내용도 덧붙여서 생각해보자.

(https://stackoverflow.com/questions/6889747/is-python-interpreted-or-compiled-or-both)

"First off, interpreted/compiled is not a property of the language but a property of the implementation."

interpreted/compiled 자체가 사실상 언어적인 특성이 아니라, 구현 과정에 초점을 맞춘 개념이라고 보아야 한다는 것이다.

 

(3) 우리가 흔히 사용하는 Python 구현체인 CPython이 아니라, Cython을 사용하게 될 경우 기계어로 된 실행 파일도 얻을 수 있다.

그렇다는 말은 즉, Python 이라는 언어는 사실 interpreted/compiled 둘다 혼용될 수 있는 Hybrid한 성격을 갖고 있다고 볼 수 있다.

 

...

 

컴파일 언어는 대게 컴파일러로 구현되는 녀석들이며, 사실 interpreted/compiled 자체가 언어의 특성이라고 표기하는게 부적절하며, Python을 기계어로 번역할 수 있는 Cython 구현체의 존재까지 생각할 수 있다는 것이다.

 

이걸 이해한 채로 아래 내용을 보자.

 

파이썬 공식 문서에 따르면 다음과 같이 정의되어 있다.

Python is an interpreted, object-oriented, high-level programming language with dynamic semantics.

여기선 interprted language라는 표기를 사용한다. interpreter language 가 아니라.

 

 즉 '인터프리터 언어이다' or '컴파일 언어이다' 라는 능동형의 표현 자체가 오류를 부를 수 있는 표현법이라는 것이다. 원문 그대로 컴파일 되는 언어(Complied Language) 혹은 인터프리터에 의해 구현되는 언어(Interpreted Language) 와 같이 표기하는 것이 더 적절하지 않을까 싶다. 

 

 그런 관점에 있어서 공식 문서에서 파이썬을 interpreted 라고 표기했으니, 정확히는 Typically Interpreted Language(=인터프리터에 의해 구현되는 언어)라고 보는 것이 적절하다고 생각한다. 인터프리터 언어라는 접근 자체가 언어의 특성으로 이해되기 딱 좋은 말이기 때문에... 언어가 대게 어떤 방식으로 interpreted/compiled 중 구현되는지가 더 중요한 것이다.

 

하지만 늘 저렇게 부르는 건 매우 어려울 것이다. 그렇기 때문에 단순히 우리가 "인터프리터 언어야!" 형태로 이야기 하다보니,생길 수 있는 접근과 표현법의 오류라고 생각한다. 그렇기에 더욱 외국어를 한국어로 표기하는게 참 어려워지는 것 같다.

 

 

결론

편의상 부를때는 인터프리터 언어야 라고 사회적으로 합의 되었으니 그렇게 부르지만, an interpreted lanugage 라고 이해는 하자.