CPython 9

Cpython 병렬성과 동시성 /(2) 멀티 스레딩

멀티 스레딩 CPython은 스레드를 생성, 스폰, 제어 할 수 있는 파이썬용 고수준 API와 저수준 API를 제공한다. pthread: POSIX 스레드 ( 리눅스, macos) nt threads: NT 스레드 ( 윈도우 ) 프로세스는 다음과 같은 요소들을 같는다. 서브루틴의 스택 메모리와 힙 운영체제의 파일, 잠금, 소켓에 접근할 수 있는 권한 단일 프로세스의 가장 큰 제약은 운영체제가 실행 파일마다 하나의 프로그램 카운터를 가진다는 것이다. 이 문제를 해겨라기 위해 최신 운영 체제는 실행을 여러 스레드로 분기할 수 있도록 운영체제에 신호를 보낼 수 있다. 각 스레드는 저마다 다른 프로그램 카운터를 가지지만 호스트 프로세스와 리소스를 공유한다. 또한 각 스레드는 별도의 콜 스택을 가지고 있기 때문에..

CPython 2023.02.12

Cpython 병렬성과 동시성 /(1) 멀티 프로세싱

CPython은 병렬성과 동시성에 대해 다양한 접근방식을 제공한다. 주어진 상황에 따라 적절한 방식을 고르면 된다. 버마다의 장단점이 있는 각각의 동시성 구현을 주어진 상황에 따라 선택해서 사용할 수 있다. Cpython은 기본적으로 네가지 모데을 제공한다. threading : 동시실행 O 병렬실행 X multiprocessing : 동시실행 O 병렬실행 X asyncio : 동시실행 O 병렬실행 X subinterpreters : 동시실행 O 병렬실행 X 프로세스의 구조 운영체제는 실행 중인 프로세스를 제어할 책임이 있다. 그것이 사용자 인터페이스 앱일 수 도 있고 네트워크 서비스나 운영체제 서비스 처럼 백그라운드로 동작할 수 도 있다. 운영체제는 프로세스를 제어하기 위해 새 프로세스를 시작하는 AP..

CPython 2023.02.12

CPython 메모리 관리

CPU와 메모리는 컴퓨터에서 가장 중요한 부분이다. CPU와 메모리는 모두 혼자서는 동작할 수 없다. 프로그래밍 언어를 설계할때는 메모리를 관리할 방법을 정해야하는데 언어 설계자는 단순한 인터페이스를 원하는지, 이기종 호환성 대응을 원하는지 안정성보다는 성능에 중점을 둘 것인지에 따라 다양한 메모리 관리 방법중 어떤 방식을 사용할지 성택한다. C메모리 할당 C는 세가지 메모리 관리방식을 제공한다. 정적 메모리할당: 필요한 메모리는 컴파일 시간에 계산되고 실행파일이 실행될때 할당된다. 자동 메모리할당: 스코프에 필요한 메모리는 프레임에 진입할 때 콜스택내에 할당되고 프레임이 끝남ㄴ 해제된다. 동적 메모리 할당: 메모리 할당 API를 호출해 런타임에 메모리를 동적으로 요청하고 할당한다. 정적 메모리 할당 C..

CPython 2023.01.25

CPython/ 평가루프

컴파일된 코드 객체는 바이트코드로 표현된 이산 연산 리스트를 포함한다. 코드 객체는 입력이 없으면 실행할 수 없다. 파이썬에서 입려은 전역 지역 변수의 형태를 취한다. Cpython에서 코드는 평가루프라는 중심 루프에서 실행된다. cpython 인터프리터는 마셜링된 .pyc파일이나 컴파일러가 전달한 코드 객체를 평가하고 실행한다. 평가루프는 스택프레임 기반 시스템을 사용해바이트코드 명령을 실행한다. 모든 함수 호출은 스택프레임을 가지며 호출 순서에 따라 쌓인다. 만약 처리되지 않은 예외가 발생하면 스택프레임이 콘솔에 뜨는 것을 볼 수 있다. 평가 루프와 관련된 소스 파일 Python/ceval.c Python/ceval-gil.h 평가 루프는 코드 객체를 입력 받아일련의 프레임 객체를 변환한다. 인터프리..

CPython 2023.01.24

CPython/컴파일러 (2) '거의 같음' 연산자 구현하기(2)

