原文: http://python-history.blogspot.com/2009/01/introduction-and-overview.html
原文投稿者: Guido van Rossum
Pythonは現在、もっとも人気のある動的言語のひとつである。この言語にはPerl, Tcl, PHP, そして新規参入のRubyなどがある。しかし、Pythonは本当はLispやSmalltalkのような汎用目的のプログラミング言語であるにもかかわらず(他の言語も同じであるが)、「スクリプト」言語として見られることが多い。今日、Pythonは使い捨てのスクリプト言語から、24時間365日間中断せずにサービスを提供する、巨大でスケーラブルなウェブサービスにまで幅広く使用されている。また、GUIやデータベースのプログラミングや、クライアントサイド、サーバーサイドのウェブプログラミング、そしてアプリケーションのテストにも使用されている。また、科学者が世界で一番早いスーパーコンピュータ向けのプログラムを書いたり、子供がプログラムを初めて学ぶ言語としても使用されている。
このブログでは、Pythonの歴史にスポットライトをあてようと思う。特に、どのようにPythonが開発されてきたかや、どのように設計に影響を与えてきたか、どのように間違って、どのように学んできたか、そしてこの言語は将来どのような方向に進んでいるのかを紹介したい。
謝辞:私は、このブログで多くの良い文章を書くのに、Dave Beazleyのお世話になっている。(また、このブログを始めるきっかけについてはさらにお世話になった。私の他のブログを見て欲しい)
Pythonの概要Pythonを見た人の多くは、Pythonは表面的にはC言語やPascalといった、伝統的なプログラミング言語に似たコードが書けるため、Pythonコードの見た目に関して感銘を感じる人が多い。これは偶然の一致ではない。PythonはC言語から、文法の多くの要素をもらってきているからである。例えば、多くのPythonのキーワード(if, else, while, forなど)はC言語と同じであるし、Pythonの識別子(関数名など)のルールはC言語と同じであるし、ほとんどの標準の演算子はC言語と同じ意味を持っている。もちろん、PythonとCは完全に一致しているわけではない。一番大きな違いは、C言語が文のグループ化に中括弧を使用する代わりに、Pythonではインデントを使用している点である。たとえば、以下のようなC言語のコードがあったとする。
if (a < b) { max = b; } else { max = a; }
Pythonはただ中括弧をすっかりとりはらった(ついでにセミコロンも置き去りにしてきた)だけで、以下のような構造をしている。
if a < b: max = b else: max = a
これ以外のPythonがC言語のような言語と大きく異なる領域としては、動的な型を使う部分もそうである。C言語では常に、変数を定義する際は、intやdoubleといった型情報を与えて、宣言を明示する必要がある。この情報は、プログラムのコンパイル時の静的なチェックで使用されるだけでなく、変数の値を格納する際のメモリの位置の割り当てでも使用される。Pythonでは、変数はオブジェクトを参照するための名前でしかない。変数は代入する前に宣言する必要はなく、プログラムの実行中に型を変えてしまってもかまわない。他の動的言語と同様に、すべての型のチェックは、事前に行われるコンパイル時に行われるのではなく、インタプリタにより実行される時に行われる。
Pythonではプリミティブな組み込みのデータ型にはブール型, 数値(コンピュータの数値表現, 任意精度の数値、実数の浮動小数点数, 複素数の浮動小数点数), 文字列(8ビット, ユニコード)がある。これらはすべてイミュータブル(変更不可能)な型である。これは作成された後には、オブジェクトで表現された値は変更できないということを意味している。組み込みの複合データ型にはタプル(変更不可能な配列)、リスト(サイズの変更が可能な配列)、辞書(ハッシュテーブル)がある。
プログラムを組み立てるための仕組みとして、Pythonはパッケージ(モジュールやパッケージをグループにしたもの), モジュール(ひとつのソースファイルの中で定義され、関係付けられたコード群), クラス、メソッド、関数をサポートしている。フロー制御としては if/else, while, 任意の"反復可能"なオブジェクトの中でループを行う高レベルなfor文をサポートしている。エラー処理の機能としては、Pythonは例外を使用する。Pythonの例外は中断後の再開はできない。raise文で例外を投げ、try/except/finally文を使用して例外の処理方法を定義する。組み込みの操作は、エラーの状況に遭遇すると例外を投げるようになっている。
Pythonでは、すべての名前の付けられるオブジェクトは「ファーストクラス」であると言える。ファーストクラスというのは、関数、クラス、メソッド、モジュール、その他のすべての名前の付けられるオブジェクトは、実行時に自由にパラメータとして渡したり、分析(inspect)したり、さまざまなデータ構造(リストや辞書など)に格納したりすることができる。オブジェクトについても説明すると、Pythonではユーザ定義クラス、継承、実行時のバインディングといったオブジェクト指向プログラミングをフルサポートしている。
Pythonは大規模な標準ライブラリを持っている。Pythonの人気がある主な理由のひとつである。標準ライブラリは100以上のモジュールで構成されており、今でも追加され続けている。これらのモジュールの中には、正規表現のマッチング、標準の算術関数、スレッド、OSのインタフェース、ネットワークプログラミング、インターネットの標準プロトコル(HTTP, FTP, SMTPなど)、Eメール、XML処理、HTMLのパース、そしてGUIツールキット(Tcl/Tk)などがある。
これに加え、サードパーティで作成されている、大量のモジュールやパッケージなどもある。これらの多くはオープンソースである。探してみると、リストにできないほど大量のウェブのフレームワーク、多くのGUIツールキット、高効率な算術ライブラリ(多くのポピュラーなFortranのパッケージのラッパーも含む)、データベースのインタフェース(Oracle, MySQLなど), SWIG(任意のC++ライブラリからPythonモジュールを作成するツール)などがある。
Python(さらにいえば、他の動的な言語も)の主要な魅力は、とても複雑に見えるタスクを、とても少ないコードで表現できるというところにある。以下のシンプルなPythonスクリプトは、ウェブページを取得し、URL参照を探してし、最初の10個を画面に出力するサンプルである。
# Webをスキャンして参照を探す import re import urllib regex = re.compile(r'href="([^"]+)"') def matcher(url, max=10): "最初のいくつかのURL参照を探し出して出力する" data = urllib.urlopen(url).read() hits = regex.findall(data) for hit in hits[:max]: print urllib.basejoin(url, hit) matcher("http://python.org")
このプログラムを改造してウェブのクローラーを作成するのは簡単であるし、実際、Scott Hassanは私に、Googleの最初のウェブクローラーはPythonで書かれたんだ、と教えてくれたことがあった。今日、Googleでは、広告管理の自動化システムの構築から、社内の業務のさまざまな側面の管理まで、数百万行のPythonコードを使用している。(注意: 私は現在、Googleの従業員でもある。)
目に見えない裏側では、Pythonはバイトコンパイラとインタプリタを組み合わせるというオーソドックスな実装になっている。コンパイルはモジュールのロード時に暗黙的に行われる。また、いくつかの言語の下層部では、実行時にコンパイラが利用可能であることが必須となっている。PythonではC言語で書かれている実装がのデファクトスタンダードであるが、想像しうる限りすべてのハードウェアやソフトウェアのプラットフォーム上で使用することができる。最近では、C言語以外で実装されている処理系が人気になりつつある。JythonはJVM上で実行されるバージョンで、Javaとシームレスな統合が可能となっている。IronPythonはMicrosoftの.NETプラットフォームのためのバージョンであり、同様に.NET上で動作する他の言語と統合することができる。PyPyはPythonの最適化コンパイラ/インタプリタであり、Pythonで実装されている。PyPyはEUの基金の下で活動する研究プロジェクトである。また、C言語の他のバリエーションの実装として、Stackless Pythonもある。これは、関数やメソッドの呼び出しのC言語のスタックへの依存を減らした実装で、コルーチンや継続、マイクロスレッドをサポートしている。
0 件のコメント:
コメントを投稿