TL;DR

  • TurboPython은 정적 타입과 엄격한 소유권 모델을 적용해 파이썬 코드를 씨플러스플러스로 컴파일하며, 동적 기능과 CPython 패키지 사용에는 제약이 있음.
  • 함수 매개변수·반환값·클래스 필드에는 타입 주석이 필요하고, 주석 없는 정수 리터럴은 기본적으로 32비트 int32임.
  • 각 값에는 함수 프레임·필드·컨테이너 가운데 정확히 하나의 소유자가 있으며, 소유자가 값의 해제 시점을 관리함.
  • 필드와 컬렉션은 값을 소유하므로 빌린 값은 복사되고, Own[T]를 사용하면 소유권을 전달할 수 있음.
  • eval, 몽키 패치, 런타임 __dict__ 변경은 지원되지 않으며, tpy --install-agent-docs docs로 AI 도우미용 문서를 생성할 수 있음.

파이썬과 다른 점

  • TurboPython은 정적 타입과 엄격한 소유권 모델을 사용하는 파이썬 문법임.
  • 함수 매개변수, 반환값, 클래스 필드에는 타입 주석이 필수이며, 주석이 없는 정수 리터럴은 기본적으로 32비트 int32임.
  • 이 규칙을 제외하면 대부분의 코드는 파이썬과 비슷하게 읽히지만, 파이썬의 동적 런타임 기능은 제외됨.
  • 구문이 정적 타입 및 소유권 모델에서 벗어나면 컴파일러가 오류를 보고하며, 진단 메시지에는 필요한 수정 방법이 포함됨.

pip 패키지 없음

  • numpy, requests처럼 CPython용으로 작성된 패키지는 가져올 수 없음.
  • 프로그램이 가져오는 모든 코드는 프로그램과 함께 컴파일됨.
  • 의존성은 TurboPython으로 작성하거나 TurboPython에 맞게 포팅해야 함.
  • 현재 제공되는 구성 요소는 표준 라이브러리의 일부와 TurboPython 자체 tplib 라이브러리임. 호환성 목록에서 세부 사항을 확인할 수 있음.

소유권

  • 파이썬은 참조 카운팅으로 객체를 자동 회수하므로, 이름은 객체를 공유하는 참조임.
  • TurboPython에는 가비지 컬렉터가 없으며, 모든 값에는 함수 프레임·필드·컨테이너 중 정확히 하나의 소유자가 있고 소유자가 값을 해제하는 시점을 관리함.
  • 지역 변수와 매개변수는 파이썬처럼 별칭을 가질 수 있지만, 영속 저장 공간은 값을 소유함.
  • 다음 세 가지 사례는 각각 컴파일러의 실제 진단을 보여 줌.

함수 프레임

  • 지역 변수는 이를 만든 함수가 소유함.
  • make() -> Obj에서 지역 변수 o를 반환하면 컴파일되지 않음. make가 반환할 때 o가 해제되므로 참조로 반환하면 댕글링 포인터가 발생하며, 컴파일러는 지역 값이나 임시 값을 참조로 반환할 수 없다고 진단함.
  • make() -> Own[Obj]로 반환 타입을 지정하면 컴파일됨. Own[Obj]는 객체 자체를 호출자에게 전달하며, 호출자가 새 소유자가 됨.

필드

  • 필드는 자신이 보유한 값을 소유함.
  • Cache의 필드 item: Tag에 빌린 매개변수 t: Tag를 저장하면 컴파일은 되지만, Tag를 필드에 복사한다는 경고가 발생함. copy()를 사용하면 복사를 명시할 수 있음.
  • 매개변수를 t: Own[Tag]로 선언하면 인수의 소유권이 필드로 이동해 복사 없이 컴파일됨.
  • 필드는 값을 설정한 함수 호출보다 오래 살아남으므로 값을 소유해야 함. 호출자가 자신의 값을 계속 보유해야 한다면 copy(t)를 사용할 수 있음.
  • 필드는 타입이 지정된 클래스 속성으로 선언하고 __init__에서 설정함. __dict__는 없으며, 각 필드는 고정된 타입 슬롯임.

컨테이너

  • 컬렉션은 요소를 소유함.
  • list[Obj]에 o를 추가한 뒤 o.x = 99처럼 계속 사용하면 컴파일은 되지만, 컨테이너가 소유하는 저장 공간에 Obj를 복사한다는 경고가 발생함.
  • l.append(copy(o))로 복사를 명시하면 같은 복사가 일어나며 경고가 사라짐. o는 이후에도 계속 사용할 수 있고, 목록은 별도의 복사본을 보유함.
  • 목록은 파이썬처럼 객체 참조를 공유하는 대신 객체를 저장하므로, 추가할 때 어느 쪽이든 복사가 일어남. copy()는 복사를 새로 발생시키는 것이 아니라 불가피한 복사를 명시함.
  • o를 추가한 뒤 사용하지 않는다면 복사 없이 목록으로 이동함.

그 밖의 차이

  • 핵심적인 개념 변화는 소유권임. 나머지는 타입 시스템의 요구사항과 컴파일 언어가 파이썬의 동적 기능에 부과하는 제약 같은 비교적 기계적인 규칙이며, 처음 몇 개 파일을 작성하면 익숙해지는 내용임.
  • 주석 필수: 함수 매개변수, 반환값, 클래스 필드에는 타입 주석이 필요하며 지역 변수 타입은 추론됨. 파이썬에서 선택 사항인 타입 힌트가 TurboPython에서는 계약이 됨.
  • 기본값 int32: 일반 정수는 32비트 int32임. int64, uint32 등으로 폭을 선택할 수 있으며, int는 임의 정밀도 정수로 큰 값은 힙에 할당됨.
  • 값과 참조: 기본형, 튜플, 뷰는 복사됨. 클래스, list, dict, set은 참조 타입이며 참조로 전달되고 반환됨.
  • 문맥에 따라 달라지는 str: str은 문맥에 따라 소유 문자열이거나 빌린 뷰임. 이를 명시하려면 String과 StrView를 사용하며, 할당이 허용되는 경우 일반 str이 기본 선택임.
  • 정적 구조: eval, 몽키 패치, 런타임 __dict__ 변경은 지원되지 않음. 타입과 구조는 컴파일 시점에 고정됨.
  • tpy의 기본 타입: Own, int32, Span 등 TurboPython 자체 타입은 tpy 모듈에 있으며, from tpy import *로 한 파일에 모두 가져올 수 있음.
  • AI 도우미 지원: tpy --install-agent-docs docs 명령은 코드와 나란히 TurboPython 입문 문서를 작성함. 문서에는 파이썬과 TurboPython의 차이, 소유권 규칙, AI 도우미가 올바른 TurboPython 코드를 생성하는 데 필요한 관용 표현이 포함됨.