1. はじめに
***********

このリファレンスマニュアルは、Python プログラミング言語自体に関する記
述です。チュートリアルとして書かれたものではありません。

私は本マニュアルをできるだけ正確に書こうとする一方で、文法や字句解析以
外の全てについて、形式化された仕様記述ではなく英語を使うことにしました
。そうすることで、このドキュメントが平均的な読者にとってより読みやすく
なっているはずですが、ややあいまいな部分も残っていることでしょう。従っ
て、もし読者のあなたが火星から来ている人で、このドキュメントだけから
Python を再度実装しようとしているのなら、色々と推測しなければならない
ことがあり、実際にはおそらく全く別の言語を実装する羽目になるでしょう。
逆に、あなたが Python を利用しており、Python 言語のある特定の領域にお
いて、厳密な規則が何か疑問に思った場合、その答えはこのドキュメントで確
実に見つけられることでしょう。もしより形式化された言語定義をお望みなら
、あなたの時間を提供していただいてかまいません --- もしくは、クローン
生成装置でも発明してください :-)。

実装に関する詳細を言語リファレンスのドキュメントに載せすぎるのは危険な
ことです --- 実装は変更されるかもしれず、同じ言語でも異なる実装は異な
った動作をするかもしれないからです。一方、広く使われている Python 実装
は現在のところ唯一 (今や別の実装もいくつか存在しますが！) なので、特定
のクセについては、特に実装によって何らかの制限が加えられている場合には
、触れておく価値があります。従って、このテキスト全体にわたって短い "実
装に関する注釈 (imprementation notes)" がちりばめられています。

Python 実装はいずれも、数々の組み込みモジュールと標準モジュールが付属
します。それらについては、 Python 標準ライブラリ でドキュメント化され
ています。いくつかの組み込みモジュールについては、言語定義と重要なかか
わりをもっているときについて触れています。


1.1. 別のPythonの実装
=====================

Pythonの実装としては、群を抜いて有名な実装がひとつ存在しています。それ
以外の実装に関しても、特定のユーザ間で興味が持たれています。

よく知られている実装には以下のものがあります:

CPython
   これは最も保守されている初代のPython実装で、C言語で書かれています。
   ほとんどの場合、言語の新機能がいち早く実装されます。

Jython
   Javaで実装されたPythonです。この実装はJavaアプリケーションのための
   スクリプト言語として、もしくはJavaクラスライブラリを使ったアプリケ
   ーションを作成するために使用することができます。また、Javaライブラ
   リのテストを作成するためにもしばしば使用されています。さらなる情報
   については the Jython website を参照してください。

Python for .NET
   この実装は内部ではCPythonを使用していますが、 .NETアプリケーション
   によって管理されているので、 .NETライブラリを参照することが可能です
   。この実装はBrian Lloydによって作成されました。さらなる情報について
   は、 Python for .NET home page を参照してください。

IronPython
   .NETでPythonを使用するためのもう一つの実装です。Python.NETとは異な
   り、完全にILを生成することができるPythonの実装あり、直接Pythonコー
   ドを.NETアセンブリにコンパイルします。これはJythonの初代の開発者で
   あるJim Huguninによって作られました。さらなる情報については the
   IronPython website を参照してください。

PyPy
   完全にPythonで書かれたPythonの実装です。他の実装には見られない、ス
   タックレスのサポートや、実行時 (Just in Time) コンパイラなどの高度
   な機能をサポートしています。このプロジェクトの一つの目的は、（
   Pythonで書かれていることによって、）インタプリタを簡単に修正できる
   ようにして、言語自体での実験を後押しすることです。さらなる情報は
   the PyPy project's home page にあります。

これらの各実装はこのマニュアルで文書化された言語とは多少異なっている、
もしくは、標準のPythonドキュメントと何処が異なっているかを定めた情報が
公開されているでしょう。あなたが使用している実装上で、代替手段を使う必
要があるかどうかを判断するためには、各実装の仕様書を参照してください。


1.2. 本マニュアルにおける表記法
===============================

字句解析と構文に関する記述では、BNF 文法記法に手を加えたものを使ってい
ます。この記法では、以下のような記述形式をとります:

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

最初の行は、"name" が "lc_letter" の後ろにゼロ個またはそれ以上の
"lc_letter" とアンダースコアが続いたものであることを示しています。そし
て、"lc_letter" は "'a'" から "'z'" までの何らかの文字一字であることを
示します。 (この規則は、このドキュメントに記述されている字句規則と構文
規則において定義されている名前 (name) で一貫して使われています)。

各規則は name (規則によって定義されているものの名前) と "::=" から始ま
ります。垂直線 ("|") は、複数の選択項目を分かち書きするときに使います;
この記号は、この記法において最も結合優先度の低い演算子です。アスタリス
ク ("*") は、直前にくる要素のゼロ個以上の繰り返しを表します; 同様に、
プラス ("+") は一個以上の繰り返しで、角括弧 ("[ ]") に囲われた字句は、
字句がゼロ個か一個出現する (別の言い方をすれば、囲いの中の字句はオプシ
ョンである) ことを示します。"*" および "+" 演算子の結合範囲は可能な限
り狭くなっています; 字句のグループ化には丸括弧を使います。リテラル文字
列はクオートで囲われます。空白はトークンを分割しているときのみ意味を持
ちます。規則は通常、一行中に収められています; 多数の選択肢のある規則は
、最初の行につづいて、垂直線の後ろに各々別の行として記述されます。

(上の例のような) 字句定義では、他に二つの慣習が使われています: 三つの
ドットで区切られている二つのリテラル文字は、二つの文字の ASCII 文字コ
ードにおける (包含的な) 範囲から文字を一字選ぶことを示します。各カッコ
中の字句 ("<...>") は、定義済みのシンボルを記述する非形式的なやりかた
です; 例えば、'制御文字' を書き表す必要があるときなどに使われることが
あります。

字句と構文規則の定義の間で使われている表記はほとんど同じですが、その意
味には大きな違いがあります: 字句定義は入力ソース中の個々の文字を取り扱
いますが、構文定義は字句解析で生成された一連のトークンを取り扱います。
次節 ("字句解析") における BNF はすべて字句定義のためのものです; それ
以降の章では、構文定義のために使っています。
