CLU

CLU是一門程式語言，由芭芭拉·利斯科夫和她的學生在1974年到1975年於麻省理工學院（MIT）創造。雖然它沒有被廣泛使用，但它引入了抽象數據類型，和許多現在廣泛使用的特性，而被視為面向對象編程發展的重要一步。

主要貢獻還包括：傳共享調用、迭代器、多值返回（並行賦值形式）、參數化類型和可變類型。值得注意的是它使用了具有構造器和方法的類，但沒有繼承。

## 聚類

CLU的語法基於了ALGOL，這是當時多數新語言設計的起點。關鍵增補是「聚類」（cluster）概念，它是CLU的類型擴展系統和語言名字的根源（CLUster）。聚類一般對應於面向對象語言中「類」（class）的概念。例如，下面是CLU用來實現複數的語法：

```
complex_number = <span style="color:green;font-weight: bold;">cluster</span> <span style="color:green;font-weight: bold;">is</span> add, subtract, multiply, ...
    rep = <span style="color:green;font-weight: bold;">record</span> [ real_part: <span style="color:brown;">real</span>, imag_part: <span style="color:brown;">real</span> ]
    add = <span style="color:green;font-weight: bold;">proc</span> ... <span style="color:green;font-weight: bold;">end</span> add;
    subtract = <span style="color:green;font-weight: bold;">proc</span> ... <span style="color:green;font-weight: bold;">end</span> subtract;
    multiply = <span style="color:green;font-weight: bold;">proc</span> ... <span style="color:green;font-weight: bold;">end</span> multiply;
    ...
<span style="color:green;font-weight: bold;">end</span> complex_number;
```

聚類是一個模塊，它封裝了除了那些在`is`子句中顯式命名的成員之外的所有成員。這些成員對應於現在面向對象語言中一個類的公開成員。聚類還定義了可以在聚類之外引用名字的一個類型（在這個案例中是`complex_number`），但是它的表示類型（這裡的`rep`）對於外部客戶是隱藏的。

聚類名字是全局的，不提供名字空間機制來組織聚類，也不允許它們在其他聚類內部被「局部」創建。

CLU不進行隱式類型轉換。在聚類中，顯式類型轉換`up`和`down`在抽象類型和表示之間進行變更。有一個全體類型`any`，和一個過程`force[]`來檢查一個對象是否是一個特定類型。對象可以是可變的或不可變的，後者是基礎類型，比如整數、布爾值、字符和字串。

## 其他特徵

CLU類型系統的另一個關鍵特徵是迭代器，它一個接一個的按順序的從一個搜集返回對象。迭代器提供了一致的應用編程接口（API），而不管所用於的是什麼數據。因此針對`complex_number`搜集的迭代器，與針對`integer`陣列的迭代器，可以互換使用。CLU迭代器的顯著特徵是它們被實現為協程，每個值都是通過`yield`語句提供給調用者的。像CLU中這樣的迭代器，現在是很多現代語言比如C#、Ruby和Python的常見特徵，然而它們近來經常被稱為生成器。下面是迭代器的例子：

```
<span style="color:darkcyan;">% 产生从1到n的奇数</span>
odds = <span style="color:green;font-weight: bold;">iter</span>(n:<span style="color:brown;">int</span>) <span style="color:green;font-weight: bold;">yields</span> <span style="color:brown;">int</span>
    i:<span style="color:brown;">int</span>
    i = 1
    <span style="color:green;font-weight: bold;">while</span> i < n <span style="color:green;font-weight: bold;">do</span>
        <span style="color:green;font-weight: bold;">yield</span> i
        i := i + 2
    <span style="color:green;font-weight: bold;">end</span>
<span style="color:green;font-weight: bold;">end</span> odds  
<span> </span>
<span style="color:green;font-weight: bold;">for</span> i:<span style="color:brown;">int</span> <span style="color:green;font-weight: bold;">in</span> odds(13) <span style="color:green;font-weight: bold;">do</span>
    print int$unparse(i) || "\n"
<span style="color:green;font-weight: bold;">end</span>
```

CLU還包括了異常處理，它參考了在其他語言中的各種嘗試；異常使用`signal`引發，並通過`except`處理。不同於具有異常處理的多數其他語言，異常不會被隱式的沿著調用鏈重新發起。不同之處還有，在CLU中異常被當作是正常執行流程的一部份，並作為「正常」而有效的一種類型安全的方式，用來退出循環或從函數返回；這種方式下，「除非」其他條件適用，可以直接指定返回值。既未捕獲也未顯式的重新發起的異常，被立即轉換成特殊失敗異常，這典型的會終止程序。

CLU經常被引證為具有類型安全的可變類型的第一個語言，在這裡叫作`oneof`，早於ML語言擁有的叫做代數數據類型的標籤聯合。

CLU中最後一個顯著特徵是並行賦值（多賦值），這裡多於一個變量可以出現在賦值算符的左側。例如，書寫`x,y := y,x`將交換`x`和`y`的值。以相同的方式，函數可以返回多個值，比如`x,y,z := f(t)`。並行賦值（但未包括多返回值），在CLU之前已經出現在CPL（1963年）之中，叫作「同時賦值」，然而確是CLU使之流行，並被引證為對後來語言中出現的並行賦值有直接的影響。

在CLU程序中所有對象都存活在堆中，而記憶體管理是自動化的。

CLU支持參數化類型的使用者定義數據抽象。它是提供類型安全限定的參數化類型的第一個語言，它使用`where`子句結構，來表達在實際類型實際參數上的約束。

## 影響

CLU和Ada是C++的模板的主要啟發者。

CLU的異常處理機制影響了後來的語言如C++和Java。

Sather、Python和C#所包含的迭代器，最早出現在CLU中。

Perl和Lua採用的多賦值和從函數調用返回多個值來自CLU。

Python和Ruby從它引入了傳共享調用、`yield`語句和多賦值。

## 外部連結

- www.pmg.lcs.mit.edu/CLU.html
- A History of CLU (pdf)
- clu2c: a program to compile CLU code to C
- Dictionary of Programming Languages
- CLU comparison at '99 bottles of beer' multi-language demo algorithm site

## 基本資料

- 編程范型：多范型: 面向對象, 過程式
- 發行日期：1975年
- 設計者：芭芭拉·利斯科夫和她的學生
- 開發者：麻省理工學院
- 軟體版本週期：Native CLU 1.5 (SPARC, VAX) / 1989年5月26日、Portable CLU / 2009年11月6日
- 類型系統：強類型
- 軟體實現：Native CLU, Portable CLU, clu2c
- 受影響於：ALGOL 60, Lisp, Simula
- 施影響於：Ada, Argus, C++, Lua, Python, Ruby, Sather, Swift