컴파일러 C API AST 모듈 컴파일의 진입점인 compiler_mod()는 모듈타입에 따라 다른컴파일러함수를 사용한다. mod가 Module일 경우 모듈은 컴파일러 유닛으로 컴파일되어 c_stack 프로퍼티에 저장된다. 이후 컴파일러 유닛 스택에서 PyCodeObject를 생성하기 위해 assemble()을 실행한다. compiler_body()는 모듈의 각 문을 순회하며 방문한다. AST노드 타입을 확인하는 asdl_seq_GET() 호출을 통해 이 문의 타입이 결정된다. VISIT 매크로는 각 문 타입에 해당하는 compile.c의 함수를 호출한다. 모든 문을 포괄하는 stmt타입의 경우 컴파일러는 compiler_bisit_stmt()를 호출해 Python/Python.asdl에 정의된 하위 문..

CPython 2023.01.08

CPython/컴파일러 (1)

저번 글에서 택스트 형태의 소스 코드를 컴파일 가능한 논리 구조인 리더 (텍스트)->랙서 > CST-> 파서 > AST-> 컴파일러에서 랙서와 파서 부분을 정리 했고 이번엔 컴파일러에 대해서 정리를 하려합니다. 컴파일 작업은 두 부분으로 구성된다. 1. 컴파일러 AST를 순회하며 논리적 실행순서를 나타내는 제어 흐름 그래프를 생성한다. 2.어셈블러: CFG의 노드들을 실행 가능한 명령을 순차적으로 나열한 바이트 코드 형태로 변환한다. 컴파일 과정 파서 > AST -> 컴파일러 > CFG -> 어셈블러 > 바이트코드 -> 실행 AST 모듈을 코드 객체로 컴파일하는 과정 PyAST_CompileObject() compile.c 경로에 정의돼 있다. 컴파일러 상태는 심벌 테이블을 담는 컨테이너 타입이다. 심벌..

CPython 2023.01.08

CPython/렉싱과 파싱/ '거의 같음'연산자 구현(1)

다양한 방식으로 입력된 텍스트 형태의 파있너 코드는 파싱 단계를 거쳐 컴파일러에서 사용할 수 있는 구조로 변환된다. 이번장에서는 텍스트 형태의소스 코드를 컴파일 가능한 논리적 구조로 파싱하는 방법에 대해 알아볼것이다. Cpython은 코드를 파싱하기 위해 CST와 AST두 가지 구조를 사용한다. 리더 -> 렉서 -> 파서 -> 컴파일러 파싱과정은 다음과 같다. 1. 파서.토크나이저 또는 렉서가 CST를 생성한다. 2. 파서가 CST로부터 AST를 생성한다. 이 두단계는 다른 프로그래밍 언어에서도 흔하기 사용되는 패러다임이다. CST CST는 문맥 자유 문법에서 코드를 표현하는 루트와 순서가 있는 트리다. 토크나이저와 파서가 CST를 생성한다. 파서 생성기는 문맥 자유 문법이 가질 수 있는 상태에 대한 결..

CPython 2022.12.10

CPython 구성과 입력

Cpython에서는 다양한 방식으로 파이썬 코드를 실행할 수 있다. 1. python -c : 파이썬 문자열 실행 2. python -m :으로 모듈 실행 3. python : 파이썬 코드가 들어있는 파일 실행 4. cat | python 처럼 파이썬 코드를 stidn으로 python에 파이프 하기 5. REPL에서 한번에 하나씩 명령 실행하기 6. C API를 사용해파이썬을 임베디드 환경으로 사용 인터프리터가 파이썬 코드를 실행하려면 세 가지 요소가 필요하다. 1. 실행할 모듈 2. 변수 등을 저장할 상태 3. 활성화된 옵션 등의 구성 이 세가지 요소가 있어야 인터프리터가 코드를 실행하고 출력을 제공할 수 있다. 구성 상태 파이썬 코드를 실행하기 전에 Cpython 런타임은 먼저 사용자 옵션과 구성을 ..

CPython 2022.12.10

CPython 3.9 환경 설정 (macos)

cpython CPython은 C로 작성된 컴파일러를 사용하는 python 인터프리터 언어 c 로 작성된 이유 셀프호스팅 컴파일러는 고 컴파일러척럼 자기 자신으로 작성한 컴파일러이다. 셀프 호스팅 컴파일러는 부트스트래핑이라는 단계를 통해서 만들어진다. 소스대 소스 컴파일러는 컴파일러를 이미 가지고 있는 다른 언어로 작성한 컴팡일러이다. cpython 배포된 소스코드 클론해서 들고오기 git clone --branch 3.9 https://github.com/python/cpython cd pythonmac은 기본적으로 xcode에서 기본적인 툴킷을 제공하기때문에 xcode툴킷만 다운로드 하ㅕㅁㄴ 대부분의 준비가 끝난다. xcode-select --install다음 의존성 brew로 설치 brew inst..

CPython 2022.12.10