파이썬 인터프리터
컴퓨터는 0과 1로만 된 코드만 이해합니다. 인간이 0과 1만을 사용해서 코드를 짜기 어렵습니다. 이를 위해 사람들은 프로그래밍 언어를 개발했습니다. 이 프로그래밍 언어 중 하나가 파이썬입니다. 이 파이썬은 코드 자체를 머신 코드로 통역해줍니다.
파이썬 언어로 쓴 문법을 머신 코드로 통역해주면 됩니다. 저희가 파이썬을 사용하는 경우 파이썬 인터프리터를 사용하는 것입니다.
- 파이썬 언어와 인터프리터를 각각, 그리고 합쳐서 그냥 파이썬이라고 부릅니다.
- 중요한 건 머신 코드로 바꿔주는 인터프리터가 중요합니다.
- 아무 문서 편집 도구에서도 파이썬 코드는 쓸 수 있습니다.
파이썬은 코드가 두 줄이 있으면, 위에서 한 줄 씩 머신 코드를 해석하고 실행하고, 그 다음 머신 코드를 해석하고 실행합니다. 이를 파일의 끝까지 반복합니다. 이게 인터프리터의 원리입니다.
파이썬 인터프리터의 내부 동작
사실 파이썬 인터프리터는 코드를 바로 머신 코드로 바꾸지 않습니다.
- 먼저 전체 코드를 bytecode라는 머신 코드와는 다른 중간 단계의 코드로 바꿉니다. 이를 "컴파일"이라고 합니다.
- 이렇게 바뀐 코드는 파일 이름 뒤에 .pyc 라는 확장자 명이 붙습니다. 그리고 pycache라는 폴더에 저장됩니다.
- 이 때 문법 확인 등 단순 검사를 통과하지 못한다면, 오류가 나게 되고 bytecode를 만들지 않습니다.
- 그 다음 인터프리터 안에 있는 파이썬 가상 머신(PVM : Python Virtual Machine)이라는 하위 프로그램이 bytecode를 한줄 씩 보며, 머신 코드로 다시 바꿉니다. 한 줄을 바꿀 때마다 바로바로 실행합니다.
- byte 코드는 이렇습니다.
1 0 LOAD_NAME 0 (print)
2 LOAD_CONST 0 ('Hello World')
4 CALL_FUNCTION 1
6 POP_TOP
8 LOAD_CONST 1 (None)
10 RETURN_VALUE
- 가장 위 왼쪽 1은 파일에서 코드 내용이 몇 번째 줄인지를 나타냅니다. 지금 같은 경우 파일에 한 줄밖에 없기 때문에 다른 내용 없이 1만 나와있습니다.
- 그 다음 숫자 열은 각 명령이 차지하는 바이트 주소를 의미합니다. 파이썬 3.6 이후로는 각 명령은 2byte기 때문에 2씩 차이가 나기 때문에 2의 배수로 커지는데요. 다른 버전들에서는 다르게 출력될 수 있습니다.
- 그 다음 열은 명령 이름들입니다. 각 명령은 파이썬 가상 머신이 이해할 수 있는 특정 일을 시키는데요. "어떤" 일을 하는지를 나타냅니다.
- 그 다음 두 열들은 명령들에 넘겨지는 아규먼트들에 대한 정보입니다. 쉽게 설명드리면 두 번째 줄에 LOAD_CONST 이라는 명령을 수행할 때, 어떤 내용에 대해서 해당 명령을 처리할 건지를 읽기 쉽게 표현해놓은 거죠. 지금 같은 경우 문자열 'Hello World' 을 사용해서 명령을 실행하라고 알려주고 있는 거죠.
파이썬 인터프리터는 먼저 이 중간 단계 코드인 bytecode를 만든 후, 인터프리터 안에 있는 파이썬 가상 머신을 사용해서 bytecode의 내용을 한 줄 씩 머신 코드로 바꾸면서 바로 실행시킵니다. 특정 코드 전체를 한 번에 다 머신 코드로 바꾸고, 전부를 바꾼 파일을 컴퓨터에게 실행시키는 번역(translate)의 개념이 아니라, 중간 단계의 bytecode 코드를 한 줄씩 바꾸고 실행시키는 통역(interpret)의 개념이기 때문에 이걸 해주는 프로그램을 파이썬 인터프리터라고 부릅니다.
컴파일러 vs 인터프리터 언어
프로그래밍 언어는 알다시피, 컴파일러 언어와 인터프리터 언어로 분류합니다. 파이썬은 인터프리터 언어입니다.
컴파일러 언어들은 코드를 바로 컴퓨터가 이해할 수 있는 머신코드로 '번역'합니다. 코드 전체를 다른 언어로 바꾸는 걸 '컴파일'이라고 합니다. 그리고 이렇게 컴파일된 코드를 미리 만들어놓으면 이것만 사용해서 프로그램을 돌릴 수 있습니다. 가장 대표적인 컴파일러 언어는 C, C++입니다.
인터프리터 언어들은 컴퓨터가 바로 이해할 수 있는 실행 코드를 만드는게 아닙니다. 중간 매개체, 인터프리터를 사용해서 코드를 통역하고, 파이썬에서는 파이썬 가상 머신이 이 역할을 합니다. 파이썬의 경우에는 컴파일러/인터프리터의 특징을 어느정도 갖고 있습니다. 파이썬은 코드를 먼저 bytecode로 컴파일 합니다. 하지만 이 파일은 머신 코드가 아니기 때문에, 이 중간단계의 bytecode를 파이썬 가상머신이 통역해서 실행합니다. 두 단계지만 직접 실행할 때는 한 단계처럼 느껴집니다.
컴파일러 언어들은 컴파일 하는 단계와 컴파일 된 파일을 따로 실행시키는 단계, 두개로 나눠져있고, 인터프리터 언어들은 보통 한단계로 코드를 실행할 수 있습니다.
일반적으로는 컴파일러 언어로 작성한 코드들이 더 빠르게 실행이 됩니다. 컴파일러 언어들은 이미 컴퓨터가 바로 이해할 수 있는 실행파일을 만들어주기 때문입니다. 비유를 하자면 영어로 된 글을 한글로 바꿔서 읽을 때, 이미 한글로 번역된 글을 읽는 거랑, 영어로된 글을 한줄 씩 통역해가며 읽는 거랑 글을 읽는 속도가 차이날 수 밖에 없는 것과 같습니다.
프로그래밍 언어를 항상 컴파일러나 인터프리터 언어로 항상 나눠야 되거나 엄청 명확하게 나눠지는 건 아닙니다. 하지만 굳이 나눌 때는 코드를 실행시킬 때, 이미 머신 코드로 컴파일된 파일을 그대로 사용/실행 할 수 있으면 컴파일러 언어, 실행시키는 와중에 줄 단위로 한 번 더 머신 코드로 바꿔야 하면 인터프리터 언어라고 하죠.
'개발환경 세팅 > 파이썬 환경 For Mac' 카테고리의 다른 글
[파이썬 환경 FOR MAC] 6. 컴퓨터가 파이썬 인터프리터를 찾는 법 (0) | 2023.12.03 |
---|---|
[파이썬 환경 FOR MAC] 5. 파이썬 버전 (0) | 2023.12.03 |
[파이썬 환경 FOR MAC] 3. 파이썬 인터렉티브 모드 (0) | 2023.12.03 |
[파이썬 환경 FOR MAC] 2. 파이썬 파일을 실행하는 법 (0) | 2023.12.03 |
[파이썬 환경 FOR MAC] 1. 환경이란? (0) | 2023.12.03 |