頭等物件

頭等物件(),在電腦科學中,指称支持其他实体通常能获得的所有运算的实体。这些运算典型的包括:在執行期創造,作為參數傳遞給其他函數,或存入一個變數等。將一個實體變為頭等物件的過程叫做「实化」(Reification)。

「頭等物件」這一名稱最早由克里斯托弗·斯特雷奇在1960年代發明,原稱「頭等公民」(First-class citizen),意指函數可作為電腦語言中的頭等公民。英文中也稱「头等实体」(First-class entity)或「头等值」(First-class value)。

历史
头等对象和二等对象的概念,在1960年代由克里斯托弗·斯特雷奇引入。 实际上他并没有给出严格的术语定义,而是给出了ALGOL语言中实数和过程的对比:

头等和二等的对象。在ALOGL中,一个“实数”可能会出现在一个表达式中或被赋值给一个变量,并可能在过程调用中作为实际参数出现。而“过程”只可能会出现在另一个过程调用中,最常见的是作为运算符,有时候也作为实际参数。除此之外,没有表达式会涉及到过程,或者其结果会是过程。因此在一定意义上,在ALGOL中的过程是二等公民,它们总是会个人出现,不可能通过一个表达式或一个变量来表示(形式参数的情况除外),尽管我们可以写出(仍采用ALGOL)
  (if x > 1 then a else b) + 6
这是在a和b都是实数的时候,我们不能正确的写出
  (if x > 1 then sin else cos)(x)
也不能写出具有其自身为过程的结果的类型过程(ALGOL的最接近函数的方式)。

在1990年代,拉斐尔·芬克尔提出了二等值和三等值的定义,但这些定义尚未被广泛采用。

定義
頭等物件不一定是物件導向程式設計所指的物件,而可以指任何程式中的實體。给出如下定义:
#所有项目都有特定的基本权力。
#所有项目都可以作为函数的实际参数。
#所有项目都可以作为函数的结果返回。
#所有项目都可以是赋值语句的主体。
#所有项目都可以等式测试。

範例
最简单的标量数据类型,比如整数和浮点数,几乎总是头等的。在很多较早的语言中,数组和字符串不是头等的:它们不能被作为赋值的对象,或作为形式参数传递给子例程。例如,FORTRAN IV和C都不支持数组赋值,并且它们在作为形式参数传递的时候,实际上只有它们的第一个元素的位置被传递了,它们的大小失去了。C看起来支持数组指针的复制,但实际上它们只是到数组的第一个元素的指针,仍然不承载这个数组的大小。

不同語言中對函數的區別很大,例如C語言與C++中的函數不是頭等物件,因為在這些語言中函數不能在執行期創造,而必須在設計時全部寫好。相比之下,Scheme中的函數是頭等物件,因為可以用lambda表达式來創造匿名函數並作為頭等物件來操作。

参考文献

评论 (0)

  • 还没有评论,来抢沙发吧。