PEP 699 – PEP 509에서 추가된 비공개 dict 버전 필드 제거
- 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 개발자들은 딕셔너리 쓰기 감시자(write watcher)와 같은 다른 최적화 정보를 저장할 수 있게 됩니다.
근거
이 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.