1. 인터프리터(Interperter)
- Interperter : "통역사"라는 의미를 가지고 있음.
- 인터프리터는 한 줄씩 바로바로 읽고 통역을 해서 실행을 해준다는 의미를 가지고 있음.
- 쉽게말해, 프로그램이 실행이 되면 실시간으로 한 줄씩 해석해서 실행을 한다는 말임.
- 상상이 안갈테니, 바로 이해하기 쉽게 실행 과정으로 알려주겠음.
2. 파이썬 프로그램 실행 과정
(1) 소스코드 작성
- .py 확장자를 가지는 소스코드를 의미함.
(2) 소스코드 실행
- 내부적인 명령어 python test.py -> test.py 파이썬 코드 실행
(3) 파이썬 인터프리터 실행
- 파이썬 인터프리터안에는 컴파일러와 인터프리터 2개가 내장이 되어있음.
(4) 컴파일러 실행 - 바이트코드 변환
- 컴파일 단계에선 모든 소스코드를 읽어 구문 분석, 코드 변환(바이트코드) 를 수행한다.
- 소스코드 -> 바이트코드(.pyc)로 변환
- 이때 만들어지는, 바이트코드에는 인터프리터가 한 줄씩 해석하기 좋게 바이트코드를 만들어 놓는다.
(5) 인터프리터 실행 - 바이트코드를 운영체제가 읽을 수 있는 기계어로 변환
- 컴파일이 된 바이트코드를 실행하는 역할을 하며, 기계어로 변환을 해준다.
- 인터프리터로써, 한 줄씩 해석하며 기계어로 변환해서 운영체제로 넘겨주면, 운영체제가 코드를 실행함.
- 운영체제는 메모리에 변수나, 객체 등의 공간을 할당함.
- 사실상 바이트코드에는 논리적으로 이미 코드가 한줄씩 읽도록 편하게 정리가 되어있음.
- 즉, 한 줄씩 실행되는 게 아니라, 코드의 논리적인 흐름을 바탕으로 순차적으로 처리되는 중간 코드가 바이트 코드인 셈이다.
- 논리적으로 실행 가능한 짧은 단위로 잘라 놓았는데, 그것이 한 줄로 표현이 된 것이다.
- 이런식으로 바이트코드 논리적 단위 -> 인터프리터 기계어 변환 -> 운영체제 실행 ( 반복을 함 )
3. 파이썬 인터프리터 함수와 클래스 읽기
- 그렇다면, 인터프리터는 함수와 클래스를 어떻게 읽을까?
(1) 함수
add(1, 2) # 오류
def add(a, b):
print(a + b)
add(1, 2) # 정상 실행
- 예시 코드와 같이 함수가 존재하고, 함수를 호출한다고 가정할 때 위의 add() 호출 라인은 오류가 날 것이다.
- 그 이유는, 인터프리터는 위에서 아래로 읽기 때문에 위의 add() 호출을 하려고 해도 메모리에 def 함수가 정의되어있지 않기때문
- 즉, 인터프리터는 위에서 아래로 읽는 과정에서 함수를 선언한 부분을 만나게 되면, 해당 함수를 메모리에 저장을 하게 된다.
- 그러다 함수 호출 부분을 만나면 기억한 함수를 호출해 코드블록을 실행하는 원리이다.
- 클래스 또한 마찬가지이다.
(2) import
# test5.py
import test4
test4.add(1, 2)
# import test4 -> 에러남
# test4.py
def add(a, b):
print(a + b)
- 이렇게 import를 맨 위에 선언하는 이유도 인터프리터의 동작 원리 때문인 것이다.
- 인터프리터의 의해 해당 import 라인이 읽히게 되면, 파일(모듈)의 내용을 메모리에 로드하고 다음 코드를 실행한다.
- 그렇기 때문에 import 라인이 맨위에 있는 것이다. ( 참고로 아래에 두고 해당 함수 호출 시 오류 )
4. 정리
- 정리를 하면, 파이썬에서 인터프리터는 하나의 파이썬 언어로 만들어진 코드를 실행하기 위한 프로그램임.
- 파이썬 인터프리터에는 "컴파일러", "인터프리터" 두 가지가 들어가 있음. 즉, 파이썬은 두 가지를 동시에 이용을 함.
- 즉, 다른 언어와 다르게 파이썬은 실행 시, 인터프리터 한 곳에서 컴파일 인터프리터 두 가지 작업을 수행하며 실행됨.
- 자바를 예로 들면, 자바는 컴파일 시 .class 파일을 직접 가지고 있다가 해당 파일을 JVM에 넘겨 실행하는 방식임.
- 차이를 보면, 파이썬은 .pyc 파일을 직접 가지고 있지 않고 바로 실행을 시키는 느낌이라 보면될듯.
- 인터프리터 자체의 개념을 이해하기 보다는, 직접 언어를 이용해 흐름을 보면 생각보다 매우 쉬운 개념임.
'⚡Python' 카테고리의 다른 글
[Python] 10강 - 객체지향 (1) | 2025.04.18 |
---|---|
[Python] 9강 - 함수 (0) | 2025.04.17 |
[Python] 7강 - 반복 구조 (0) | 2025.04.17 |
[Python] 6강 - 선택 구조 (0) | 2025.04.16 |
[Python] 5강 - 순차 구조 및 제어 구조 (0) | 2025.04.15 |