Oh 脳《121》Python が純粋な OOP 言語って本当ですか? episode: 1
|記事一覧|Oh 脳: after ZERO《其之佰弐拾壱》
Python が純粋な OOP 言語って本当ですか? episode: 1
Python3.1 の隘路
ハイブリッド型の OOP 言語の典型である Java/C# などと比べて、純粋な OOP 言語が謳い文句の Ruby/Python などは「純度が高い」と言えるでしょう。しかし、真の OOP を支援する Smalltalk などと比べて「 不純 な」部分が見え隠れします。これらの違いを金の「純度」に例えるなら、Smalltalk は 24K、Ruby/Python は 18K、Java/C# は金メッキというところでしょうか。
予約語を数える
「予約語の数」を引き合いに、プログラミング言語の優越を比較する話を耳にします。ともすると、Python は 予約語 が約 30 余と少ないことから、Java/C# より優位であるかのような論調になりがちです。Smalltalk を知る人からは「そんなに必要なの」とか「それは 多すぎる 」と批判されるかもしれません。
予約語の数は、言語仕様の複雑さ(肥大化)を警告する目安になります。予約語のいくつかは、構文規則に深く関係するもの(たとえば制御構造、定義など)があります。自然言語に例えると、これらの予約語の数は「基本構文」の数に相当します。
英語には、5つの基本文型がある(より詳細な区分法もありますが)とされます。基本文型(予約語)の数が多いことが、多彩な文章(コード)表現の糧となるなら価値があります。しかし、多くの予約語が「未熟な言語仕様のツケを清算する」ために必要とされたなら、いかがなものでしょうか。過去の歴史を紐解いて、複雑な言語仕様の末路を探ると、新たな視座が得られます。言語仕様だけを解説するのにどれだけの頁数を必要とするか、背表紙の厚さがそれを物語ります。
とはいえ、予約語の数を基準にするのは、ことさらステップ数を強調するのと同様に、本質的な議論に立ち入れずストレスが溜まります。
属性を参照する
閑話休題。これから、基本的な構文を引き合いに、その背景にある概念モデルに「統一性があるかないか」を検証します。多くの OOP 言語が、オブジェクトの属性を参照するのに、演算子「.」を利用します。
■ 複素数
Python3.1 でも、複素数に対して、
>>> c = 3+4j3.0 4.0各属性を参照することで、実数部 .real、虚数部 .imag の値を参照できます。変数を介さずに、リテラルに対して3.0 4.0としても、同じ結果が得られます。■ 実数
実数ならどうでしょうか。>>> r = 3.43.4 0.0実数は虚数部を持たないので、値は 0.0 になりますが、属性 .imag を参照できます。リテラルも同様に、3.4 0.0としても、同じ結果が得られます。■ 整数
整数ならどうでしょうか。>>> n = 33 0整数も虚数部を持たないので、値は 0 になりますが、属性 .imag を参照できます。リテラルも同様に、File "…と言いたいところですが、例外 SyntaxError を生成して、エラーメッセージが出力されます。 演算子「.」を用いて属性を参照するという、同じ構文規則に準拠しているはずが、それを許さないというのです。この状況を英語の基本文型に例えると、同類の単語に換えただけで、英文の規則に反すると見なされるのです。 他のプログラミング言語(Java/C#/Ruby など)で、同様の検証をするのも一興です。たとえば、", line 1 3.real; 3.imag ^ SyntaxError: invalid syntax 3.toString(); # Java 3.ToString(); # C#という具合です。これらのメソッドを選んだのは「すべてのオブジェクト」に有効とされているからです。残念ながら
言語仕様の不整合に関する問題点は、Python3.1 でも解消されていません。これらの問題点は、些細なことかもしれませんが、メタプログラミングでは大きな障害になります。いくつかのリテラルを特別扱いすると、コードを 汚染 するからです。言語仕様が「統一された概念モデル」に準拠していたら、特別扱いは不要です。みなさんは気付かずに「未熟な言語仕様のツケを 清算 する」羽目に陥っていませんか? 「純粋な」OOP 言語のひとつである Smalltalk なら、このような不整合では悩みません。ちなみに、Smalltalk には予約語がいくつあるでしょうか。まだある不純な部分
TO BE CONTINUED...Last updated♪2009/07/20