generated from Pseudo-Lab/Jupyter-Book-Template
-
Notifications
You must be signed in to change notification settings - Fork 18
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
207 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,207 @@ | ||
# 3주차 | ||
### 목차 | ||
1. [구성 상태](#구성-상태) | ||
- [딕셔너리 초기화 구성](#딕셔너리-초기화-구성) | ||
- [연관된 소스 파일 목록](#연관된-소스-파일-목록) | ||
- [런타임 구성 구조체](#런타임-구성-구조체) | ||
- [명령줄로 런타임 구성 설정하기](#명령줄로-런타임-구성-설정하기) | ||
2. [빌드 구성](#빌드-구성) | ||
3. [입력에서 모듈 만들기](#입력에서-모듈-만들기) | ||
- [연관된 소스 파일 목록](#연관된-소스-파일-목록) | ||
4. [3주차 미션](#3주차-미션) | ||
- [CPython 인터프리터 실행 과정 코드 레벨로 이해하기](#cpython-인터프리터-실행-과정-코드-레벨로-이해하기) | ||
- [파이썬 세션에서 Runtime Flag 확인하기](#파이썬-세션에서-runtime-flag-확인하기) | ||
- [importlib.util.find_spec 함수를 사용해서 원하는 모듈의 위치를 찾아보기](#importlibutilfind_spec-함수를-사용해서-원하는-모듈의-위치를-찾아보기) | ||
|
||
|
||
<br><br><hr> | ||
|
||
### 구성 상태 | ||
CPython 런타임은 <font color='orange'>사용자 옵션</font>과 <font color='orange'>구성(Configuration)</font>을 설정한다. | ||
특히 **Configuration**은 세 부분으로 나뉘어 있다. | ||
|
||
- `PyPreConfig` 딕셔너리 초기화 Configuration | ||
- `PyConfig` 런타임 Configuration | ||
- CPython 인터프리터에 같이 컴파일된 Configuration | ||
|
||
여기서 `PyPreconfig`, `PyConfig` 구조체는 | ||
`Include/cpython/initconfig.h`에서 정의한다. | ||
|
||
<br><br> | ||
|
||
#### 딕셔너리 초기화 구성 | ||
**딕셔너리 초기화 Configuration**은 <font color='orange'>사용자 환경 또는 운영체제와 관련된 Configuration</font>이기에 | ||
런타임 Configuration과는 구분된다. | ||
|
||
다음은 `PyPreConfig`의 세 가지 주요 기능이다. | ||
1. 파이썬 메모리 할당자 설정하기 | ||
2. `LC_CTYPE` 로켈(locale)을 시스템 또는 사용자 선호 로켈로 구성 | ||
3. UTF-8 모드로 설정 | ||
|
||
> Locale : 특정 지역, 국가, 또는 문화권에서 사용하는 언어 등과 같은 지역설정을 의미함. (ex. `ko-KR`) | ||
|
||
`PyPreConfig` 구조체는 다음과 같은 `int` 타입 필드들을 포함한다. | ||
|
||
| 필드 | 설명 | | ||
| ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | | ||
| `allocator` | `PYMEM_ALLOCATOR_MALLOC`와 같은 값을 사용해서 메모리 할당자를 선택한다. <br>`./configure --help`를 실행해 메모리 할당자에 대한 추가 정보를 얻을 수 있다. | | ||
| `configure_locate` | `LC_CTYPE` 로켈을 사용자 선호 로캘로 설정한다. <br>`0`으로 설정하면 `coerce_c_locale`과 `coerce_c_locale_warn`을 `0`으로 설정한다. | | ||
| `coerce_c_locale` | `2`로 설정하면 C 로켈을 강제로 적용한다. <br>`1`로 설정하면 `LC_CTYPE`을 읽은 후 강제로 적용할지 결정한다. | | ||
| `coerce_c_locale_warn` | `0`이 아니면 C 로켈이 강제로 적용될 때 경고가 발생한다. | | ||
| `dev_mode` | 개발 모드를 활성화한다. | | ||
| `isolated` | 격리 모드를 활성화한다. `sys.path`에 스크립트 디렉터리와 <br>사용자의 사이트 패키지 디렉터리가 포함되지 않는다. | | ||
| `legacy_windows_fs_encoding` | `0`이 아니면 UTF-8 모드를 비활성화하고 파이썬 파일 시스템 인코딩을 `mbcs`로 설정한다. | | ||
| `parse_argv` | `0`이 아니면 명령줄 인자를 사용한다. | | ||
| `use_environment` | `0`보다 큰 값이면 환경 변수를 사용한다. | | ||
| `utf8_mode` | `0`이 아니면 UTF-8 모드를 활성화한다. | | ||
|
||
<br> | ||
|
||
`Include/cpython/initconfig.h`에서 `PyPreConfig` 구조체를 찾아볼 수 있다. | ||
|
||
<br><br> | ||
|
||
#### 연관된 소스 파일 목록 | ||
다음은 `PyPreConfig`와 연관된 소스 파일 목록이다. | ||
|
||
| 파일 | 용도 | | ||
| ---------------------- | ------------------------------------------------------- | | ||
|`Python/initconfig.c` | 시스템 환경에서 불러온 구성을 명령줄 플래그와 결합한다. | | ||
|`Include/cpython/initconfig.h` | 초기화 구성 구조체를 정의한다. | | ||
|
||
<br><br> | ||
|
||
#### 런타임 구성 구조체 | ||
`PyConfig`이라 불리는 런타임 Configuration 구조체는 다음과 같은 값들을 포함한다. | ||
- '디버그'나 '최적화'와 같은 실행 모드 플래그 | ||
- 스크립트 파일이나 `stdin`, 모듈 등 실행 모드 | ||
- `-X <option>`으로 설정 가능한 확장 옵션 | ||
- 런타임 설정을 위한 환경 변수 | ||
|
||
런타임 구성 데이터는 CPython 런타임 기능의 활성화 여부를 결정한다. | ||
|
||
#### 명령줄로 런타임 구성 설정하기 | ||
파이썬은 다양한 명령줄 인터페이스 옵션을 제공한다. | ||
예를 들어 파이썬은 <font color='orange'>상세(verbose) 모드</font>를 제공한다. | ||
CPython 디버깅용 기능인 상세 모드는 주로 개발자 대상이다. | ||
|
||
`-v` 플래그로 verbose 모드를 활성화하면 | ||
파이썬은 모듈을 로딩할 때 마다 화면에 아래와 같은 메시지를 출력한다. | ||
|
||
``` | ||
$ ./python -v -c "print('hello world')" | ||
... | ||
# initiallizing zipimport hook | ||
import zipimport # built in | ||
# installed zipimport hook | ||
``` | ||
|
||
|
||
<br> | ||
|
||
런타임 구성을 설정하는 방법은 다양하기 때문에 우선순위가 정해져있다. | ||
다음은 verbose 모드에 대한 우선 순위이다. | ||
1. `config → verbose`의 기본값은 -1 이며 소스 코드에 하드코딩되어 있다. | ||
2. `PYTHONVERBOSE` 환경 변수를 `config → verbose`를 설정하는 데 사용한다. | ||
3. 환경 변수가 없으면 기본값인 -1을 사용한다. | ||
4. `Python/initconfig.c`의 `config_parse_cmdline()`은 | ||
명시된 플래그를 사용해 모드를 설정한다. | ||
5. `_Py_GetGlobalVariablesAsDict()`가 값을 전역 변수 `Py_VerboseFlag`로 복사한다. | ||
|
||
<br> | ||
|
||
런타임 시, 모든 `PyConfig`(런타임 구성) 값에는 아래와 같은 순서의 우선순위가 적용된다. | ||
|
||
<img width="700" src="https://github.com/wooy0ng/wooy0ng/assets/37149278/cde48ef7-45f5-40a6-bf74-2c6440192f57"> | ||
|
||
|
||
<br><br><hr> | ||
|
||
### 빌드 구성 | ||
런타임 구성을 `include/cpython/initconfig.h`에서 정의하듯이 | ||
빌드 구성은 최상위 폴더의 `pyconfig.h`에서 정의한다. | ||
|
||
`pyconfig.h`는 macOS나 리눅스용 빌드 과정 중 `./configure` 단계나 | ||
윈도우의 `build.bat` 실행 중에 자동으로 생성된다. | ||
|
||
다음 명령으로 빌드 구성을 확인해 볼 수 있다. | ||
|
||
``` | ||
./python.exe -m sysconfig | ||
Platform: "macosx-14.2-arm64" | ||
Python version: "3.9" | ||
Current installation scheme: "posix_prefix" | ||
Paths: | ||
data = "/usr/local" | ||
include = "/Users/wooy0ng/Desktop/playground/practice-cpython/cpython/Include" | ||
platinclude = "/Users/wooy0ng/Desktop/playground/practice-cpython/cpython" | ||
... | ||
``` | ||
|
||
빌드 구성 항목들은 컴파일 시에 결정되는 값으로, 바이너리에 링크할 추가 모듈 선택에 사용된다. | ||
예를 들어 디버거와 계측(instrumentation) 라이브러리, 메모리 할당자는 모두 컴파일 시 결정된다. | ||
|
||
세 단계의 구성을 모두 완료하면 CPython 인터프리터는 입력된 텍스트를 코드로 실행할 수 있다. | ||
|
||
<br><br><hr> | ||
|
||
|
||
### 입력에서 모듈 만들기 | ||
코드를 실행하려면 먼저 입력을 모듈로 컴파일해야 한다. | ||
입력 방식에는 여러 가지가 있다. | ||
|
||
- 로컬 파일과 패키지 | ||
- 메모리 파이프나 `stdin`과 같은 I/O 스트림 | ||
- 문자열 | ||
|
||
읽어 들인 입력은 Parser를 거쳐 컴파일러로 전달된다. | ||
|
||
<br> | ||
|
||
<img width="700" src="https://github.com/wooy0ng/wooy0ng/assets/37149278/c2dc5c43-26ab-46f9-a62e-90d1e5af8e95"> | ||
|
||
|
||
유연한 입력 방식을 제공하기 위해 | ||
CPython은 CPython 소스 코드의 상당 부분이 Parser의 입력 처리에 사용한다. | ||
|
||
<br><br> | ||
|
||
#### 연관된 소스 파일 목록 | ||
다음은 명령줄 인터페이스 처리와 관련된 주요 파일들이다. | ||
|
||
| 파일 | 용도 | | ||
| -------------------- | --------------------------------------------------------------------------------------------- | | ||
| `Lib/runpy.py` | 파이썬 모듈을 임포트하고 실행하는 표준 라이브러리 모듈 | | ||
| `Modules/main.c` | 파일이나 모듈, 입력 스트림과 같은 외부 코드 실행을 감싸는 함수 | | ||
| `Programs/python.c` | 윈도우나 리눅스, macOS에서 python의 진입점이다. <br> `Modules/main.c`를 감싸는 역할만 맡는다. | | ||
| `Python/pythonrun.c` | 명령줄 입력을 처리하는 내부 C API를 감싸는 함수 | | ||
|
||
<br><br><hr> | ||
|
||
### 3주차 미션 | ||
#### CPython 인터프리터 실행 과정 코드 레벨로 이해하기 | ||
1. CPython 소스코드에 적절한 프린트문을 추가해서 인터프리터 실행과정을 출력하기 | ||
a. main | ||
b. Py_BytesMain | ||
c. pymain_main | ||
d. pymain_init | ||
e. Py_RunMain | ||
|
||
<img src="https://github.com/wooy0ng/wooy0ng/assets/37149278/b0d94a24-7263-4bbc-9578-1f169c6af280 | ||
"/> | ||
|
||
<br><br> | ||
|
||
#### 파이썬 세션에서 Runtime Flag 확인하기 | ||
|
||
<img src="https://github.com/wooy0ng/wooy0ng/assets/37149278/824efc63-761c-4127-baca-984c01d47434 | ||
"/> | ||
|
||
<br><br> | ||
|
||
|
||
#### importlib.util.find_spec 함수를 사용해서 원하는 모듈의 위치를 찾아보기 | ||
<img src="https://github.com/wooy0ng/wooy0ng/assets/37149278/f373b543-f98a-4d17-98df-141dc702ae50 | ||
"/> |