頭等物件
頭等物件(英語:First-class object),在電腦科學中,指称支持其他实体通常能获得的所有运算的实体。这些运算典型的包括:在執行期創造,作為參數傳遞給其他函數,或存入一個變數等[1]。將一個實體變為頭等物件的過程叫做「实化」(Reification)[2]。
「頭等物件」這一名稱最早由克里斯托弗·斯特雷奇在1960年代發明,原稱「頭等公民」(First-class citizen),意指函數可作為電腦語言中的頭等公民。英文中也稱「First-class entity」或「First-class value」。
历史
头等对象和二等对象的概念,在1960年由克里斯托弗·斯特雷奇引入。[3][4] 实际上他并没有给出严格的术语定义,而是给出了ALGOL语言中实数和过程的对比:
头等对象和二等对象。在Algol程序语言中,一个“实数”可能会出现在一个表达式中或被赋给一个变量,并可能在过程调用中作为实际参数出现。而“过程”只可能会出现在另一个过程调用中,最常见的是作为操作符,有时候也作为实参。除此之外,没有表达式会涉及到过程,或者将过程作为计算结果。因此在某种意义上,在Algol程序语言中的过程是二等公民,它们总是会单独出现,不可能被一个表达式或一个变量表示(形式参数除外)…[5]
定義
頭等物件不一定是物件導向程式設計所指的物件,而可以指任何程式中的實體。Robin Popplestone给出如下定义:
- 所有项目都有特定的基本权力。
- 所有项目都可以作为函数的实际参数。
- 所有项目都可以作为函数的结果返回。
- 所有项目都可以是赋值语句的主体。
- 所有项目都可以等式测试。[8]
範例
最简单的标量数据类型,比如整数和浮点数,几乎总是头等的。在很多较早的语言中,数组和字符串不是头等的:它们不能被作为赋值的对象,或作为形式参数传递给子例程。例如,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 | |
头等多态 | 非直谓多态 | |
头等消息 | 动态消息(方法调用) | Smalltalk[9], Objective-C[9], Common Lisp |
头等类 | 元类 | Smalltalk, Objective-C, Ruby, Python, Delphi, Common Lisp |
头等证明 | 证明对象[10] | Coq, Agda |
参考文献
- ^ Scott, Michael. Programming Language Pragmatics. San Francisco, CA: Morgan Kaufmann Publishers. 2006: 140.
- ^ J. Malenfant, M. Jacques and F.-N. Demers. A Tutorial on Behavioral Reflection and its Implementation. parc.com. [2010-10-09]. (原始内容存档于2010-05-28).
- ^ Rod Burstall, "Christopher Strachey—Understanding Programming Languages", Higher-Order and Symbolic Computation 13:52 (2000)
- ^ Harold Abelson; Gerald Jay Sussman. 章节1.3.4 脚注64. Structure and Interpretation of Computer Programs [计算机程序的构造和解释] 2. [2015-03-03]. (原始内容存档于2015-03-09) (英语).
- ^ 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
- ^ R. Finkel. Advanced Programming language Design. : 73 (英语).
- ^ Norman Ramsey. About first-,second- and third-class value. Stackoverflow. [14 September 2013] (英语).
- ^ R. J. Popplestone: The Design Philosophy of POP-2. in: D. Michie: Machine Intelligence 3, Edinburgh at the University Press, 1968
- ^ 9.0 9.1 Paritosh Shroff, Scott F. Smith. Type Inference for First-Class Messages with Match-Functions (页面存档备份,存于互联网档案馆)
- ^ Bove, Ana; Dybjer, Peter. Dependent Types at Work (PDF). Language Engineering and Rigorous Software Development. 2009, 5520: 57–99 [8 June 2015]. doi:10.1007/978-3-642-03153-3_2. (原始内容存档 (PDF)于April 2, 2014). (also archived (页面存档备份,存于互联网档案馆))