CLU

CLU は、1974年から1975年にかけてMITのバーバラ・リスコフが学生らと共に開発したプログラミング言語である。抽象データ型のコンストラクタ（操作コードを含む）を備えており、オブジェクト指向プログラミングへの重要なステップとなった。しかし、それ以外のオブジェクト指向の機能は欠けているか不完全であり、継承もなく、文法が扱いにくいことが欠点であった。CLU は完全なオブジェクト指向言語となる可能性を秘めていたが、実際にはそうならなかった。
クラスター.
CLU の文法は他の多くの言語と同様 ALGOL に基づいていた。重要な追加点として「クラスター; cluster」がある。クラスターとは、CLU の型拡張システムであり、言語名の由来でもある（CLUster）。クラスターは現在のオブジェクト指向言語で言えば「オブジェクト」にほぼ相当する。以下に複素数を実装した CLU のクラスターの例を示す:
 complex_number = cluster is add, subtract, multiply, ...
 rep = record [ real_part: real, imag_part: real ]
 add = proc ... end add;
 subtract = proc ... end subtract;
 multiply = proc ... end multiply;
 end complex_number;
クラスターは当時としては最新の構造化プログラミングを実現していたが、CLU はクラスター自体には全く構造を提供していない。クラスター名はグローバルであり、クラスターをグループ化するための名前空間機構も無く、クラスター内にクラスターをローカルに作ることもできない。このような問題は CLU に限ったことではない。ALGOLでの変数のスコープを何故クラスターやオブジェクトにも拡張しなかったのかは定かではない。
CLU は暗黙の型変換をしない。クラスターでは、明示的型変換 'up' と 'down' で抽象データ型とその実体との変換をする。汎用型 'any' が用意されていて、プロシージャ force[] でオブジェクトが所定の型であるかチェックする。オブジェクトは可変（mutable）と不変（immutable）があり、整数などの基本型は後者に含まれる。
その他の特徴.
もう1つの CLU の型システムでの重要な機能は「イテレータ; iterators」である。これは、集合からオブジェクトを順次取り出すものである。イテレータはブラックボックスであり、集合内のオブジェクトが何であるかを気にしないAPIを提供する。つまり、複素数の集合のイテレータと整数の集合のイテレータには区別がない。イテレータは最近の言語では一般的機能となっている。
CLU は他の言語での様々な試みに基づいた例外処理も備えている。例外は codice_1 を使って発生させられ、codice_2 で処理される。型の設計が重視されているにもかかわらず、CLU には列挙型がなく、列挙型を作る方法もなかった。
CLU の特殊な機能として、多重代入がある。代入記号の左辺に複数の変数を書くことができる。例えば、codice_3 というコードで codice_4 と codice_5 の値を入れ替えることができる。同様に関数は複数の値を返すことができ、codice_6 などと記される。
CLU プログラム内のオブジェクトは全てヒープにあり、メモリ管理は自動的に行われる。