Jenis sistem: nominal vs struktural, eksplisit vs implisit


24

Saya agak bingung tentang perbedaan antara sistem tipe nominal dan struktural. Bisakah seseorang menjelaskan perbedaannya?

Dari apa yang saya mengerti:

  • Nominal: Jenis kompatibilitas didasarkan pada nama jenis.
  • Struktural: Kompatibilitas jenis didasarkan pada struktur tipe, misalnya dalam C jika 2 variabel adalah tipe struct dengan nama yang berbeda tetapi struktur yang sama, maka tipenya kompatibel.

Sekarang tentang eksplisit dan implisit: mengapa berbeda dari pengetikan statis dan dinamis? Dalam pengetikan statis, tipe akan eksplisit saat dalam pengetikan dinamis, tipe bersifat implisit. Apakah saya benar?

Jawaban:


29

Dalam sistem yang diketik secara dinamis, nilai memiliki tipe saat runtime tetapi variabel dan fungsi tidak. Dalam sistem yang diketik secara statis, variabel dan fungsi memiliki tipe yang diketahui dan diperiksa pada waktu kompilasi. Misalnya dengan Python xdapat berupa apa saja ; saat runtime, jika itu 1angka dan jika ya "foo", itu adalah string. Anda hanya akan tahu tipe mana xpada saat runtime, dan bisa berbeda setiap kali Anda menjalankan program. Dalam bahasa seperti Java, Anda akan menulis int xjika xingin menjadi angka, dan Anda akan tahu pada waktu kompilasi bahwa xselalu harus menjadi int.

Tipe "Eksplisit" dan "implisit" keduanya merujuk pada sistem tipe statis . Karakteristik yang menentukan dari sistem statis adalah bahwa jenisnya diketahui pada waktu kompilasi, tetapi tidak harus bahwa mereka harus dituliskan. Di Jawa, jenisnya eksplisit - Anda harus menuliskannya. Jadi di Jawa, metode mungkin terlihat seperti:

public int foo(String bar, Object baz) { ... }

Tipe-tipe tersebut diketahui pada waktu kompilasi (statis) dan dituliskan (eksplisit). Namun, ada juga bahasa yang tidak memaksa Anda untuk menulis ketik. Mereka dapat menyimpulkan jenis fungsi dari tubuhnya dan bagaimana fungsinya. Contohnya adalah OCaml, tempat Anda dapat menulis sesuatu seperti:

let foo x = x + 1

Karena Anda menggunakan +, OCaml dapat mengetahui bahwa xitu harus intsemuanya sendiri. Jadi jenis foo( foo : int -> int) adalah diketahui pada waktu kompilasi, seperti contoh Java. Itu sepenuhnya statis. Namun, karena kompilator dapat mengetahui tipe apa yang harus dilakukan sendiri, Anda tidak harus menuliskannya sendiri: mereka tersirat.

Singkatnya: apakah sistem tipe eksplisit atau implisit adalah properti sistem statis . Ini adalah pertanyaan yang sama sekali berbeda dari apakah sistem tipe itu dinamis atau statis.

Seringkali, Anda memiliki sistem tipe yang terkadang eksplisit dan terkadang implisit.

Misalnya, saya yakin C # memungkinkan Anda menyimpulkan jenis menggunakan varkata kunci. Jadi alih-alih menulis int x = 10, Anda dapat menulis var x = 10dan angka-angka kompiler yang xharus menjadi int. C ++ melakukan sesuatu yang mirip dengan auto. Sistem ini biasanya eksplisit tetapi memiliki beberapa kesimpulan.

