PEP 699 – PEP 509에서 추가된 비공개 딕셔너리 버전 필드 제거
- Author:
- Ken Jin <kenjin at python.org>
- Discussions-To:
- Discourse thread
- Status:
- Final
- Type:
- Standards Track
- Created:
- 03-Oct-2022
- Python-Version:
- 3.12
- Post-History:
- 05-Oct-2022
- Replaces:
- 509
- Resolution:
- Discourse message
번역·라이선스 안내
이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain or CC0-1.0, whichever is more permissive 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
초록
PEP 509에서는 CPython과 확장 라이브러리의 최적화를 허용하기 위해 딕셔너리에 비공개 ma_version_tag 필드를 도입했습니다. 이 PEP에서는 이미 대안으로 대체되었으므로 PEP 509을 철회하고 해당 필드를 구현 세부 사항으로 선언할 것을 제안합니다. 또한 이를 통해 향후 최적화를 위해 해당 필드를 재사용할 수 있습니다.
동기
PEP 509에서는 딕셔너리에 ma_version_tag 필드를 도입했습니다. 이 64비트 필드에는 딕셔너리가 수정될 때마다 갱신되는 버전 카운터가 저장되었습니다. 원래 제안은 이 버전 카운터를 최적화를 위한 보호 장치로 사용하는 것이었습니다.
CPython 3.11부터 이 필드는 내부 최적화 작업에서 사용되지 않게 되었습니다. PEP 659-특화 명령어는 특정 최적화가 안전한지 확인하기 위해 다른 방법을 사용합니다.
CPython에서 추가 최적화를 가능하게 하기 위해 이 PEP에서는 ma_version_tag필드가 더 이상 PEP 509 사양을 따르지 않도록 할 것을 제안합니다. 이를 통해 CPython 개발자는 딕셔너리 쓰기 감시자와 같은 다른 최적화 정보를 저장할 수 있습니다.
근거
이 PEP에서는 해당 필드가 향후 어떤 용도로 사용될 수 있는지 지정하지 않습니다. 이는 의도적인 것으로, 구현 세부 사항은 변경될 수 있으며 해당 필드는 CPython의 내부 용도로만 사용되어야 하기 때문입니다.
사양
이 사양은 PEP 509의 내용을 철회합니다. Python dict 클래스의 ma_version_tag필드는 내부 구현 세부 사항으로 선언되며, 완전히 제거되거나 다른 표현을 가질 수 있습니다. C 확장에서는 이 필드에 의존해서는 안 됩니다.
하위 호환성
일부 확장에서는 빠른 딕셔너리 또는 전역 변수 조회를 위해 ma_version_tag를 사용합니다. 예를 들어, Cython은 빠른 동적 모듈 변수 조회를 위해 이 필드를 사용합니다.
이 PEP에서는 ma_version_tag에 액세스할 때 컴파일러 경고를 발생시킬 것을 제안합니다. 두 번의 연속된 버전 릴리스에서 경고가 발생한 후, PEP 387에 따라 ma_version_tag를 제거합니다.
저자가 찾을 수 있었던 이 필드의 가장 큰 사용자는 Cython이었습니다. Cython 유지 관리자와의 논의에서 Cython에서 이에 대한 지원을 제거하는 작업은 간단하다는 점이 확인되었습니다.
보안 관련 사항
PEP 509에서는 정수 오버플로를 우려했습니다. 그러나 이 PEP에서는 추가적인 보안 우려가 발생하지 않습니다.
거부된 아이디어
하위 호환성을 위해 필드를 보존하는 대안이 있을 수 있습니다. 향후 최적화에서 더 많은 메모리를 소비하게 되며, PEP를 제외하면 해당 필드는 항상 비공개이고 문서화되지 않은 것으로 간주되었고 하위 호환성이 보장되지 않았으므로, 이 PEP에서는 해당 대안을 받아들이지 않습니다. Python에서는 딕셔너리를 일반적으로 사용하므로, 딕셔너리의 메모리 사용량이 증가하면 Python의 성능에 부정적인 영향을 미칩니다.
참조 구현
참조 구현은 python/cpython#101193에서 확인할 수 있습니다.
특별히 감사드릴 분들
C.A.M. Gerlach에게 감사드립니다. 이 문서의 편집과 문구 변경에 대해 감사드립니다. 가능한 구현을 제공해 주신 Mark Shannon과 Kumar Aditya에게도 감사드립니다.
Copyright
This document is placed in the public domain or under the CC0-1.0-Universal license, whichever is more permissive.