nilとnullの両方を使用する理由は、前者は主に名詞であり、後者は主に形容詞であるためだと思います(Webおよび私の論文辞書:American Heritage 1992で確認しました)。
意味と歴史に関して、NILはラテン語「nihil」からの縮約であり、「無」を意味します。
私の知る限り、ヌルポインターnil
を示す名前の使用は、プログラミング言語Lisp(1958)で導入されました。
NULLポインタが何を指すようになっているポインタ値であるため、間接参照すべきではありません。ほとんどの場合、ポインタは単なるメモリアドレスです。そのようなポインターを含むことを目的とする変数(つまり、任意の場所)には常にビットの構成が含まれ、そのような構成はメモリアドレスとして読み取ることができます。したがって、多くの場合、値nil
はプログラムで禁止されているメモリ領域のアドレスであるため、プログラムが逆参照しようとするとエラー(何らかのエラー)が発生し、何らかの形式の障害(割り込みの可能性)nil
が発生します。
ポインタが明示的にメモリ位置を指しているかどうかをテストできることが重要であるため、ポインタを明示的に使用する言語では、この役割を果たすための一意の定義済み標準値が不可欠です。通常、Lispでは、リストはリスト要素への「car」ポインタと次のペアへの「cdr」ポインタを含む「cons」ペアの連続として構築されました。リストの最後のペアでは、2番目のポインターはでしたnil
。
これは、空のリスト、またはリストに連結されたリスト要素としてのリストの再帰的な定義に対応します。したがって、要素のないリストはで表されましたnil
。この空のリストは、たまたまリストモノイドのIDです。
リストはセットを表すために使用できるため、その場合は空のセットもで表すことができnil
ます。
したがって、nil
歴史的には特別なポインタ値でしたが、リストやセットなどの他のより抽象的なドメインの特別なアイデンティティ値として理解されるようになりました。
等しいポインターnil
はNULLポインターであり、NULLは実体(つまり名詞)ではなく形容詞です。
形容詞と名詞としての両方の単語の調整された使用は、他の慣行と非常に一貫しています。修飾子nullは、モノイドのIDなどの代数構造のゼロによく使用されます:null element。リストはモノイドを形成します。値nilはIDです。同じことがセットにも当てはまります(ただし、より多くのプロパティを持つ代数を形成します)。同様に、整数がゼロの場合は整数であると言います。
著者やプログラミング言語の特異性に応じて、これらの単語の使用には他にも多くのバリエーションがあります(noneなど)。
二つの主要な意味合いがある上述したように、
これは、受け入れられた回答で Gillesによって行われたように、NILが「値の欠如」を表す値であると断言することはまったく正確ではないことを示しています。言語とその用途に依存します。プログラミング言語LISPは、おそらく55年前にプログラミング用語ではNILを導入しました。LISPでは、NIL
は空のリストであり、空のリスト()
の自然な表現であることに注意してください。値がないことを表すものではありません。空のリストは値であるため、これはしばしば正確に回避する必要がありますが、欠損値のプレースホルダーとして使用されることがあります。プログラマが選択した、許容可能な値と混同できない任意のオブジェクトの構造の欠損値を意味するもの。
上記で示したように、2つの概念は関連していることがありますが、2つの概念はかなり異なります。Gillesの回答で列挙されている用語の使用に関する詳細な分類法を用意して、これらの各単語の使用がどちらかの意味を重視しているかどうかを確認することは興味深いかもしれません。
名前は、談話を定義している人によって、与えられたコンテキストで意味するために割り当てられたものにすぎません。一部の使用法はより一般的、より自然、またはより一貫していますが、常に定義を確認し、各コンテキストで意図されている意味を確認する必要があります。また、味や一貫性のある用語が選択されていることを常に期待するべきではありません。
NULL
(Cとの互換性のため)とnil
;の両方があります。メソッドの呼び出しnil
は何もしません。JavaScriptにはnull
(何も表さない値)とundefined
(値が設定されていません)の両方があります。