📑 Table of Contents

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

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

历史

编辑

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

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

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

定義

编辑

頭等物件不一定是物件導向程式設計所指的物件,而可以指任何程式中的實體。Robin Popplestone英语Robin Popplestone给出如下定义:

  1. 所有项目都有特定的基本权力。
  2. 所有项目都可以作为函数的实际参数。
  3. 所有项目都可以作为函数的结果返回。
  4. 所有项目都可以是赋值语句的主体。
  5. 所有项目都可以等式测试。[8]

範例

编辑

最简单的标量数据类型,比如整数和浮点数,几乎总是头等的。在很多较早的语言中,数组和字符串不是头等的:它们不能被作为赋值的对象,或作为形式参数传递给子例程。例如,FORTRAN IVC都不支持数组赋值,并且它们在作为形式参数传递的时候,实际上只有它们的第一个元素的位置被传递了,它们的大小失去了。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
头等多态 非直谓多态
头等消息英语first-class message 动态消息(方法调用) Smalltalk[9], Objective-C[9], Common Lisp
头等类 元类 Smalltalk, Objective-C, Ruby, Python, Delphi, Common Lisp
头等证明 证明对象[10] Coq, Agda

参考文献

编辑
  1. ^ Scott, Michael. Programming Language Pragmatics. San Francisco, CA: Morgan Kaufmann Publishers. 2006: 140. 
  2. ^ J. Malenfant, M. Jacques and F.-N. Demers. A Tutorial on Behavioral Reflection and its Implementation. parc.com. [2010-10-09]. (原始内容存档于2010-05-28). 
  3. ^ Rod Burstall, "Christopher Strachey—Understanding Programming Languages", Higher-Order and Symbolic Computation 13:52 (2000)
  4. ^ Harold Abelson; Gerald Jay Sussman. 章节1.3.4 脚注64. Structure and Interpretation of Computer Programs [计算机程序的构造和解释] 2. [2015-03-03]. (原始内容存档于2015-03-09) (英语). 
  5. ^ Christopher Strachey. Fundamental Concepts in Programming Languages (PDF). Higher-Order and Symbolic Computation 13:11 (2000). August, 1967 [2026-03-28]. (原始内容存档 (PDF)于2025-06-30). 
  6. ^ R. Finkel. Advanced Programming language Design. : 73 (英语). 
  7. ^ Norman Ramsey. About first-,second- and third-class value. Stackoverflow. [14 September 2013] (英语). 
  8. ^ R. J. Popplestone: The Design Philosophy of POP-2. in: D. Michie: Machine Intelligence 3, Edinburgh at the University Press, 1968
  9. ^ 9.0 9.1 Paritosh Shroff, Scott F. Smith. Type Inference for First-Class Messages with Match-Functions页面存档备份,存于互联网档案馆
  10. ^ 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页面存档备份,存于互联网档案馆))


📚 Artikel Terkait di Wikipedia

泛型编程

泛型程序设计(英文:generic programming)是程序设计语言的一种风格或范型。泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型。各种程序语言和其编译器、运行环境对泛型的支持均不同。Ada、Delphi、Eiffel、Java、C#、F#、Swift

运算符重载

magic methods overriding class properties. [7 April 2015]. (原始内容存档于4 March 2016).  Orwant, Jon. Computer Science & Perl Programming: Best of The Perl Journal

Dart

2011年Google在丹麥奧胡斯(Aarhus)舉行的“GOTO國際軟體開發大會”預告將釋出新網頁程式語言Dart,是一種類別為基的程式設計語言(class-based programming language),在所有瀏覽器都能夠有高效能的執行效率。2011年10月10日Google宣布推出Dart的預覽版。 Google在dartlang

代理人導向編程

STAN-CS-90-1335). Stanford University: Computer Science Department. 1990.  Shoham, Y. Agent-Oriented Programming. Artificial Intelligence. 1993, 60 (1):

Python

(computer programming))关键字,Python的对象方法沿袭自Modula-3,使用显式的第一个形式参数来访问实例特性,习惯上将其命名为self(英语:this (computer programming))。

艾伦·凯

阿倫甚至發明了Smalltalk编程语言,Smalltalk吸取了Simula的類(class)的概念,並發展出圖形使用者介面,即是蘋果麥金塔電腦的原型。1970年,鲍勃·泰勒(英语:Robert Taylor (computer scientist))成立帕羅奧多研究中心,阿伦·凯成為第一个雇员,他建立

参数多态

Fundamental Concepts in Programming Languages (Lecture notes), Copenhagen: International Summer School in Computer Programming, 1967 . Republished in:

方法链式调用

类似的语法是方法级联调用,即调用一个对象的多个方法的语法糖。方法级联调用可以使用方法链式调用来实现,即让每个方法返回当前对象本身(英语:this (computer programming))(this)。方法级联调用是流畅接口的一项关键技术,面向对象语言广泛实现了方法链式调用,但实现了方法级联调用的不多。链式和级联调用都来自