| CLU | |
|---|---|
| パラダイム | マルチパラダイム:クラスベース、手続き型 |
| デザイン : | バーバラ・リスコフと彼女の生徒たち |
| 開発者 | マサチューセッツ工科大学 |
| 初 登場 | 1975年 (1975年) |
| 安定放出 | |
| タイピングの規律 | 強い |
| Webサイト | pmg |
| 主な実装例 | |
| PDP-10 CLU、[ 3 ]ネイティブ CLU、[ 1 ]ポータブル CLU、[ 2 ] clu2c [ 4 ] | |
| 影響を受けた | |
| ALGOL 60、Lisp、Simula、Alphard | |
| 影響を受けた | |
| Ada、Argus、C++、[ 5 ] Lua、Python、[ 6 ] Ruby、Sather、Swift [ 7 ] | |
CLUは、 1973年にバーバラ・リスコフと彼女の学生によってマサチューセッツ工科大学(MIT)で作成されたクラスベースのプログラミング言語です。[ 8 ]広く普及したわけではありませんが、現在広く使用されている多くの機能を導入しており、オブジェクト指向プログラミング(OOP)の発展における一歩と見なされています。
主な貢献としては、抽象データ型、[ 9 ]呼び出し共有、イテレータ、複数の戻り値(並列代入の一形態)、型安全なパラメータ化型、型安全なバリアント型などが挙げられる。また、継承を用いずにコンストラクタとメソッドを持つクラスを使用している点も注目に値する。
CLUの構文は、当時ほとんどの新しい言語設計の出発点であったALGOLに基づいていた。重要な追加要素は、CLUの型拡張システムであり、言語名(CLUster)の語源でもあるクラスタの概念である。 [ 10 ]クラスタは一般的に、オブジェクト指向言語の「クラス」の概念に対応する。例えば、複素数を実装するクラスタのCLU構文は次のようになる。
complex_number = cluster は加算、減算、乗算、... rep = record [ real_part: real, imag_part: real ] add = proc ... end add; subtract = proc ... end subtract; multiply = proc ... end multiply; ... 複素数終了; クラスタはデータ抽象化を実装します。データ抽象化とは、オブジェクトのセットと、それらのオブジェクトを作成および操作するためのプリミティブ操作のセットです。[ 11 ]: 1.3これらは、最近のオブジェクト指向言語のクラスのパブリックコンポーネントに相当します。クラスタはまた、クラスタの外部で名前を付けることができる型(この場合は「complex_number」)を定義しますが、その表現型(rep)は外部クライアントから隠蔽されます。
クラスター名はグローバルであり、クラスターをグループ化したり、他のクラスター内に「ローカル」に作成したりするための名前空間メカニズムは提供されていません。
クラスタでは、明示的な型変換は抽象型と表現の間で上下に変化します。これらの型間の暗黙的な変換は、特殊型 cvt を使用して示されます。CLUはそれ以外の暗黙的な型変換は実行しません。普遍型any と、オブジェクトが特定の型であるかどうかをチェックする手続き force[] があります。オブジェクトは可変または不変であり、後者は整数、ブール値、文字、文字列などの基本型です。 [ 10 ]
CLU 型システムのもう 1 つの重要な機能はイテレータです。イテレータは、コレクションからオブジェクトを 1 つずつ順番に返します。[ 10 ]イテレータは、使用するデータに関係なく、同一のアプリケーション プログラミング インターフェイスcomplex_number(API) を提供します。したがって、 のコレクションのイテレータは、 の配列のイテレータと互換的に使用できますinteger。CLU イテレータの特徴は、コルーチンとして実装され、各値がyieldステートメントを介して呼び出し元に提供されることです。CLU のイテレータのようなイテレータは、現在では C#、Ruby、Python などの多くの現代的な言語の一般的な機能となっていますが、最近ではジェネレータと呼ばれることがよくあります。
CLUには、他の言語でのさまざまな試みを基にした例外処理signalも含まれています。例外は を使用して発生し、 を使用して処理されますexcept。例外処理を備えた他のほとんどの言語とは異なり、例外は呼び出しチェーンに暗黙的に再通知されません。また、例外処理を提供する他のほとんどの言語とは異なり、CLUの例外は通常の実行フローの一部とみなされ、ループから抜け出したり関数から戻ったりするための「通常」かつ効率的な型安全な方法とみなされます。これにより、他の条件が適用される場合を除き、戻り値を直接割り当てることができます。キャッチも再通知もされない例外は、通常プログラムを終了させる特別な失敗例外に即座に変換されます。
CLUは、 MLという言語よりも先に、oneofと呼ばれる型安全なバリアント型を初めて導入した言語としてよく知られています。
CLU の最後の特徴は並列代入(多重代入) であり、代入演算子の左辺に複数の変数を記述できます。たとえば、と記述すると、とが交換されます。同様に、関数は、のように複数の値を返すことができます。並列代入 (ただし、複数の戻り値ではない) は CLU より前にCPL (1963) に登場し、同時代入[ 12 ]と呼ばれていましたが、CLU がそれを普及させ、後の言語における並列代入に直接影響を与えたとよく言われています。x,y := y,xxyx,y,z := f(t)
CLUプログラム内のすべてのオブジェクトはヒープ領域に存在し、メモリ管理は自動的に行われます。
CLUは、型パラメータ化されたユーザー定義データ抽象化をサポートしています。型安全な境界付きパラメータ型を初めて提供した言語であり、where句を使用して実際の型引数に対する制約を表現します。テンプレートベースのジェネリクスを持つ言語とは異なり、このようなデータ抽象化の使用は、抽象化の実装にアクセスすることなく型チェックできます。
CLUとAdaはC++テンプレートの主要なインスピレーション源となった。[ 5 ]
CLUの例外処理メカニズムは、C++ [ 5 ]やJavaなど、後の言語に影響を与えた。[ 13 ]
Sather、Python、C#にはイテレータが含まれており、これはCLUで初めて登場しました。[ 8 ]
"CLU"を"Python"に、"record"を"instance"に、"procedure"を"function or method"に置き換えると、Pythonのオブジェクトモデルのかなり正確な説明が得られます。
Swift 言語は、言語のエキスパート、ドキュメント作成の達人、コンパイラ最適化の達人、そしてアイデアの洗練と実戦テストに役立つフィードバックを提供してくれた非常に重要な社内ドッグフーディンググループのたゆまぬ努力の産物です。もちろん、Objective-C、Rust、Haskell、Ruby、Python、C#、CLU など、挙げきれないほど多くの言語からアイデアを取り入れ、この分野の他の多くの言語が苦労して得た経験からも大いに恩恵を受けています。
MatzはブロックがRubyの最大の発明だと考えている(私も同感だ)。彼はこのアイデアを、MITの1970年代のCLUという言語から得た。CLUではブロックを「イテレータ」と呼んでいた...