プログラミングをやってると、第一級関数とか第一級オブジェクトというワードにぶつかります。
First-Classの和訳なんですが、決して、航空会社の超ド級美人添乗員にドキドキするところではありません。
言葉に馴染みはなくても、プログラミングをやってれば経験していることです。
『第一級』は一級品という意味か? 少なくとも英検一級とはちがう
まずは、Wikipediaの説明の冒頭を抜粋します。
計算機科学において、第一級関数(だいいっきゅうかんすう、英: first-class function、ファーストクラスファンクション)とは、関数を第一級オブジェクトとして扱うことのできるプログラミング言語の性質、またはそのような関数のことである。その場合その関数は、型のある言語では function type(en:Function type)などと呼ばれる型を持ち、またその値は関数オブジェクトなどになる。具体的にはプログラムの実行時に生成され、データ構造に含めることができ、他の関数の引数として渡したり、戻り値として返したりすることのできる関数をいう。この概念はメタプログラミングとは異なり、コンパイラ呼び出しやeval関数によって生成された関数は含まれない。無名関数も参照。
第一級関数 - Wikipedia
おぉう。長い一文にいろんな情報が詰め込まれて頭に入ってこない。
内容をサクッと省略してかんたんにすると、第一級オブジェクトの性質がある関数のことを第一級関数といいます。
(かなり削ったが今回の知りたい情報はこれだけ。)
『データ構造に含めることができる』
『他の関数の引数として渡せる』
『戻り値として返すことができる』
このあたりの文言を見てピンと来る人もいるんじゃないかな?
もうひとつ、第一級オブジェクトの内容も見てみましょう。
第一級オブジェクト(ファーストクラスオブジェクト、first-class object)は、あるプログラミング言語において、たとえば生成、代入、演算、(引数・戻り値としての)受け渡しといったその言語における基本的な操作を制限なしに使用できる対象のことである。ここで「オブジェクト」とは広く対象物・客体を意味し、必ずしもオブジェクト指向プログラミングにおけるオブジェクトを意味しない。第一級オブジェクトは「第一級データ型に属す」という。
第一級オブジェクト - Wikipedia
この言葉は1960年代にクリストファー・ストレイチーによって「functions as first-class citizens」という文脈で初めて使われた。
言語によって異なるが、第一級オブジェクトは概ね次のような性質をもつ。
・無名のリテラルとして表現可能である。
・変数に格納可能である。
・データ構造に格納可能である。
・それ自体が独自に存在できる(名前とは独立している)。
・他のものとの等値性の比較が可能である。
・プロシージャや関数のパラメータとして渡すことができる。
・プロシージャや関数の戻り値として返すことができる。
・実行時に構築可能である。
・表示可能である。
・読み込むことができる。
・分散したプロセス間で転送することができる。
・実行中のプロセスの外に保存することができる。
この内容でだいぶ意味が分かると思うんですが、いろんな例がありすぎて分からない人のために、また一言で表します。
第一級オブジェクトは、データと同じように受け渡しができる物のこと。
ここでいうオブジェクトはクラスのインスタンスのことではなく、単純に『物。対象物』という意味。
物が関数であれば第一級関数ということ。
第一級関数はプログラムが実行できる状態の関数をデータのように受け渡しできるということですね?
『制限なしに受け渡しができる』がポイント。
第一級オブジェクトはオブジェクト(物。対象物)をデータと同じように制限なしに扱えること。
物が関数なら第一級関数になる。
第一級関数はすでに使ってる
第一級関数は、プログラムコードをデータとして格納することではありません。渡す側、受ける側で関数としてプログラムを実行できる状態が必要です。
データの型と言ったほうがいいのかな?
勝手に造語しますが関数型データといったほうがシンプルです。
プログラムコードを文字列として扱ったらそれはただのデータですからね?
第一級とか意味不明のワードを使う理由がない。
具体的には無名関数、それを簡略化して記述できるアロー関数のこと。JavaScriptではとくに当たり前に使ってるものです。
第一級かどうかはそれぞれのプログラム言語の表現による
クロージャなんかは第一級オブジェクトの性質を使った機能です。なんかいろんなワードが出てきてややこしいですが。
ちなみに、Wikipediaの説明にもある通り、制限があるから第一級〇〇ではないというものでもありません。
プログラム言語によって仕様がちがうから。
制限はあったとしても、あたかもデータ型のように扱えるものは第一級オブジェクトになります。
このへんは、プログラムの仕様ドキュメントがどう表現するかによる。
『第一級』を使ってれば『データのように受け渡しができるんだな。』と思う程度でいいし、『第一級』を使わずに仕様(性質)そのものを表現することもあります。
第一級〇〇は性質なので、固有名詞を使ってないからといってそれが第一級じゃないとも言えません。
オブジェクト指向のクラスは第一級オブジェクトか?
オブジェクト指向プログラミングではクラスをベースに処理を書いていきます。
クラスのインスタンスは変数に代入できて、関数やクラスメソッドのパラメータに指定でき、それらの戻り値にも使えます。
クラスはそれ自体がデータの型なので。
クラスの中にメソッドという関数があるし、それごと渡せるから第一級オブジェクトなのでは?
と思いますが、そういう声はあまり聞きません。
ここからは個人の見解ですが、オブジェクト指向は第一級オブジェクトよりも新しい概念で、クラスの性質は第一級オブジェクトを取り込んだとも取れます。
取り込んだのも含めてクラスの性質なので、それは第一級オブジェクトじゃなくて、クラスはクラスの性質ってことなんでしょう。
もっともシンプルなデータ型の整数や浮動小数は第一級オブジェクトです。
intやfloatを第一級オブジェクトというワードで考えることはほぼないので、同じデータ型のクラスも改めてそう言わないだけかもしれません。