**CLU** on käännettävä abstrakteja tietotyyppejä tukeva akateeminen ohjelmointikieli vuodelta 1974. Siinä on ensimmäistä kertaa toteutettu iteraattorit, muuttamattomat (immutable) tietotyypit ja syntaktinen sokerointi jotka kaikki ovat ominaisuuksia, jotka ovat vasta nyt yleistymässä tuotanto-ohjelmointikielissä kuten Ruby ja Python.

Nimi CLU tulee sanoista *CLUster programming language*.

Historia
--------

CLU kehitettiin yhdysvaltalaisessa MIT-yliopistossa 1974 professori Barbara Liskovin johdolla. Tarkoituksena oli tutkia abstrakteja tietotyyppejä.

CLU-ohjelmointikielellä on toteutettu muutamia täysin toimivia tutkimusprojekteja (tekstintoimitin, käyttöjärjestelmä), mutta varsinaisessa tuotanto-ohjelmoinnissa sitä ei ole käytetty.

Suomessa on kehitetty CLU:n pohjalta tutkimusprojektissa uusi ohjelmointikieli nimeltä XE vuonna 1989.

Ominaisuuksia
-------------

Vaikka CLU:ssa on stattinen käännösaikainen tyypitys, CLU:n tietotyypit ovat melko joustavia ja niille on roskankeruu.

### Abstraktit tietotyypit

CLU-ohjelmointikielessä voidaan toteuttaa abstrakteja tietotyyppejä. Näitä kutsutaan klustereiksi. Klusteri vastaa oliokielten luokkia, mutta CLU ei ole varsinainen olio-ohjelmointikieli vaikka siihen on otettu vaikutteita myös ensimmäisesti olio-ohjelmointikielestä, Simula 67:stä.

Esimerkiksi kompleksiluvut määrittelevä klusteri näyttäisi CLU-ohjelmointikielellä seuraavalta:

```
     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;

```

**rep** määrittelee tietotyypin sisäisen esitysmuodon eikä siihen ole pääsyä klusterin ulkopuolelta.

C++-ohjelmointikielen mallit (templates) ovat saaneet vaikutteita CLU:n abstraktien tietotyyppien käsittelystä.

CLU:ssa ei ole tietotyyppien perintää.

### Iteraattorit

CLUssa on ensimmäisenä toteutettu iteraattorit. Nykyisistä ohjelmointikielistä iteraattorit ovat keskeinen Ruby-ohjelmointikielen rakenne. Myös uusissa Python-ohjelmointikielen toteutuksissa voi käyttää helposti iteraattoreita.

Iteraattori on mekanismi, jolla silmukkarakenteella voidaan käydä läpi abstraktin tietotyypin arvoja.

### Syntaktinen sokerointi

CLU-ohjelmointikielessä on esimmäisenä otettu käyttöön termi syntaktinen sokerointi. Se tarkoittaa sitä, että esimerkiksi "1+1" on vain merkintä, joka tulkitaan abstraktin tietotyypin "kokonaisluku" operaatioksi "add". "1+1" tulkitaan jo syntaktisella tasolla samanlaiseksi operaatioksi kuin esimerkiksi nykyaikaisen ohjelmointikielen metodikutsut.

Syntaktinen sokerointi on käytössä sekä Rubyssä että jossain määrin Pythonissa.

### Muuttamattomat tietotyypit

CLU:ssa on yleisimmistä tietotyypeistä sekä muutettavissa olevat että muuttamattomat *(immutable)* tietotyypit. Nykyaikaisista ohjelmointikielistä tämä on otettu käyttöön Pythonissa.

### Monisijoitus

CLU oli ensimmäinen ohjelmointikieli missä sijoituksen voi tehdä rinnakkain, esimerkiksi

```
    x,y = y,x

```

vaihtaa muuttujien x ja y arvot keskenään.

Myös funktion paluuarvon voi olla useampi arvo, jotka sijoitetaan useampaan muuttujaan (vrt. Pythonissa *tuple* funktion paluuarvona).

### Poikkeukset

CLU tukee poikkeuksia.

Lähteet
-------

1. ↑  J. Arkko & V. Hirvisalo & J. Kuusela & E. Nuutila & M. Tamminen, XE Reference Manual (XE Version 1.0), 1989. Dept. of Computer Science, Helsinki University of Technology, Helsinki, Finland
2. ↑  A History of CLU

Aiheesta muualla
----------------

* CLU:n kotisivu (historiallinen) (englanniksi)
* HOPL: an interactive Roster of Programming Languages - CLU (Arkistoitu – Internet Archive) (englanniksi)

|  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * n
* k
* m
Yleisimmät ohjelmointikielet |
| --- |
|  |
| Tuotantokäytössä | 
* Ada
* APL
* Assembly
* AWK
* C
* C++
* C#
* COBOL
* Dart
* Delphi
* Eiffel
* Erlang
* Forth
* Fortran
* Go
* Java
* JavaScript
* Kotlin
* Lisp
* Lua
* Objective-C
* Pascal
* Perl
* PHP
* PostScript
* Python
* R
* Ruby
* Rust
* Smalltalk
* Swift
* Tcl
* TypeScript
* Visual Basic

 |
|  |
| Akateemiset | 
* CLU
* Haskell
* Logo
* ML
* OCaml
* Prolog
* Scheme

 |
|  |
| Historialliset | 
* ALGOL
* BASIC
* Modula-3
* MUMPS
* Plankalkül
* PL/I
* Simula

 |
|  |
| Luettelo yleisimmistä ohjelmointikielistä |

 |