特集
» 2008年10月22日 01時00分 UPDATE

Programing Bible:Python 3.0で大きく変わる言語仕様 (1/2)

UsenetではCとJavaに次ぐ人気のPython。次期バージョンとなる3.0では、細かな部分で過去の資産をばっさりと捨て去る予定となっている。ほかのPython実装の動き次第では、バージョン3.0は後に大きな変革のバージョンだったと呼ばれるものになるかもしれない。

[Joab Jackson,SourceForge.JP Magazine]
SourceForge.JP Magazine

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

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

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

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

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

 「OSのディストリビュータから見た場合、Python 3.0はパッケージのリポジトリに与える影響が大きい割に実現できる機能は比較的少ないのです」と、イギリスのPython開発者ポール・ボディー氏は明かす。

何が変わった?

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

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

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

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

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

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

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

 また、以前は整数型にlong型とshort型の2種類があったが、ヴァンロッサム氏はこれを意味がないとして1つに統合した。

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

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

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

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

       1|2 次のページへ

Copyright © 2010 OSDN Corporation, All Rights Reserved.

Loading

ピックアップコンテンツ

- PR -

注目のテーマ

マーケット解説

- PR -