Python 3.0で大きく変わる言語仕様

 一般に、Pythonプログラミング言語のこれまでの新バージョンはユーザに優しかった。多かれ少なかれ前バージョンとの下位互換性は維持された。しかし、2000年、Pythonの作者Guido van Rossum氏は新バージョン開発を発表し、言葉を濁さずにはっきりと宣言した。バージョン3.0に下位互換性はないと。そして、ついにPython 3.0の最初のリリース候補が公開された。最終リリースは今月末を予定する。古いコードを使い続けるか、新しいインタプリタを使うために手直しをするか、開発者は選択を迫られる。

 以前のバージョンの言語で書いたコードが新しいバージョンで動作しないことは開発者が忌み嫌う事態だが、van Rossum氏にとって抜本的なアップグレードは必要なことだった。Pythonは、同じタスクを行う方法が複数あることや、実際にはだれも使わないタスクの処理方法があることで、次第に見劣りするようになっていたのだ。

 「3.0の開発を決めたのは、下位互換性ときっぱり手を切る大きな区切りが欲しかった、ということです。[基本の発想は]先へ進むための基盤整備ですね」(van Rossum氏)

 当然だが、Pythonコミュニティからは不満の声が噴出した。

 comp.lang.pythonニュースグループに投稿された開発者の嘆きの言葉を引用する。「僕が参加してるプロジェクトもそうだけど、いろんな国際的なプロジェクトでPythonは検討の対象から外れつつある。バージョン2.2で有効だったのに2.3で無効になったものが少しあって、もう苦情が来てるよ」

 「オペレーティングシステムのディストリビュータから見た場合、Python 3.0はパッケージのリポジトリに与える影響が大きい割りに実現できる機能は比較的少ないのです」と、イギリスのPython開発者Paul Boddie氏は明かす。

何が変わった?

 ある意味で、Pythonは成功があだになったとも言える。van Rossum氏によると、「ずっと狭い範囲で使う言語だったんですよ、もともとは。まさか、ここまでメジャーになって、たくさんのアプリケーションで使われるなんて。Webアプリケーションから科学計算までですよ」

 1990年、Van Rossum氏は自分のシステム管理の仕事に使おうと、拡張性のあるオープンソース高レベル言語としてPythonを作成した。今や、Pythonは世界中で愛用される言語の1つだ。2008年3月、オーストリアの研究者Anton Ertl氏は、Usenetニュースグループへの投稿数を基準としてプログラミング言語の人気ランキングを集計した。PythonはUsenetで3番目に投稿数の多い言語であり、CとJavaには及ばないものの、C++やPerlなどの有力言語を抑えた。

 プログラミングの初歩を教えるときに、最も簡単なプログラミング言語としてよく使われるのがPythonだ。いわば現代のBasicであるが、Basicと比べると洗練された使い方ができる。

 Pythonの簡潔さは、とどまるところを知らぬ利用の広がりによって脅かされていた、とvan Rossum氏は指摘する。90年代を通じて新しい関数や機能が組み込まれ続けたため、プラットフォーム間の整合性にほころびが見られるようになっていた。「[簡潔さという]メリットをじわじわと無くしてました。下位互換性を断ち切るしかなかったのです。言語の定義が野放図に膨れ上がるのを避けるには。それは、とてもゆっくりと、ほとんど誰も気が付かないうちに始まってましたから」

 Python.orgには、変更リストが公開されている。多くは小さな変更であり、ほとんどのプログラマは気が付かないだろう。やや大きな変更点は、短時間で再習得が可能なものだ。

 「ほとんどの相違は、細かい部分にあります。言語の要点や、みんなが抱いているイメージ、能力はさほど変わりません」

 たとえば、printステートメントはprint関数に代わった。よって、画面に表示するものをカッコで囲んで指定する必要がある。この変更のため、より柔軟かつ統一された方法でプリントを操作できる。print関数を別のアクションに置き換える必要がある場合は、printステートメントを手動で1つずつ書き直すのではなく、全体を検索して置換できるようになった。

 また、以前は整数型にlong型とshort型の2種類があったが、van Rossum氏はこれを意味がないとして1つに統合した。

 もう1つの汚い継ぎはぎの山にもメスが入れられた。”クラシック・クラス”と呼ばれるものだ。Pythonバージョン2には構文の異なる2組のクラスがある。「Pythonの仮想マシンでは、特殊なケースのクラシック・クラスを扱うメカニズムと、クラシック・クラスと新しいスタイルのクラスを同時に扱うメカニズムが混在してました。実装がややこしくなる原因です」そこで、6年間にわたって新しいクラスへの移行を呼びかけた後で、Pythonバージョン3の開発者は多数決をとり、クラシック・クラスとの決別を決めた。

 Pythonに起こるおそらく最大の変化は — そして既存のコードに最も多くの書き直しを強いるものは — バイトと文字列の扱いが一新されることだろう。元々、Pythonではすべての入力と出力が文字列として表現された。Pythonが簡素な設定で使われる間は、インタープリタに通されるほとんどの文字列を標準のASCII文字セットで簡単に表現できた。しかし、世界中で使われるようになると、各言語の文字に対応するためにUnicodeを使うユーザが増えた。Unicodeは、Pythonには8ビットのバイナリのバイト文字列に見える。これが、別のプログラムからの出力の一部としてインタープリタに渡されることがある。インタープリタはバイナリコードとUnicodeエンコード文字列を混同し、長時間の立ち往生を起こす場合がある。

 解決策? バイトを処理する新しいオブジェクトクラスを定義すること。Pythonにとってこれは初めてのことである。また、文字列をUnicodeで再定義する必要もある。そして、この区別を常にはっきりさせる。言い換えると、Python 3.0ではバイト型と文字列型に互換性はない。

 「テキストを使う場面で誤ってバイトを渡すと、ほとんどすぐに例外が発生しますよ」

