CLU是一门编程语言,由芭芭拉·利斯科夫和她的学生在1974年到1975年于麻省理工学院(MIT)创造。虽然它没有被广泛使用,但它引入了抽象数据类型[8],和许多现在广泛使用的特性,而被视为面向对象编程发展的重要一步。

Quick Facts 编程范型, 设计者 ...
CLU
编程范型多范型: 面向对象, 过程式
设计者芭芭拉·利斯科夫和她的学生
实作者麻省理工学院
发行时间1975年,​49年前​(1975
型态系统强类型
网站www.pmg.lcs.mit.edu/CLU.html
主要实作产品
Native CLU[1], Portable CLU[2], clu2c[3]
启发语言
ALGOL 60, Lisp[4], Simula[5]
影响语言
Ada, Argus, C++, Lua, Python[6], Ruby, Sather英语Sather, Swift[7]
Close

主要贡献还包括:传共享调用迭代器、多值返回(并行赋值形式)、参数化类型可变类型。值得注意的是它使用了具有构造器方法,但没有继承

聚类

CLU的语法基于了ALGOL,这是当时多数新语言设计的起点。关键增补是“聚类”(cluster)概念,它是CLU的类型扩展系统和语言名字的根源(CLUster)[9]。聚类一般对应于面向对象语言中“类”(class)的概念。例如,下面是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;

聚类是一个模块,它封装了除了那些在is子句中显式命名的成员之外的所有成员。这些成员对应于现在面向对象语言中一个类的公开成员。聚类还定义了可以在聚类之外引用名字的一个类型(在这个案例中是complex_number),但是它的表示类型(这里的rep)对于外部客户是隐藏的。

聚类名字是全局的,不提供名字空间机制来组织聚类,也不允许它们在其他聚类内部被“局部”创建。

CLU不进行隐式类型转换。在聚类中,显式类型转换updown抽象类型和表示之间进行变更。有一个全体类型any,和一个过程force[]来检查一个对象是否是一个特定类型。对象可以是可变的或不可变的,后者是基础类型,比如整数、布尔值、字符和字符串[9]

其他特征

CLU类型系统的另一个关键特征是迭代器,它一个接一个的按顺序的从一个搜集返回对象[9]。迭代器提供了一致的应用编程接口(API),而不管所用于的是什么数据。因此针对complex_number搜集的迭代器,与针对integer数组的迭代器,可以互换使用。CLU迭代器的显著特征是它们被实现为协程,每个值都是通过yield语句提供给调用者的。像CLU中这样的迭代器,现在是很多现代语言比如C#RubyPython的常见特征,然而它们近来经常被称为生成器。下面是迭代器的例子:

% 产生从1到n的奇数
odds = iter(n:int) yields int
    i:int
    i = 1
    while i < n do
        yield i
        i := i + 2
    end
end odds  
 
for i:int in odds(13) do
    print int$unparse(i) || "\n"
end

CLU还包括了异常处理,它参考了在其他语言中的各种尝试;异常使用signal引发,并通过except处理。不同于具有异常处理的多数其他语言,异常不会被隐式的沿着调用链重新发起。不同之处还有,在CLU中异常被当作是正常执行流程的一部分,并作为“正常”而有效的一种类型安全的方式,用来退出循环或从函数返回;这种方式下,“除非”其他条件适用,可以直接指定返回值。既未捕获也未显式的重新发起的异常,被立即转换成特殊失败异常,这典型的会终止程序。

CLU经常被引证为具有类型安全的可变类型的第一个语言,在这里叫作oneof,早于ML语言拥有的叫做代数数据类型标签联合

CLU中最后一个显著特征是并行赋值(多赋值),这里多于一个变量可以出现在赋值算符的左侧。例如,书写x,y := y,x将交换xy的值。以相同的方式,函数可以返回多个值,比如x,y,z := f(t)。并行赋值(但未包括多返回值),在CLU之前已经出现在CPL(1963年)之中,叫作“同时赋值”[10],然而确是CLU使之流行,并被引证为对后来语言中出现的并行赋值有直接的影响。

在CLU程序中所有对象都存活在堆中,而内存管理是自动化的。

CLU支持参数化类型的用户定义数据抽象。它是提供类型安全限定的参数化类型的第一个语言,它使用where子句结构,来表达在实际类型实际参数上的约束。

影响

CLU和AdaC++模板的主要启发者[11]

CLU的异常处理机制影响了后来的语言如C++Java[12]

Sather英语SatherPythonC#所包含的迭代器,最早出现在CLU中。

PerlLua采用的多赋值和从函数调用返回多个值来自CLU[13]

PythonRuby从它引入了传共享调用yield语句[14]和多赋值[15]

参考资料

外部链接

Wikiwand in your browser!

Seamless Wikipedia browsing. On steroids.

Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.

Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.