Я полагаю, что причина использования как nil, так и null состоит в том, что первое - это, прежде всего, существительное, а второе - прилагательное (я проверил в Интернете и в своем бумажном словаре: American Heritage 1992).
Что касается значения и истории, NIL - это сокращение от латинского «nihil», что означает «ничто».
Насколько мне известно, использование имени nil
для обозначения нулевого указателя было введено с языком программирования Lisp (1958).
Указатель нуля является значением указателя , который должен указывать ничего, и поэтому их не следует разыменовывается. В большинстве случаев указатели являются просто адресами памяти. Любая переменная (т. Е. Любое местоположение), которая должна содержать такой указатель, всегда будет содержать некоторую конфигурацию битов, и любая такая конфигурация может быть прочитана как адрес памяти. Следовательно, часто случается, что значение nil
будет адресом области памяти, которая запрещена программе, таким образом вызывая некоторую форму сбоя (возможно прерывание), если программа пытается разыменовать nil
, что может быть только ошибкой.
Наличие уникального предопределенного стандартного значения для выполнения этой роли является существенным в языках, использующих указатели в явном виде, поскольку важно иметь возможность проверить, действительно ли указатель указывает на какую-то область памяти или нет. Как правило, в Лиспе список создавался как последовательность пар «против», содержащих указатель «car» на элемент списка и указатель «cdr» на следующую пару. В последней паре списка второй указатель был nil
.
Это соответствует рекурсивному определению списка как пустого списка или элемента списка, объединенного со списком. Следовательно, список без элемента был представлен как nil
. Этот пустой список является идентификатором моноида списка.
Поскольку списки могут использоваться для представления наборов, пустой набор в этом случае также может быть представлен как nil
.
Таким образом, nil
исторически это было специальное значение указателя, но стало пониматься как специальное значение идентификатора для других более абстрактных областей, таких как списки или наборы.
Указатель, равный ему, nil
был нулевым указателем, при этом нулевым является прилагательное, а не материальное (т. Е. Существительное).
Скоординированное использование как слова, как прилагательного, так и существительного вполне согласуется с другой практикой. Квалификатор null часто используется для нуля алгебраической структуры, такой как тождество моноида: нулевой элемент . Списки образуют моноид , где значение nil - это тождество. То же самое верно для множеств (хотя они образуют алгебру со многими другими свойствами). Аналогичным образом говорят, что целое число равно нулю, когда оно равно нулю.
Существует много вариаций использования этих слов и других, например ни одного, в зависимости от авторов и особенностей языков программирования.
Две основные коннотации , как объяснено выше
как стандартное «неопределенное значение», фактически представляющее отсутствие какого-либо полезного значения.
в качестве значения идентичности некоторого домена
Это показывает, что не совсем точно утверждать, что NIL - это « значение, которое представляет собой« отсутствие значения », как это сделал Жиль в принятом ответе . Это зависит от языка и его использования. Язык программирования LISP, вероятно, ввел NIL в терминологию программирования 55 лет назад. В LISP NIL
это пустой список, и его можно эквивалентно отметить, ()
что является естественным представлением пустого списка.Это не означает отсутствие значения. Иногда он используется в качестве заполнителя для пропущенных значений, хотя этого часто следует избегать именно потому, что пустой список является значением. Что означает отсутствующее значение в структуре в любом произвольном объекте, выбранном программистом, который нельзя спутать с приемлемыми значениями.
Эти два понятия довольно различны, хотя мы показали выше, что они могут быть связаны. Может быть интересно иметь детализированную таксономию режима использования терминологии, перечисленной Gilles'answer, чтобы увидеть, ориентировано ли использование каждого из этих слов в большей степени на одно значение или другое.
Имена не более чем то, что им назначено для обозначения в данном контексте, кем бы они ни определяли дискурс. Некоторые виды использования более распространены, более естественны или более последовательны, но всегда следует проверять определения и проверять, какое значение имело место в каждом контексте. И не всегда следует ожидать, что терминология будет выбрана со вкусом или последовательностью.
NULL
(для совместимости C), так иnil
; Вызов методов наnil
это не работает. JavaScript имеет обаnull
(значение, не представляющее ничего) иundefined
(значение даже не установлено).