頭等物件

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

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

历史
头等对象和二等对象的概念，在1960年由克里斯托弗·斯特雷奇引入。Rod Burstall, "Christopher Strachey—Understanding Programming Languages", Higher-Order and Symbolic Computation 13:52 (2000) 实际上他并没有给出严格的术语定义，而是给出了ALGOL语言中实数和过程的对比：

头等对象和二等对象。在Algol程序语言中，一个“实数”可能会出现在一个表达式中或被赋给一个变量，并可能在过程调用中作为实际参数出现。而“过程”只可能会出现在另一个过程调用中，最常见的是作为操作符，有时候也作为实参。除此之外，没有表达式会涉及到过程，或者将过程作为计算结果。因此在某种意义上，在Algol程序语言中的过程是二等公民，它们总是会单独出现，不可能被一个表达式或一个变量表示（形式参数除外）…Christopher Strachey, "Fundamental Concepts in Programming Languages" in Higher-Order and Symbolic Computation 13:11 (2000); though published in 2000, these are notes from lectures Strachey delivered in August, 1967

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

定義
頭等物件不一定是物件導向程式設計所指的物件，而可以指任何程式中的實體。给出如下定义：
所有项目都有特定的基本权力。
所有项目都可以作为函数的实际参数。
所有项目都可以作为函数的结果返回。
所有项目都可以是赋值语句的主体。
所有项目都可以等式测试。R. J. Popplestone: The Design Philosophy of POP-2. in: D. Michie: Machine Intelligence 3, Edinburgh at the University Press, 1968

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

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

 概念  描述  语言 头等函数  闭包和匿名函数  Dart, Scheme, ML, Haskell, F#, Kotlin, Scala, Swift, Perl, PHP, Python, Raku, JavaScript, Delphi, Rust 头等控制  续体  Scheme, ML, F# 头等类型  依赖类型  Coq, Idris, Agda 头等数据类型   Generic Haskell, C++11 头等多态  非直谓多态     动态消息（方法调用） SmalltalkParitosh Shroff, Scott F. Smith. Type Inference for First-Class Messages with Match-Functions , Objective-C, Common Lisp 头等类  元类  Smalltalk, Objective-C, Ruby, Python, Delphi, Common Lisp 头等证明   证明对象  (also archived )  Coq, Agda

 参考文献 

Category:程序架構
Category:程序设计语言理论