| パラダイム | マルチパラダイム:オブジェクト指向、手続き型 |
|---|---|
| デザイン: | バーバラ・リスコフと彼女の生徒たち |
| 開発者 | マサチューセッツ工科大学 |
| 初登場 | 1975年 |
| 安定版リリース | |
| タイピングの規律 | 強い |
| Webサイト | 翻訳元: |
| 主な実装 | |
| 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]クラスターは、一般にOO言語の「クラス」の概念に対応しています。たとえば、複素数を実装するクラスターのCLU構文は次のとおりです。
complex_number = cluster は加算、減算、乗算などです。
rep = レコード [ 実数部分: 実数、 虚数部分: 実数 ]
add = proc ... 終了 add;
減算 = proc ... 減算終了;
multiply = proc ... 終了 multiply;
...
複素数の終了;
クラスターは、"is" 句で明示的に指定されたものを除くすべてのコンポーネントをカプセル化するモジュールです。これらは、最近の OO 言語のクラスのパブリック コンポーネントに対応します。クラスターは、クラスターの外部で名前を付けることができる型 (この場合は "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 の最後の特徴は並列代入(多重代入) です。並列代入では、代入演算子の左側に複数の変数を使用できます。たとえば、と記述すると、とx,y := y,xの値を交換します。同様に、関数は のように複数の値を返すことができます。並列代入 (複数の戻り値ではない) は CLU より古く、CPL (1963)に同時代入という名前で登場しました[11]。しかし、CLU によって普及し、後の言語における並列代入に直接影響を与えたとよく言われています。
xyx,y,z := f(t)
CLU プログラム内のすべてのオブジェクトはヒープ内に存在し、メモリ管理は自動的に行われます。
CLU は、型パラメータ化されたユーザー定義のデータ抽象化をサポートします。これは、実際の型引数に対する制約を表現するwhere 句を使用して、型セーフな境界パラメータ化型を提供する最初の言語でした。テンプレートベースのジェネリックを持つ言語とは異なり、このようなデータ抽象化の使用は、抽象化の実装にアクセスしなくても型チェックできます。
影響
CLUとAdaはC++ テンプレートの大きなインスピレーションとなった。[5]
CLUの例外処理メカニズムは、C++ [5]やJavaなどの後の言語に影響を与えました。[要出典]
Sather、Python、C#にはイテレータが含まれており、これはCLUで初めて登場しました。[8]
PerlとLuaはCLUからの関数呼び出しから複数の代入と複数の戻り値を受け取りました。[12]
PythonとRubyは共有呼び出し、yield文[13] 、多重代入[14]を借用した。
参考文献
- ^ ab Curtis, Dorothy (2009-11-06). 「CLU ホームページ」。プログラミング方法論グループ、コンピュータサイエンスおよび人工知能研究所。マサチューセッツ工科大学。2016年 5 月 26 日閲覧。
- ^ ab Curtis, Dorothy (2009-11-06). 「/pub/pclu のインデックス」。プログラミング方法論グループ、コンピュータサイエンスおよび人工知能研究所。マサチューセッツ工科大学。2016年 5 月 26 日閲覧。
- ^ 「CLU ファイル、1976~1989」。Tapes of Tech Square (ToTS) コレクション、MC-0741。マサチューセッツ工科大学特別コレクション部門。swh:1:dir:5dc935d1c236b15a99b0750cf236b2d89ec951d0。
- ^ うしじま、てつ。 「clu2c」。clu2c。ウッドシープ.jp 。2016 年 5 月 26 日に取得。
- ^ abc Stroustrup, Bjarne (1996). A History of C++: 1979--1991. ニューヨーク、ニューヨーク、米国: Association for Computing Machinery. pp. 699– 769. doi :10.1145/234286.1057836 . 2022年3月25日閲覧。
- ^ Lundh, Fredrik. 「Call By Object」. effbot.org . 2019年11月23日時点のオリジナルよりアーカイブ。2017年11月21日閲覧。
「CLU」を「Python」、「レコード」を「インスタンス」、「プロシージャ」を「関数またはメソッド」に置き換えると、Python のオブジェクト モデルのかなり正確な説明が得られます。
- ^ Lattner, Chris (2014-06-03). 「Chris Lattner のホームページ」. Chris Lattner . 2014-06-03に取得。Swift
言語は、言語の専門家、ドキュメンテーションの達人、コンパイラ最適化の達人、そしてアイデアの洗練と実戦テストに役立つフィードバックを提供してくれた非常に重要な社内ドッグフーディング グループのチームによるたゆまぬ努力の成果です。もちろん、この分野の他の多くの言語が苦労して得た経験からも大きな恩恵を受けており、Objective-C、Rust、Haskell、Ruby、Python、C#、CLU など、数え切れないほど多くの言語からアイデアを得ています。
- ^ ab Liskov, Barbara (1992). 「CLU の歴史」。プログラミング言語の歴史に関する第 2 回 ACM SIGPLAN 会議。
- ^ Liskov, Barbara ; Zilles, Stephen (1974). 「抽象データ型によるプログラミング」。ACM SIGPLAN シンポジウム「超高水準言語」の議事録。pp . 50– 59。CiteSeerX 10.1.1.136.3043。doi : 10.1145/800233.807045。
- ^ abc Liskov, B. ; Snyder, A.; Atkinson, R.; Schaffert, C. (1977 年 8 月). 「CLU の抽象化メカニズム」. Communications of the ACM . 20 (8): 564– 576. CiteSeerX 10.1.1.112.656 . doi :10.1145/359763.359789. S2CID 17343380.
- ^ Barron, DW; Buxton, JN; Hartley, DF; Nixon, E.; Strachey, C. (1963). 「CPL の主な特徴」. Computer Journal . 6 (2): 134– 143. doi : 10.1093/comjnl/6.2.134 .
- ^ Ierusalimschy, R.; De Figueiredo, LH; Celes, W. (2007). 「Lua の進化」(PDF) 。プログラミング言語の歴史に関する第 3 回 ACM SIGPLAN 会議の議事録 - HOPL III。pp. 2-1 – 2-26。doi :10.1145/ 1238844.1238846。ISBN 978-1-59593-766-72010年7月3日にオリジナルからアーカイブ(PDF)されました。
- ^ 「Ruby のルーツと Matz のリーダーシップ」 。Appfolio Engineering。2019年 11 月 8 日。2019年 11 月 15 日閲覧。Matz
は、ブロックが Ruby の最大の発明であると考えています (私も同感です)。彼は、1970 年代に MIT が開発した CLU という言語からこのアイデアを得ました。この言語ではブロックは「イテレータ」と呼ばれていました...
- ^ 「関数型プログラミング HOWTO — Python 3.8.3 ドキュメント」。docs.python.org 。2020 年 5 月 25 日閲覧。
外部リンク
- 公式サイト
- Liskov, Barbara (1992 年 4 月)。「CLU の歴史」(PDF)。MIT-LCS-TR-561。2003 年 9 月 17 日のオリジナル(PDF)からアーカイブ。
- clu2c: CLU コードをCにコンパイルするプログラム
- プログラミング言語辞書
- 「99本のビール」多言語デモアルゴリズムサイトでのCLU比較
- リスコフ、B.アトキンソン、R.ブルーム、T.モス、E.シャッファート、JC。シャイフラー、R.スナイダー、A. (1981)。CLU リファレンス マニュアル。コンピューターサイエンスの講義ノート。 Vol. 114. スプリンガー。土井:10.1007/BFb0035014。ISBN 9783540108368. S2CID 27382594。