Di sisi lain, ada sistem yang biasanya implisit tetapi kadang-kadang memaksa Anda untuk menulis tanda tangan jenis. Haskell adalah contoh yang bagus. Sebagian besar waktu, Haskell dapat menyimpulkan jenis untuk Anda. Namun, kadang-kadang Anda dapat menulis kode yang ambigu show . read, di mana Haskell tidak dapat mengetahui jenisnya sendiri. Dalam hal ini, Anda akan dipaksa untuk secara eksplisit menentukan jenis salah satu showatau read. Selain itu, beberapa fitur yang lebih canggih dari sistem tipe (seperti peringkat-n polimorfisme) membuat inferensi tidak dapat diputuskan - yaitu, tidak dijamin akan terhenti. Ini berarti bahwa kode yang menggunakan fitur ini sering membutuhkan tanda tangan jenis eksplisit.


2
Sebenarnya, ada beberapa bahasa dengan apa yang Anda sebut pengetikan dinamis eksplisit . Biasanya, bahasa-bahasa itu memungkinkan Anda untuk membubuhi keterangan ekspresi dengan tipe, dan kemudian tipe tersebut akan diperiksa pada saat runtime terhadap tipe runtime dari ekspresi.
Jörg W Mittag

hanya sebuah presisi: sistem tipe tidak implisit atau eksplisit. Ini hanya tentang inferensi tipe, yang pada dasarnya adalah cara menghasilkan istilah yang valid dalam sistem tipe dari sintaks yang berbeda (terkadang tidak ditentukan).
Eduardo Pareja Tobes

Jawaban yang bagus, tetapi ini tidak membahas pengetikan nominal vs struktural. Hasil edit akan bagus.
lunchmeat317

7
  • static vs dynamic menjelaskan kapan jenis dicentang (kurang lebih pada saat kompilasi atau pada waktu eksekusi)

  • nominal vs struktural menggambarkan kapan dua jenis dianggap sama.

(Dan ada variasi, yang paling dikenal adalah varian pengetikan struktural yang hanya mempertimbangkan apa yang digunakan dan bukan seluruh tipe yang dikenal sebagai pengetikan bebek).

Keempat kombinasi (nominal statis, struktural statis, nominal dinamis, struktural dinamis) dimungkinkan, dan bahasa seringkali tidak murni dalam satu kelas tetapi memiliki aspek yang ada di kelas lain.

Misalnya, sistem tipe C ++ bersifat statis, sebagian besar nominal tetapi struktural ketika Anda mempertimbangkan templat (dan Anda dapat mempertimbangkan bagian dari masalah di sekitar konsep dalam C ++ sebagai konflik antara mereka yang ingin dari bebek mengetik ke bentuk penuh mengetik struktural dan mereka yang ingin pergi ke pengetikan nominal). Dan penggunaan kelas dan pewarisan memungkinkan untuk menggunakan pengetikan dinamis dan nominal dalam beberapa kasus.

Bahasa yang sistem tipe dinamisnya sering menggunakan pengetikan struktural, tetapi CLOS sebagai aspek nominal.


1

Struktural: Kompatibilitas jenis didasarkan pada struktur tipe, misalnya dalam C jika 2 variabel adalah tipe struct dengan nama yang berbeda tetapi struktur yang sama, maka tipenya kompatibel.

Ini biasanya tidak demikian. Mengetik struktural berarti Bsubtipe Ajika dapat memenuhi Aantarmuka. Ini biasanya berarti memiliki anggota dengan nama yang sama; bukan hanya struktur yang sama dalam memori.

Ini berbeda dari pengetikan nominatif yang membutuhkan tipe-super untuk ditentukan pada deklarasi.


1

Penjelasan terbaik yang pernah saya lihat tentang perbedaan antara (sebenarnya subsumsi) sistem tipe dinamis dan statis ada di posting blog ini oleh Bob Harper:

Poin utamanya dapat diringkas sebagai:

  • bahasa dinamis adalah bahasa statis dengan hanya satu jenis

1
Tautan bisa menjadi buruk; Anda harus mengutip bit yang paling relevan dari artikel sehingga mereka dipertahankan untuk anak cucu bahkan jika blog berjalan kaput.
Doval

2
Yakin. Saya pikir dalam hal ini kalimat yang saya tambahkan sudah cukup :)
Eduardo Pareja Tobes
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.