Acredito que a razão para o uso de nulo e nulo é que o primeiro é principalmente um substantivo e o segundo, principalmente um adjetivo (verifiquei na web e em meu artigo de dicção: American Heritage 1992).
Em relação ao significado e à história, o NIL é uma contração do latim "nihil", que significa "nada".
Que eu saiba, o uso do nome nil
para indicar um ponteiro nulo foi introduzido com a linguagem de programação Lisp (1958).
Um ponteiro nulo é um valor de ponteiro que não deve apontar para nada e, portanto, não deve ser desreferenciado. Na maioria dos casos, os ponteiros são simplesmente endereços de memória. Qualquer variável (ou seja, qualquer local) que se destina a conter esse ponteiro sempre conterá alguma configuração de bits, e essa configuração pode ser lida como um endereço de memória. Portanto, geralmente o valor nil
será o endereço de uma área de memória proibida para o programa, causando alguma forma de falha (possivelmente interrupção) se o programa tentar desreferenciar nil
, o que pode ser apenas um erro.
Ter um valor padrão predefinido exclusivo para desempenhar essa função é essencial nas linguagens usando ponteiros explicitamente, pois é importante poder testar se um ponteiro está atualmente apontando para algum local da memória ou não. Normalmente, no Lisp, uma lista era construída como uma sucessão de pares "contras", contendo um ponteiro "car" para um elemento da lista e um ponteiro "cdr" para o próximo par. No último par da lista, o segundo ponteiro foi nil
.
Isso corresponde à definição recursiva de uma lista como uma lista vazia ou um elemento da lista concatenado a uma lista. Portanto, uma lista sem elemento foi representada por nil
. Essa lista vazia é a identidade da lista monóide.
Como as listas podem ser usadas para representar conjuntos, nesse caso, o conjunto vazio também pode ser representado por nil
.
Assim, nil
historicamente, era um valor especial de ponteiro, mas passou a ser entendido como um valor de identidade especial para outros domínios mais abstratos, como listas ou conjuntos.
Um ponteiro igual a nil
era um ponteiro nulo, sendo nulo um adjetivo e não um substantivo (isto é, um substantivo).
O uso coordenado de ambas as palavras, como adjetivo e substantivo, é bastante consistente com outras práticas. O qualificador null é frequentemente usado para o zero de uma estrutura algébrica, como a identidade de um monóide: o elemento nulo . As listas formam um monóide , onde o valor nulo é a identidade. O mesmo vale para os conjuntos (embora eles formem uma álgebra com muito mais propriedades). Diz-se da mesma forma que um número inteiro é nulo quando é zero.
Existem muitas variações no uso dessas palavras e de outras, como nenhuma, dependendo dos autores e idiossincrasias das linguagens de programação.
As duas principais conotações são , como explicado acima
como um "valor indefinido" padrão, representando de fato a ausência de qualquer valor utilizável.
como valor de identidade de algum domínio
Isso mostra que não é exato afirmar que o NIL é " um valor que representa a" ausência de um valor ", como feito por Gilles na resposta aceita . Depende do idioma e de seus usos. A linguagem de programação LISP provavelmente introduziu NIL na terminologia de programação 55 anos atrás. No LISP, NIL
está a lista vazia e pode-se notar, equivalentemente, ()
qual é a representação natural da lista vazia.Não representa a ausência de um valor. Às vezes, é usado como marcador de posição para valores ausentes, embora isso geralmente deva ser evitado precisamente porque a lista vazia é um valor. O que significa um valor ausente em uma estrutura em qualquer objeto arbitrário, escolhido pelo programador, que não pode ser confundido com valores aceitáveis.
Os dois conceitos são bastante diferentes, embora tenhamos mostrado acima que eles podem ser relacionados. Pode ser interessante ter uma taxonomia detalhada do modo de uso da terminologia enumerada pela resposta de Gilles, para ver se os usos de cada uma dessas palavras estão mais orientados para uma conotação ou outra.
Os nomes não são mais do que aquilo que lhes é atribuído em um determinado contexto, por quem quer que esteja definindo o discurso. Alguns usos são mais comuns, mais naturais ou mais consistentes, mas deve-se sempre verificar as definições e garantir que significado foi pretendido em cada contexto. E nem sempre se deve esperar que a terminologia tenha sido escolhida com bom gosto ou consistência.
NULL
(para compatibilidade com C) enil
; chamar métodosnil
é um no-op. O JavaScript possui ambosnull
(um valor que não representa nada) eundefined
(o valor nem está definido).