CLUは、
1974年から
1975年にかけて、
マサチューセッツ工科大学(MIT)の
バーバラ・リスコフを中心としたチームによって開発された
プログラミング言語です。この言語は、
オブジェクト指向プログラミングの重要なステップと見なされており、特に
抽象データ型のコンストラクタを備えている点が特徴です。しかし、全体的なオブジェクト指向の機能は限られており、継承が無く、文法が扱いにくいという欠点もあります。結果として、CLUは完全なオブジェクト指向言語としての可能性を有しながらも、実際にはそのレベルに到達することはありませんでした。
CLUの文法とクラスター機能
CLUの文法は
ALGOLに基づいており、特に「クラスター」という概念が特徴的です。このクラスターは、CLUの型拡張システムの一部であり、言語名の由来でもある「CLUster」に由来しています。クラスターは、現在のオブジェクト指向言語の「オブジェクト」にほぼ相当するものであり、
複素数などのデータ型を実装するために使用されます。
例として、
複素数を定義するクラスターのコードが挙げられますが、CLUは当時の最先端の構造化プログラミングを実現していたものの、クラスター自体には構造を提供する仕組みが欠如しています。具体的には、クラスター名はグローバルで、クラスターをグループ化する
名前空間の機構もありません。さらに、クラスターの内部にネストして別のクラスターを作成することもできません。
このような特徴は、CLUに限らず
ALGOLの設計上の限界でもあります。また、CLUは暗黙の型変換を行わないため、クラスター内のデータ型の変換は明示的な操作('up' と 'down')を必要とします。これにより、より厳密な型チェックが実現されています。基本的なデータ型は不変(immutable)であり、可変(mutable)なデータ型も用意されている点は、他の多くの
プログラミング言語と共通の特徴です。
CLUの
型システムにおけるもう一つの重要な機能は「
イテレータ」です。
イテレータは集合からオブジェクトを順次取り出す仕組みを提供し、具体的なデータ型を意識せずに操作できる
ブラックボックスのような役割を果たします。このため、
複素数集合の
イテレータと整数集合の
イテレータは、同じインターフェースで扱うことが可能です。この
イテレータ機能は、近年の多くの
プログラミング言語において一般的に採用されています。
さらに、CLUは例外処理の機能も持ち合わせています。例外は`signal`によって発生させられ、`except`により処理されます。とはいえ、型設計が重視されているにもかかわらず、CLUには列挙型がなく、これを実装する方法もありません。
多重代入とメモリ管理
CLUの特異な機能として、多重代入があります。これは、代入演算子の左側に複数の変数を指定できるもので、例えば`x, y = y, x`というコードで変数の値を入れ替えることができます。また、関数も複数の値を返すことが可能であり、`x, y, z = f(t)`のように記述できます。CLU内のオブジェクトは全てヒープに存在し、メモリ管理は自動で行われるため、プログラマーが手動で管理する必要がありません。
CLUの影響とその後の展開
CLUは、その後の
プログラミング言語に多大な影響を与えました。特に
Pythonや
RubyはCLUの影響を色濃く受けており、例えば`yield`文や多重代入機能がその一例です。また、CLUは
AdaやC++のテンプレート機能にも影響を与えたと言われており、例外処理機構はJavaやC++の言語デザインにもその痕跡を残しています。さらに、
PythonのジェネレータやC#の
イテレータもCLUの
イテレータ機能に起源を持つとされています。このように、CLUは
プログラミング言語の発展において重要な役割を果たしてきました。
終わりに
CLUは、独自の機能と特徴を有しながらも限界もある言語でしたが、その影響力は広範であり、現在の多くの
プログラミング言語にその遺産が受け継がれています。