2009年4月30日木曜日

どのようにして、すべてが実行可能文になったのか?

原文:http://python-history.blogspot.com/2009/03/how-everything-became-executable.html
原文投稿者:Guido van Rossum

新しくPythonユーザになった人の中には、関数やクラスの定義まで含めて言語のすべてが実行可能文であるということを知って驚く人がいる。これは、あらゆるコードがプログラムのどこにでも現れることがある、ということを意味している。書こうと思えば、例えば"if"文の中に関数の定義を書くことも可能である。

最初の頃のバージョンのPythonの文法ではこのようにはなっていなかった。文法要素には「宣言フレーバー」と言うものがあり、import文や関数宣言などに使用されていた。これはその効果を使用したいと思うモジュールやスクリプトのトップレベルにしか置くことはできなかった。しかし、クラスのサポートを追加したときに、この文法は制限が多すぎると考えるようになった。

私の頭の中ではおおまかに以下のように推論していった。一連の関数宣言のみを使ってクラス本体の定義をするよりも、通常の変数割り当てをクラスの中で行った方がシンプルで道理に合っているだろう。しかし、これを許すのであれば、なぜもう一歩進めて、任意のコードの実行を許さないのだろうか?もしくは、さらに進めて、例えば"if"文の中に関数宣言を置くというようなことを認めてもいいのではないか?これを許可すると、文法をシンプルにすることができると即座に閃いた。インデントされているか否かにかかわらず、現在ある使用している文法と同じルールを共有することも可能である。そして、これらの文法を実現するのには、通常のコンパイラと同じバイトコードジェネレータ機能が利用できることが分かった。

この推論によって文法はシンプルになり、ユーザはPythonのコードをどこにでも書けるようになった。しかし、この機能は特定のプログラミングのスタイルのために必要だったというわけではない。例えば、Pythonではスコープのネストはサポートされていないが、技術的には関数宣言をネストするようなことも可能であった。そのような機能を念頭にいれてきちんと設計された言語と比べると、未定義な操作や、壊れた操作を引き起こす可能性もある。時間をかけて、多くのこれらの「壊れた」機能は修正されてきた。例えば、Python2.1以降は、ネストされた関数定義もきちんと動作するようになった。

0 件のコメント:

コメントを投稿