Python = 언어 명세(specification)
“이 문법은 이렇게 동작해야 한다”는 규칙서
추상적인 약속일 뿐 그 자체로는 안 돌아감
CPython = 그 명세를 실제로 구현한 프로그램
C 언어로 작성된 Python 인터프리터
우리가 Python.org에서 받아 python 치면 실행되는 게 바로 이것
“표준 구현체”라서 사싱상 Python = CPython으로 통함
Java로 비유하면 아래와 같음:
Java 언어 명세(JLS) ←→ Python 언어 명세
JVM 구현체들 ←→ Python 구현체들
├ HotSpot (오라클, 표준) ├ CPython (C, 표준) ← 99% 이게 쓰임
├ OpenJ9 (IBM) ├ PyPy (JIT, 빠름)
└ GraalVM ├ Jython (JVM 위에서 돎)
└ IronPython (.NET 위)
PyPy는 GIL이 있지만 JIT로 빠르고,Jython은 JVM의 GC를 쓰니 참조 카운팅도 GIL도 없다CPython에서 모든 객체는 C 구조체 PyObject 이고, 최소한 둘을 항상 들고 있음
이건 CPython만의 방식(Jython/IronPython은 호스트 GC를 빌려 씀)
“[Python] 기본 개념 “에 포함되는 내용
참조 카운팅(주력):
객체마다 참조 수를 세어 0이 되는 즉시 해제
결정론적이라 리소스 정리 타이밍이 예측 가능(= with 로 파일이 즉시 닫히는 이유)
단, **순환 참조(서로 물고 있는 구조)**면 카운트가 0이 안되어 못 풀음