頭等物件
頭等物件(英語:First-class object),在電腦科學中,指稱支持其他實體通常能獲得的所有運算的實體。這些運算典型的包括:在執行期創造,作為參數傳遞給其他函數,或存入一個變數等[1]。將一個實體變為頭等物件的過程叫做「實化」(Reification)[2]。
「頭等物件」這一名稱最早由克里斯托弗·斯特雷奇在1960年代發明,原稱「頭等公民」(First-class citizen),意指函數可作為電腦語言中的頭等公民。英文中也稱「First-class entity」或「First-class value」。
歷史
[編輯]頭等對象和二等對象的概念,在1960年由克里斯托弗·斯特雷奇引入。[3][4] 實際上他並沒有給出嚴格的術語定義,而是給出了ALGOL語言中實數和過程的對比:
頭等對象和二等對象。在Algol程序語言中,一個「實數」可能會出現在一個表達式中或被賦給一個變量,並可能在過程調用中作為實際參數出現。而「過程」只可能會出現在另一個過程調用中,最常見的是作為操作符,有時候也作為實參。除此之外,沒有表達式會涉及到過程,或者將過程作為計算結果。因此在某種意義上,在Algol程序語言中的過程是二等公民,它們總是會單獨出現,不可能被一個表達式或一個變量表示(形式參數除外)…[5]
在1990年代,拉斐爾·芬克爾提出了二等值和三等值的定義[6],但這些定義尚未被廣泛採用。[7]
定義
[編輯]頭等物件不一定是物件導向程式設計所指的物件,而可以指任何程式中的實體。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 (頁面存檔備份,存於網際網路檔案館))