# 1. 개요

이 레퍼런스 설명서는 파이썬 프로그래밍 언어를 설명합니다. 자습서를 목표로 하고 있지 않습니다.

가능한 한 정확하려고 노력하고 있지만, 문법과 어휘 분석 이외의 모든 것에는 형식 규격보다는 자연어를 사용합니다. 이 선택이 평균적인 독자들이 문서를 좀 더 잘 이해하도록 만들지만, 동시에 모호해질 가능성 역시 만듭니다. 결과적으로, 만약 여러분이 화성에서 왔고 이 문서만으로 파이썬을 다시 구현하려고 하면, 아마도 여러 가지를 짐작해야 할 것이고 결국 많이 다른 언어를 만드는 것으로 끝날 것입니다. 반면에, 여러분이 파이썬을 사용하고 있고 언어의 특정 영역에 대한 정확한 규칙에 대해 궁금해하고 있다면 거의 확실히 이곳에서 답을 찾을 수 있습니다. 좀 더 형식화된 정의를 보고 싶다면, 아마도 여러분의 시간을 기부하는 편이 좋습니다 — 그렇지 않으면 클로닝 기계를 발명하거나 :-).

참조 문서에 너무 많은 구현 세부 사항을 넣는 것은 위험합니다. 구현은 변경될 것이고 같은 언어의 다른 구현도 좀 다른 방식으로 동작할 수 있습니다. 반면에 (대안 구현이 점차 지지도를 높여가고 있기는 하지만) CPython 은 가장 널리 사용되는 파이썬 구현이고, 그것의 특별한 경우 들은 때로 언급할 가치가 있습니다. 구현이 추가의 제약을 내포하고 있는 경우는 특히 그렇습니다. 그래서, 텍스트 중간중간 짧은 “구현 노트” 가 튀어나오는 것을 보게 될 것입니다.

모든 파이썬 구현에는 많은 내장 표준 모듈들이 따라옵니다. 이것들은 파이썬 표준 라이브러리 에 기술되어 있습니다. 언어 정의에 주목할 만한 방식으로 관계될 경우 몇몇 내장 모듈들은 따로 언급됩니다.

## 1.1. 대안 구현들

눈에 띄게 널리 사용되는 파이썬 구현이 존재하기는 하지만, 특정한 관심사를 가진 대상들에게 호소력을 가진 여러 대안 구현들이 존재합니다.

알려진 구현들은:

CPython

  원조이기도 하고 가장 잘 관리되고 있는 C로 작성된 파이썬 구현입니다. 언어의 새로운 기능은 보통 여기에서 처음 등장합니다.

Jython

  파이썬 자바구현. 이 구현은 자바 응용 프로그램을 위한 스크립트 언어로 사용되거나, 자바 클래스 라이브러리를 활용하는 응용 프로그램을 만드는데 사용될 수 있습니다. 종종 자바 라이브러리의 테스트를 만드는 데 사용되기도 합니다. 더 자세한 정보는 Jython 웹사이트 에서 찾을 수 있습니다.

Python for .NET

  이 구현은 실제로는 CPython 구현을 사용하지만, 매니지드(managed) .NET 응용 프로그램이고 .NET 라이브러리를 제공합니다. Bryan Lloyd가 만들었습니다다. 더 자세한 정보는 Python for .NET 홈페이지 에서 제공됩니다.

IronPython

  .NET을 위한 대안 파이썬. Python.NET 과는 달리 이것은 IL을 생성하고, 파이썬 코드를 .NET 어셈블리로 직접 컴파일하는 완전한 파이썬 구현입니다. Jim Hugunin 이 만들었는데, Jython 의 원저자이기도 합니다. 자세한 정보는 IronPython 웹사이트 에서 얻을 수 있습니다.

PyPy

  완전히 파이썬으로 작성된 파이썬 구현. 스택 리스(stackless) 지원이나 JIT 컴파일러와 같이 다른 구현에서는 찾을 수 없는 고급 기능을 제공합니다. 이 프로젝트의 목표 중 하나는 (파이썬으로 쓰였기 때문에) 인터프리터 수정을 쉽게 만들어서 언어 자체에 대한 실험을 북돋는 것입니다. 자세한 정보는 PyPy 프로젝트의 홈페이지 에서 찾을 수 있습니다.

각 구현은 이 설명서에서 설명되는 언어와 조금씩 각기 다른 방법으로 벗어나거나, 표준 파이썬 문서에서 다루는 범위 밖의 특별한 정보들을 소개합니다. 여러분이 사용 중인 구현에 대해 어떤 것을 더 알아야 하는지 판단하기 위해서는 구현 별로 제공되는 문서를 참조할 필요가 있습니다.

## 1.2. 표기법

어휘 분석과 문법의 기술은 수정된 배커스-나우르 형식 (BNF) 문법 표기법을 사용합니다. 이것은 다음과 같은 정의 스타일을 사용합니다.

    name      ::= lc_letter (lc_letter | "_")*
    lc_letter ::= "a"..."z"

첫 줄은 `name` 이 `lc_letter` 로 시작하고, 없거나 하나 이상의 `lc_letter` 나 밑줄이 뒤따르는 형태로 구성된다고 말합니다. 한편 `lc_letter` 는 `'a'` 와 `'z'` 사이의 문자 하나입니다. (사실 이 규칙은 이 문서에서 어휘와 문법 규칙에서 정의되는 이름들에 대한 규칙입니다.)

개별 규칙은 이름 (위 규칙에 등장하는 `name`)과 `::=` 로 시작합니다. 세로막대(`|`)는 대안들을 분리하는 데 사용됩니다; 이 표기법에서 우선순위가 가장 낮은 연산자입니다. 별표(`*`)는 앞에 나오는 항목이 생략되거나 한 번 이상 반복될 수 있다는 의미입니다; 비슷하게, 더하기(`+`)는 한 번 이상 반복될 수 있지만 생략할 수는 없다는 뜻이고, 대괄호(`[]`)로 둘러싸인 것은 최대 한 번 나올 수 있고, 생략 가능하다는 뜻입니다. `*` 와 `+` 연산자는 최대한 엄격하게 연결됩니다; 우선순위가 가장 높습니다; 괄호는 덩어리로 묶는 데 사용됩니다. 문자열 리터럴은 따옴표로 둘러싸입니다. 공백은 토큰을 분리하는 용도로만 사용됩니다. 규칙은 보통 한 줄로 표현됩니다; 대안이 많은 규칙은 여러 줄로 표현될 수도 있는데, 뒤따르는 줄들이 세로막대로 시작되게 만듭니다.

어휘 정의 (위에서 든 예와 같이) 에서는, 두 가지 추가 관례가 사용됩니다: 두 개의 리터럴 문자가 세 개의 점으로 분리되어 있으면 주어진 (끝의 두 문자 모두 포함하는) 범위의 ASCII 문자 중 어느 하나라는 뜻입니다. 홑화살괄호(`<...>`) 안에 들어있는 구문은, 정의되는 기호에 대한 비형식적 설명을 제공합니다. 즉 필요한 경우 ‘제어 문자’를 설명하는데 사용될 수 있습니다.

사용되는 표기법이 거의 같다고 하더라도, 어휘와 문법 정의 간에는 커다란 차이가 있습니다: 어휘 정의는 입력의 개별 문자에 적용되는 반면, 문법 정의는 어휘 분석기가 만들어내는 토큰들에 적용됩니다. 다음 장 (“어휘 분석(Lexical Analysis)”)에서 사용되는 모든 BNF는 어휘 정의입니다; 그 이후의 장에서는 문법 정의입니다.