変換と移行

 van Rossum氏は、Python 3.0の検討を始めた時点で移行の難しさについてあまり考えていなかったことを認める。「2000年頃のコミュニティは小さかったので、新しいバージョンをリリースしたら、みんながコードを修正して、それで終わりだと思ったのです」

 しかし、ユーザコミュニティで意見を募ると、コア開発者のもとにはスムーズな移行プロセスを求める苦言が集まり始めた。移行用のツールが必要だった。

 その役割を担うのが、最近リリースされたバージョン2.6のPythonだ。これは、Pythonの移行バージョンとして使用される。以前のバージョンのPythonで書いたコードはバージョン2.6に簡単にアップグレードできる。2.6のインタープリタは、バージョン3.0で無効になるコードがあると警告のメッセージを表示する。

 「ぜひともPython 2.6にアップグレードしてください。3.0に備えて変更する必要がある古臭いコードが見つかりますから」

 また、開発チームは、Python 2.6のコードをPython 3.0のコードに変換する移行ツール2to3も作成した。つまり、古いコードを2.6で実行し、警告メッセージが出なくなるまでコードを書き直してから、2to3を使ってコードをPython 3.0対応に変換することになる。

 もちろん、Pythonは動的言語であり、型を明示的に宣言しないため、移行ツールが役に立たない場合も多いが、printステートメントをprint関数に変更するなどのありふれたタスクには有効である。

 このツールがあるにせよ、ユーザコミュニティの移行の足取りは重いだろうし、Pythonを利用するビジネスのすべてが移行することはないだろうと、van Rossum氏も認める。

 たとえば、 Aahz Maruch氏が勤務する印刷組版会社Page DNAでは、主力業務に200,000行のPythonコードを利用している。Maruch氏によると、同社は自動変換ツールが改良されるまで数年待つつもりだという。「[コードをPython 3.0対応に変換するのは]とんでもない大仕事じゃないですか。3.0については話題にもなりません。少なくとも2、3年先ですね」

 そもそもアップグレードの必要があるのか疑いの目で見る人も多い。

 「Python 3.0の実装は、[現代のプログラミング言語が直面する]パフォーマンス、並列性の強化、一貫性のある新しいバンドルライブラリの提供などの問題に比較的わずかしか関心を向けてません」

 Boddie氏は、Python 3.0がほとんどの開発者によって必要なアップグレードであると判断されず、その結果、Windows Vistaが前世代のWindows XPを継ぐデファクトのWindowsにならなかったように、Python 3.0がデファクトのPythonとしてのステータスを失いはしまいかと危惧する。

 現在、Python実装の筆頭はCPythonである。これはCで書かれたPythonインタープリタだ。ただし、Boddie氏によれば、この他にJPython(Javaで書かれたPython)、IronPython(Microsoftの.Netの共通言語ランタイムで書かれたPython)、PyPy(Pythonで書かれたPythonインタープリタ)などが存在する。

 「Python 3.0は、他のPython実装に注意を向けた方がよいかもしれません。特に、それらがPython 3.0の互換性を優先事項として追ってない場合は」と、Boddie氏は提案する。

 とはいえ、コア開発者チームは、最終的には潮目が変わると確信する。「ほとんどの人は1年後に2.6を使ってると予想します。3.0を使うのは、最先端のものに無条件で飛び付く人だけでしょう。ただし、これから新しいプロジェクトを始めるなら、3.0を使うべきですね」

Linux.com 原文(2008年10月15日)