[python] 파이썬의 작동 원리

Shadis·2025년 9월 3일

python

목록 보기
9/13

프로그래밍 언어의 종류

https://velog.io/@ymail837/%EC%9D%BC%EB%B0%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%96%B8%EC%96%B4%EC%9D%98-%EC%A2%85%EB%A5%98

파이썬은 스크립트/인터프리터 언어

파이썬은 인터프리터를 조작해서 프로그램을 실행시키는 스크립트 언어이다. 대부분의 경우 C언어로 구현되어 있는 파이썬 인터프리터를 사용하는데 이렇게 C언어로 구현된 파이썬 구현체를 Cpython이라고 부른다. 우리가 python3 test.py 명령어를 수행하면 먼저 C언어로 구현된 파이썬 인터프리터가 실행된다. 파이썬 인터프리터는 C언어로 이루어진 C언어 프로그램이기 때문에 C언어 프로그램의 메모리 구조를 가지고 있다.

https://velog.io/@ymail837/CC-C%EC%96%B8%EC%96%B4-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0

그렇다면 파이썬 코드에서 정의한 객체는 어디에 저장되는 것일까? 파이썬 코드에서 정의한 객체는 인터프리터 프로세스의 heap 영역에 동적으로 메모리가 할당되어서 저장된다. heap 영역에 저장된 객체 사이의 참조, scope 관리 등은 뒤에서 설명할 namespace에서 논리적으로 처리한다.

파이썬 인터프리터의 PVM은 파이썬 바이트코드를 줄 단위로 해석해서 실행시킨다. 그렇기 때문에 파이썬은 한 줄씩 코드를 컴파일 및 실행하는 인터프리터 언어이기도 하다.

파이썬 인터프리터 구성 요소

파이썬 인터프리터는 파이썬 코드를 파이썬 바이트코드로 컴파일 해주는 컴파일러, 파이썬 바이트코드를 한 줄씩 실행시키는 PVM, 코드 실행 중 더이상 사용하지 않는 객체의 메모리 공간을 해제하는 Garbage Collector로 이루어져 있다.

파이썬 Garbage Collector

앞서 설명했듯이 파이썬의 객체는 C언어 프로세스인 파이썬 인터프리터의 heap 영역에 동적으로 할당된다. heap 영역은 malloc()을 활용한 메모리 할당과 free()를 활용한 메모리 해제가 가능하다. 파이썬 인터프리터는 해당 객체(데이터)를 참조하는 변수의 개수에 따라 자동으로 객체에 대한 메모리 할당, 해제를 수행하는 Garbage Collector를 제공한다. 새로운 객체를 참조하는 변수가 선언되면 해당 객체를 위한 메모리 할당을 수행하고 기존의 객체를 참조하는 변수가 더이상 사용되지 않으면 해당 객체의 메모리를 해제하는 것이다.

파이썬 바이트코드

파이썬 코드를 파이썬 인터프리터에서 해석하기 전에 전체 파이썬 코드를 파이썬 바이트코드로 컴파일하는 과정을 진행한다. 인간이 작성하는 파이썬 코드를 한 줄씩 인터프리터 방식으로 실행시키기에는 컴퓨터 입장에서 고수준의 명확하지 않은 코드이기 때문에 인터프리터의 PVM이 이해하기 쉬운 파이썬 바이트코드로 바꾸는 것이다. 오해하면 안되는 것이 파이썬 바이트코드는 어셈블리어가 아니다. 파이썬 인터프리터의 PVM은 이 파이썬 바이트코드를 한 줄씩 컴파일 및 실행하는 것이다.

Namespace

C언어에서 어떤 함수 안에서 지역적으로 선언된 변수는 stack 영역의 해당 stack call 안에서 정의된다. 해당 함수 실행이 종료되면 stack call이 stack 영역에서 없어지기 때문에 stack call 안에 저장되어 있는 변수는 다른 함수에서 사용할 수 없다. 이렇듯 C언어에서의 변수 scope 관리는 물리적으로 해당 변수가 들어있는 stack 영역 관리를 통해 진행된다.

파이썬은 객체지향언어로 모든 데이터는 객체이고 변수는 해당 객체의 주소를 특정 이름으로 저장하고 있는 일종의 포인터이다. 변수를 이용해 객체를 사용하기 위해서는 각 객체와 변수의 이름을 매핑시켜주어야 한다. 파이썬에서는 dictionary 자료형의 namespace 객체가 각 객체와 변수의 이름을 매핑시켜준다.

namespace는 전역 변수를 위한 namespace, 각 지역 변수를 위한 namespace가 따로 존재한다. 파이썬 인터프리터가 현재 어떤 코드를 실행시키고 있느냐에 따라 namespace의 값이 달라지며 이 namespace를 확인해서 어떤 변수가 해당 지역 안에서 사용 가능한 변수인지 확인한다. 이렇듯 파이썬에서의 변수 scope 관리는 논리적으로 namespace를 통해 이루어진다.

global_var = 10

def test() :
	local_val = 20
    
    print(globals().keys(), globals().values())
    print(locals().keys(), locals().values())

test()

globals(), locals() 함수를 사용하면 전역 namespace, 지역 namespace를 확인할 수 있다.

profile
HGU 20 김민석

0개의 댓글