Apa tujuan menggunakan NIL untuk mewakili simpul nol?
17
Dalam kursus Algoritma dan Struktur Data saya , profesor, slide dan buku ( Pengantar Algoritma, edisi ke-3 ) telah menggunakan kata NILuntuk menunjukkan misalnya anak dari simpul (di pohon) yang tidak ada.
Suatu kali, selama kuliah, alih-alih mengatakan NIL, teman sekelasku berkata null, dan profesor memperbaikinya, dan aku tidak mengerti mengapa profesor menekankan kata ini.
Apakah ada alasan mengapa orang menggunakan kata itu NILalih-alih null, atau none, atau kata lain? Apakah NILada makna tertentu yang tidak dimiliki orang lain? Apakah ada alasan historis?
Perhatikan bahwa saya telah melihat juga beberapa tempat di web di mana, misalnya, kata nullitu digunakan alih-alih NIL, tetapi biasanya yang terakhir ini digunakan.
Sejauh yang saya khawatir, null, nil, nonedan nothingyang nama umum untuk konsep yang sama: nilai yang mewakili “tidak adanya nilai”, dan yang hadir dalam berbagai jenis (disebut jenis nullable ). Nilai ini biasanya digunakan di mana nilai biasanya hadir, tetapi dapat dihilangkan, misalnya parameter opsional. Bahasa pemrograman yang berbeda menerapkan ini secara berbeda, dan beberapa bahasa mungkin tidak memiliki konsep seperti itu. Dalam bahasa dengan pointer, itu adalah pointer nol . Dalam banyak bahasa berorientasi objek, null bukan objek: memanggil metode apa pun di atasnya adalah kesalahan. Untuk memberikan beberapa contoh:
Dalam Lisp, nilbiasanya digunakan untuk berdiri karena tidak adanya nilai. Tidak seperti kebanyakan bahasa lain, nilmemiliki struktur - itu adalah simbol yang namanya "NIL". Itu juga daftar kosong (karena daftar harus berupa sel kontra, tetapi terkadang tidak ada sel kontra karena daftar kosong). Apakah itu diterapkan oleh pointer nol di bawah tenda, atau sebagai simbol seperti yang lain, tergantung pada implementasi.
Dalam Pascal, niladalah nilai pointer (valid dalam semua tipe pointer) yang mungkin tidak dereferensi.
Dalam C dan C ++, semua tipe pointer menyertakan NULLnilai yang berbeda dari pointer apa pun ke objek yang valid.
Dalam Smalltalk, niladalah objek tanpa metode yang ditentukan.
Di Jawa dan di C #, nulladalah nilai dari semua jenis objek. Upaya apa pun untuk mengakses bidang atau metode nullpemicu pengecualian.
Dalam Perl, undefberbeda dari nilai skalar lainnya dan digunakan di seluruh bahasa dan perpustakaan untuk menunjukkan tidak adanya nilai "nyata".
Dalam Python, Noneberbeda dari nilai lain dan digunakan di seluruh bahasa dan perpustakaan untuk menunjukkan tidak adanya nilai "nyata".
Dalam ML (SML, OCaml), Noneadalah nilai tipe apa pun dalam skema tipe 'a option, yang berisi Nonedan Some xuntuk xtipe apa pun 'a.
Di Haskell, konsep yang sama menggunakan nama Nothingdan Just xuntuk nilai dan Maybe auntuk tipe.
Dalam presentasi algoritma, nama mana yang digunakan cenderung berasal dari latar belakang presenter atau bahasa yang digunakan dalam contoh kode.
NULLn i l
Ada kemungkinan bahwa dosen Anda ingin menggunakan kata nulluntuk konstanta penunjuk nol dalam bahasa pemrograman yang digunakan dalam kursus (Java atau C #?), Dan NILuntuk menunjukkan tidak adanya simpul dalam beberapa struktur data, yang mungkin atau mungkin tidak diterapkan sebagai konstanta penunjuk nol (misalnya, seperti yang terlihat di atas, dalam Lisp, NILsering tidak diimplementasikan sebagai penunjuk nol). Perbedaan ini akan relevan ketika membahas teknik implementasi untuk struktur data. Ketika membahas struktur data itu sendiri, konsep null-pointer-constant tidak relevan, hanya konsep nilai yang tidak sama dengan nilai lainnya.
Tidak ada skema penamaan standar. Dosen atau buku teks lain dapat menggunakan nama yang berbeda.
Dua contoh lagi. Objective C memiliki keduanya NULL(untuk kompatibilitas C) dan nil; memanggil metode pada niladalah no-op. JavaScript memiliki keduanya null(nilai yang tidak mewakili apa-apa) dan undefined(nilainya bahkan tidak disetel).
200_sukses
1
"Dalam bahasa berorientasi objek, null bukan objek: memanggil metode apa pun di atasnya adalah kesalahan." - Ini tidak benar untuk semua bahasa, termasuk beberapa bahasa yang Anda daftarkan. Dalam Ruby dan Smalltalk, niladalah objek seperti yang lain, ini adalah contoh dari NilClass, tidak ada konsep lain "null-ness", dan khususnya, tidak ada null-pointer. Dalam Scala, Nilsangat berbeda dari null, nullagak agak seperti null-pointer, namun, sebenarnya memiliki type ( Null), Niladalah objek tua biasa, contoh tunggal dari EmptyListkelas jika Anda mau, dan ada juga ...
Jörg W Mittag
1
… NothingYang merupakan tipe terbawah dan tidak memiliki instance, dan Unityang merupakan tipe subrutin yang tidak mengembalikan nilai dan memiliki instance tunggal (). nullentah bagaimana membawa serta gagasan "null pointer" atau "null reference", bukan karena itu entah bagaimana melekat dalam istilah tersebut tetapi hanya karena keberadaan bahasa seperti C, C ++, D, Java, C #, yang menggunakannya dalam hal ini cara. NILtidak membawa konotasi ini, meskipun sebenarnya digunakan seperti itu misalnya dalam Pascal, Modula-2 dan Oberon. Di Ruby, nilmemiliki banyak metode yang berguna: nil.to_i # => 0, nil.to_s # => '', ...
Jörg W Mittag
1
... nil.to_a # => [], nil.to_h # => {}, nil.to_f # => 0.0, nil.inspect # => 'nil', dan sebagainya. Anda dapat melihat daftar lengkapnya di sini .
Jörg W Mittag
3
Saya percaya alasan penggunaan nihil dan null adalah karena yang pertama adalah kata benda, dan yang terakhir terutama kata sifat (saya memeriksa di web dan di kamus kertas saya: American Heritage 1992).
Mengenai makna dan sejarah, NIL adalah kontraksi dari bahasa Latin "nihil" yang berarti "tidak ada".
Sepengetahuan saya, penggunaan nama niluntuk menunjukkan sebuah null pointer diperkenalkan dengan bahasa pemrograman Lisp (1958).
Sebuah nol pointer adalah nilai pointer yang seharusnya untuk menunjuk ke apa-apa, dan harus demikian tidak dereferenced. Dalam kebanyakan kasus, pointer hanyalah alamat memori. Variabel apa pun (yaitu, lokasi mana pun) yang dimaksudkan mengandung pointer seperti itu akan selalu mengandung beberapa konfigurasi bit, dan konfigurasi semacam itu dapat dibaca sebagai alamat memori. Oleh karena itu sering terjadi bahwa nilainya nilakan menjadi alamat area memori yang dilarang untuk program, sehingga menyebabkan beberapa bentuk kegagalan (mungkin mengganggu) jika program mencoba melakukan dereferensi nil, yang hanya bisa merupakan kesalahan.
Memiliki nilai standar yang telah ditentukan sebelumnya untuk memainkan peran ini sangat penting dalam bahasa yang menggunakan pointer secara eksplisit, karena penting untuk dapat menguji apakah pointer secara bertahap menunjuk ke beberapa lokasi memori, atau tidak. Biasanya, di Lisp, daftar dibuat sebagai suksesi pasangan "kontra" yang berisi penunjuk "mobil" ke elemen daftar dan penunjuk "cdr" ke pasangan berikutnya. Dalam pasangan terakhir dari daftar, penunjuk kedua adalah nil.
Ini sesuai dengan definisi rekursif daftar sebagai daftar kosong, atau elemen daftar yang disatukan dengan daftar. Oleh karena itu daftar tanpa elemen diwakili oleh nil. Daftar kosong ini adalah identitas dari daftar monoid.
Karena daftar dapat digunakan untuk mewakili set, set kosong dapat dalam hal itu juga diwakili oleh nil.
Dengan demikian nilsecara historis nilai pointer khusus, tetapi kemudian dipahami sebagai nilai identitas khusus untuk domain yang lebih abstrak lainnya, seperti daftar atau set.
Pointer sama dengan niladalah pointer nol, nol menjadi kata sifat dan bukan substantif (yaitu kata benda).
Penggunaan kedua kata yang terkoordinasi, sebagai kata sifat dan kata benda cukup konsisten dengan praktik lainnya. Null kualifikasi sering digunakan untuk nol dari struktur aljabar, seperti identitas monoid: elemen nol . Daftar membentuk monoid , di mana nilai nil adalah identitas. Hal yang sama berlaku untuk set (meskipun mereka membentuk aljabar dengan lebih banyak properti). Seseorang mengatakan dengan cara yang sama bahwa integer adalah nol ketika itu nol.
Ada banyak variasi dalam penggunaan kata-kata ini dan yang lainnya, seperti tidak ada, tergantung pada penulis dan keistimewaan bahasa pemrograman.
Dua konotasi utama adalah , seperti dijelaskan di atas
sebagai standar "nilai tidak terdefinisi", sebenarnya mewakili tidak adanya nilai yang dapat digunakan.
sebagai nilai identitas suatu domain
Ini menunjukkan bahwa tidak cukup akurat untuk menyatakan bahwa NIL adalah " nilai yang mewakili" tidak adanya nilai ", seperti yang dilakukan oleh Gilles dalam jawaban yang diterima . Itu tergantung pada bahasa dan penggunaannya. Bahasa pemrograman LISP mungkin memperkenalkan NIL dalam terminologi pemrograman 55 tahun yang lalu. Dalam LISP, NILadalah daftar kosong, dan dapat dengan setara dicatat ()yang merupakan representasi alami dari daftar kosong.Itu tidak mewakili tidak adanya nilai. Kadang-kadang digunakan sebagai tempat-tempat untuk nilai yang hilang, meskipun itu sering harus dihindari justru karena daftar kosong adalah nilai. Apa yang dimaksud dengan nilai yang hilang dalam struktur dalam objek arbitrer, yang dipilih oleh programmer, yang tidak dapat dikacaukan dengan nilai yang dapat diterima.
Kedua konsep ini agak berbeda, meskipun kami telah menunjukkan di atas bahwa mereka dapat saling berhubungan. Mungkin menarik untuk memiliki mode taksonomi terperinci dari penggunaan terminologi yang disebutkan oleh Gilles'answer, untuk melihat apakah penggunaan masing-masing kata ini lebih berorientasi pada satu konotasi atau yang lain.
Nama tidak lebih dari apa yang ditugaskan untuk artinya dalam konteks yang diberikan, oleh siapa pun yang mendefinisikan wacana. Beberapa kegunaan lebih umum, lebih alami, atau lebih konsisten, tetapi kita harus selalu memeriksa definisi dan memastikan makna apa yang dimaksudkan dalam setiap konteks. Dan seseorang seharusnya tidak selalu berharap terminologi telah dipilih dengan rasa atau konsistensi.
NIL adalah objek dengan nilai yang memberitahu programmer bahwa objek tidak valid. Ini sangat berguna dalam C ++ di mana NULL didefinisikan sebagai 0. Jika Anda membatalkan referensi NULL di C ++, Anda mendapatkan perilaku yang tidak terdefinisi. Jika Anda membatalkan referensi NIL (penunjuk ke objek kosong yang Anda tetapkan), Anda mendapatkan objek yang bisa Anda beri tahu berada di luar struktur data Anda. Ini bagus untuk mencegah kegagalan program bencana dan mendeteksi kesalahan.
Anda dapat menggunakan NIL dalam kasus-kasus seperti daftar yang ditautkan dua kali lipat, menjadikannya awal dan akhir daftar untuk melacak kepala dan ekor, dan pastikan bahwa -> next dan -> prev pointer tidak pernah menghilangkan referensi NULL.
Saya pikir Anda salah menafsirkan jawaban saya. Tautan yang Anda berikan tidak memiliki korelasi dengan jawaban saya. Saya mengusulkan bahwa nil adalah objek yang ditentukan pengguna, didefinisikan berdasarkan per-kelas, untuk menunjuk ke objek kosong (tapi valid) dari kelas itu.
abastion
Cara Anda menulis "NIL adalah objek" (penekanan saya) daripada, katakanlah "NIL dapat didefinisikan sebagai objek" membuatnya terlihat seperti Anda mendeskripsikan fitur bahasa, bukan gaya pemrograman. Namun, jika jawaban Anda murni tentang gaya pemrograman, itu tidak benar-benar pada topik, di sini.
NULL
(untuk kompatibilitas C) dannil
; memanggil metode padanil
adalah no-op. JavaScript memiliki keduanyanull
(nilai yang tidak mewakili apa-apa) danundefined
(nilainya bahkan tidak disetel).nil
adalah objek seperti yang lain, ini adalah contoh dariNilClass
, tidak ada konsep lain "null-ness", dan khususnya, tidak ada null-pointer. Dalam Scala,Nil
sangat berbeda darinull
,null
agak agak seperti null-pointer, namun, sebenarnya memiliki type (Null
),Nil
adalah objek tua biasa, contoh tunggal dariEmptyList
kelas jika Anda mau, dan ada juga ...Nothing
Yang merupakan tipe terbawah dan tidak memiliki instance, danUnit
yang merupakan tipe subrutin yang tidak mengembalikan nilai dan memiliki instance tunggal()
.null
entah bagaimana membawa serta gagasan "null pointer" atau "null reference", bukan karena itu entah bagaimana melekat dalam istilah tersebut tetapi hanya karena keberadaan bahasa seperti C, C ++, D, Java, C #, yang menggunakannya dalam hal ini cara.NIL
tidak membawa konotasi ini, meskipun sebenarnya digunakan seperti itu misalnya dalam Pascal, Modula-2 dan Oberon. Di Ruby,nil
memiliki banyak metode yang berguna:nil.to_i # => 0
,nil.to_s # => ''
, ...nil.to_a # => []
,nil.to_h # => {}
,nil.to_f # => 0.0
,nil.inspect # => 'nil'
, dan sebagainya. Anda dapat melihat daftar lengkapnya di sini .Saya percaya alasan penggunaan nihil dan null adalah karena yang pertama adalah kata benda, dan yang terakhir terutama kata sifat (saya memeriksa di web dan di kamus kertas saya: American Heritage 1992).
Mengenai makna dan sejarah, NIL adalah kontraksi dari bahasa Latin "nihil" yang berarti "tidak ada".
Sepengetahuan saya, penggunaan nama
nil
untuk menunjukkan sebuah null pointer diperkenalkan dengan bahasa pemrograman Lisp (1958).Sebuah nol pointer adalah nilai pointer yang seharusnya untuk menunjuk ke apa-apa, dan harus demikian tidak dereferenced. Dalam kebanyakan kasus, pointer hanyalah alamat memori. Variabel apa pun (yaitu, lokasi mana pun) yang dimaksudkan mengandung pointer seperti itu akan selalu mengandung beberapa konfigurasi bit, dan konfigurasi semacam itu dapat dibaca sebagai alamat memori. Oleh karena itu sering terjadi bahwa nilainya
nil
akan menjadi alamat area memori yang dilarang untuk program, sehingga menyebabkan beberapa bentuk kegagalan (mungkin mengganggu) jika program mencoba melakukan dereferensinil
, yang hanya bisa merupakan kesalahan.Memiliki nilai standar yang telah ditentukan sebelumnya untuk memainkan peran ini sangat penting dalam bahasa yang menggunakan pointer secara eksplisit, karena penting untuk dapat menguji apakah pointer secara bertahap menunjuk ke beberapa lokasi memori, atau tidak. Biasanya, di Lisp, daftar dibuat sebagai suksesi pasangan "kontra" yang berisi penunjuk "mobil" ke elemen daftar dan penunjuk "cdr" ke pasangan berikutnya. Dalam pasangan terakhir dari daftar, penunjuk kedua adalah
nil
.Ini sesuai dengan definisi rekursif daftar sebagai daftar kosong, atau elemen daftar yang disatukan dengan daftar. Oleh karena itu daftar tanpa elemen diwakili oleh
nil
. Daftar kosong ini adalah identitas dari daftar monoid.Karena daftar dapat digunakan untuk mewakili set, set kosong dapat dalam hal itu juga diwakili oleh
nil
.Dengan demikian
nil
secara historis nilai pointer khusus, tetapi kemudian dipahami sebagai nilai identitas khusus untuk domain yang lebih abstrak lainnya, seperti daftar atau set.Pointer sama dengan
nil
adalah pointer nol, nol menjadi kata sifat dan bukan substantif (yaitu kata benda).Penggunaan kedua kata yang terkoordinasi, sebagai kata sifat dan kata benda cukup konsisten dengan praktik lainnya. Null kualifikasi sering digunakan untuk nol dari struktur aljabar, seperti identitas monoid: elemen nol . Daftar membentuk monoid , di mana nilai nil adalah identitas. Hal yang sama berlaku untuk set (meskipun mereka membentuk aljabar dengan lebih banyak properti). Seseorang mengatakan dengan cara yang sama bahwa integer adalah nol ketika itu nol.
Ada banyak variasi dalam penggunaan kata-kata ini dan yang lainnya, seperti tidak ada, tergantung pada penulis dan keistimewaan bahasa pemrograman.
Dua konotasi utama adalah , seperti dijelaskan di atas
sebagai standar "nilai tidak terdefinisi", sebenarnya mewakili tidak adanya nilai yang dapat digunakan.
sebagai nilai identitas suatu domain
Ini menunjukkan bahwa tidak cukup akurat untuk menyatakan bahwa NIL adalah " nilai yang mewakili" tidak adanya nilai ", seperti yang dilakukan oleh Gilles dalam jawaban yang diterima . Itu tergantung pada bahasa dan penggunaannya. Bahasa pemrograman LISP mungkin memperkenalkan NIL dalam terminologi pemrograman 55 tahun yang lalu. Dalam LISP,
NIL
adalah daftar kosong, dan dapat dengan setara dicatat()
yang merupakan representasi alami dari daftar kosong.Itu tidak mewakili tidak adanya nilai. Kadang-kadang digunakan sebagai tempat-tempat untuk nilai yang hilang, meskipun itu sering harus dihindari justru karena daftar kosong adalah nilai. Apa yang dimaksud dengan nilai yang hilang dalam struktur dalam objek arbitrer, yang dipilih oleh programmer, yang tidak dapat dikacaukan dengan nilai yang dapat diterima.Kedua konsep ini agak berbeda, meskipun kami telah menunjukkan di atas bahwa mereka dapat saling berhubungan. Mungkin menarik untuk memiliki mode taksonomi terperinci dari penggunaan terminologi yang disebutkan oleh Gilles'answer, untuk melihat apakah penggunaan masing-masing kata ini lebih berorientasi pada satu konotasi atau yang lain.
Nama tidak lebih dari apa yang ditugaskan untuk artinya dalam konteks yang diberikan, oleh siapa pun yang mendefinisikan wacana. Beberapa kegunaan lebih umum, lebih alami, atau lebih konsisten, tetapi kita harus selalu memeriksa definisi dan memastikan makna apa yang dimaksudkan dalam setiap konteks. Dan seseorang seharusnya tidak selalu berharap terminologi telah dipilih dengan rasa atau konsistensi.
sumber
NIL adalah objek dengan nilai yang memberitahu programmer bahwa objek tidak valid. Ini sangat berguna dalam C ++ di mana NULL didefinisikan sebagai 0. Jika Anda membatalkan referensi NULL di C ++, Anda mendapatkan perilaku yang tidak terdefinisi. Jika Anda membatalkan referensi NIL (penunjuk ke objek kosong yang Anda tetapkan), Anda mendapatkan objek yang bisa Anda beri tahu berada di luar struktur data Anda. Ini bagus untuk mencegah kegagalan program bencana dan mendeteksi kesalahan.
Anda dapat menggunakan NIL dalam kasus-kasus seperti daftar yang ditautkan dua kali lipat, menjadikannya awal dan akhir daftar untuk melacak kepala dan ekor, dan pastikan bahwa -> next dan -> prev pointer tidak pernah menghilangkan referensi NULL.
sumber