本页使用了标题或全文手工转换

第一類物件

维基百科,自由的百科全书
跳转至: 导航搜索

第一類物件英语First-class object)在電腦科學中指可以在執行期創造並作為參數傳遞給其他函數或存入一個變數的實體[1]。將一個實體變為第一類物件的過程叫做「物件化」(Reification)[2]

「第一類物件」這一名稱最早由Christopher Strachey在1960年代發明,原稱「第一類公民」(First-class citizen),意指函數可作為電腦語言中的第一類公民。英文中也稱「First-class entity」或「First-class value」。

历史[编辑]

第一类对象和第二类对象的概念,在1960年由Christopher Strachey 引入。[3][4] 实际上他并没有给出严格的术语定义,而是给出了Algol语言中实数和过程的对比:

第一类对象和第二类对象。在Algol程序语言中,一个“实数”可能会出现在一个表达式中或被赋给一个变量,并可能在过程调用中作为实际参数出现。而“过程”只可能会出现在另一个过程调用中,最常见的是作为操作符,有时候也作为实参。除此之外,没有表达式会涉及到过程,或者将过程作为计算结果。因此在某种意义上,在Algol程序语言中的过程是第二类变量,它们总是会单独出现,不可能被一个表达式或一个变量表示(形式参数除外)…[5]

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

定義[编辑]

第一類物件不一定是物件導向程式設計所指的物件,而可以指任何程式中的實體。一般第一類物件所特有的特性為:

  • 可以被存入變數或其他結構
  • 可以被作為參數傳遞給其他函數
  • 可以被作為函數的返回值
  • 可以在執行期創造,而無需完全在設計期全部寫出
  • 即使沒有被繫結至某一名稱,也可以存在

範例[编辑]

絕大多數語言中,數值與基礎型別都是第一類物件,然而不同語言中對函數的區別很大,例如C語言C++中的函數不是第一類物件,因為在這些語言中函數不能在執行期創造,而必須在設計時全部寫好。相比之下,Scheme中的函數是第一類物件,因為可以用lambda語句來創造匿名函數並作為第一類物件來操作。

參考資料[编辑]

  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]. 
  3. ^ Rod Burstall, "Christopher Strachey—Understanding Programming Languages", Higher-Order and Symbolic Computation 13:52 (2000)
  4. ^ Harold Abelson and Gerald Jay Sussman, Structure and Interpretation of Computer Programs, 2nd edition, section 1.3.4 footnote 64
  5. ^ 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
  6. ^ Finkel, R. Advanced Programming language Design, p 73
  7. ^ Norman Ramsey. About first-,second- and third-class value. http://stackoverflow.com. [14 September 2013].