Skip to content

Commit

Permalink
[이용우] 3주차 미션 제출 (#38)
Browse files Browse the repository at this point in the history
  • Loading branch information
wooy0ng authored Apr 15, 2024
1 parent f7d8507 commit 30596cc
Showing 1 changed file with 207 additions and 0 deletions.
207 changes: 207 additions & 0 deletions 8th_members/이용우/3주차.md
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
"/>

0 comments on commit 30596cc

Please sign in to comment.