Dalam Python, dan kemungkinan besar banyak bahasa pemrograman lain, struktur data umum dapat ditemukan sebagai bagian terintegrasi dari bahasa inti dengan sintaksis khusus mereka sendiri. Jika kita mengesampingkan sintaks daftar terintegrasi LISP, saya tidak bisa memikirkan bahasa lain yang saya tahu yang menyediakan semacam struktur data di atas array sebagai bagian terintegrasi dari sintaks mereka, meskipun semuanya (tapi C, saya kira) tampaknya menyediakannya di perpustakaan standar.
Dari perspektif desain bahasa, apa pendapat Anda tentang memiliki sintaksis khusus untuk struktur data dalam bahasa inti? Apakah ini ide yang bagus, dan apakah tujuan bahasa (dll.) Mengubah seberapa bagus pilihan ini?
Sunting: Saya minta maaf atas (tampaknya) menyebabkan beberapa kebingungan tentang struktur data yang saya maksud. Saya berbicara tentang yang dasar dan yang umum digunakan, tetapi masih bukan yang paling dasar. Ini tidak termasuk pohon (terlalu kompleks, tidak umum), tumpukan (terlalu jarang digunakan), array (terlalu sederhana) tetapi termasuk misalnya set, daftar, dan hashmaps.
Jawaban:
Itu tergantung untuk apa bahasa itu.
Beberapa contoh (agak dicuri dari jawaban lain):
Saya pikir itu tergantung apa tujuan / semangat / audiens bahasa Anda; seberapa abstrak dan seberapa jauh dari perangkat keras yang Anda inginkan. Secara umum bahasa yang mendukung daftar sebagai primitif memungkinkan Anda untuk membuat daftar yang sangat panjang. Sementara level rendah seperti C / C ++ tidak akan pernah memiliki ini, karena itu bukan tujuan, semangat bahasa-bahasa tersebut.
Bagi saya, pengumpulan sampah mengikuti logika yang sama: apakah audiens bahasa Anda peduli untuk mengetahui kapan dan apakah memori dialokasikan atau dibebaskan? Jika ya, malloc / gratis; jika tidak, maka pengumpulan sampah.
sumber
malloc
dannew
non-deterministik dalam C / C ++).Perl memiliki hashmaps dan PL / SQL mendukung catatan, dan saya memiliki memori yang sangat berkabut dari matlab memiliki sintaks untuk mendukung vektor dan matriks dari semua dimensi yang berbeda (meskipun saya bisa salah tentang yang ini dan itu bisa menjadi argumen bahwa ini adalah tipe data bukan data struktur ) ... Saya akan mengatakan bahwa memiliki beberapa dukungan asli untuk struktur yang sangat umum baik untuk dimiliki. Biasanya tampaknya bahwa array dan hashmaps / array asosiatif adalah struktur yang didukung secara umum paling umum, dan mereka mungkin yang paling umum digunakan juga.
Jangan lupa bahwa jika Anda menambahkan dukungan sintaksis asli untuk struktur lain seperti pohon-biner, struktur itu juga telah diimplementasikan oleh alat pendukung bahasa (compiler / runtime / etc). Berapa banyak strucutres yang Anda inginkan untuk membangun dukungan?
Anda harus membuat notasi baru untuk struktur yang secara umum kurang didukung ... Keep It Simple !.
sumber
Contoh favorit saya di sini adalah Lua . Lua hanya memiliki satu tipe data built-in, " tabel ", tetapi fleksibilitas dan kecepatannya berarti Anda benar-benar menggunakannya di tempat array reguler, daftar tertaut, antrian, peta dan mereka bahkan menjadi dasar untuk fitur berorientasi objek Lua (kelas yaitu).
Lua adalah bahasa yang sangat sederhana, tetapi fleksibilitas struktur data tabel membuatnya cukup kuat juga.
sumber
{}
tidak[]
, di Lua Anda memiliki{}
keduanya. Tabel Lua lebih baik dibandingkan dengan daftar di Lisp.Anda tidak harus memiliki sintaks khusus untuk setiap tipe data tingkat tinggi. Sebagai contoh, itu lumayan untuk memiliki
set([1, 2, 3])
(sebagai Python 2.x lakukan) alih-alih{1, 2, 3}
.Yang penting adalah memiliki beberapa cara mudah untuk membangun struktur data tingkat tinggi. Yang ingin Anda hindari adalah kode seperti:
yang mengganggu saya sangat ketika saya menggunakan
std::vector
,std::set
danstd::map
di C ++. Untungnya, standar baru akan adastd::initializer_list
.sumber
Menurut pendapat saya, ini adalah tambahan yang sangat sederhana yang bisa berguna secara mengejutkan sering, setidaknya jika dilakukan dengan hati-hati - yaitu paling banyak untuk tupel, daftar, peta dan set karena mereka memiliki literal yang dikenal dengan baik.
someBracket {expr ','} someBracket
atausomeBracket {expr ':' expr ','} someBracket
, dengan beberapa tambahan sederhana mati jika Anda menginginkan hal-hal seperti koma tambahan opsional. The literal mengapung dengan mudah dapat lagi dalam tata bahasa.{1, 2}
).add
/.append
/.setItem
satu kali per ekspresi yang diberikan dengan ekspresi (itu) sebagai argumen".sumber
Clojure adalah orang yang lemah tetapi mendukung
sumber
Semakin banyak struktur data yang Anda miliki dalam bahasa itu sendiri semakin sulit bahasa yang akan dipelajari. Ini mungkin preferensi pribadi tetapi saya cenderung lebih suka bahasa yang lebih sederhana dan kemudian tambahan apa pun dapat disediakan oleh perpustakaan.
Bahasa yang dirancang untuk bidang tertentu terkadang dapat mengambil manfaat dari memiliki struktur data tertentu yang terintegrasi ke bahasa seperti Matlab. Tetapi terlalu banyak bisa membuat Anda kewalahan.
sumber
Agar suatu bahasa benar-benar bermanfaat, ia harus melakukan beberapa tugas di luar kotak. Karena pemrograman praktis sehari-hari membutuhkan alat yang menyelesaikan masalah mereka pada tingkat generik. Minimalisme terlihat kompak dan keren, tetapi ketika Anda ingin mulai menggunakan untuk menyelesaikan masalah besar tapi berulang, Anda membutuhkan tingkat abstraksi yang dapat Anda gunakan.
Jadi saya pikir bahasa pemrograman harus mengirimkan dukungan untuk struktur data yang paling umum digunakan dalam sintaks untuk tugas-tugas yang dirancang untuk bahasa tersebut.
sumber
Secara umum saya merasa nyaman memiliki literal untuk daftar, set dan sebagainya. Tapi kadang-kadang mengganggu saya bahwa saya tidak tahu apa-apa tentang implementasi aktual - katakanlah - daftar Python atau array Javascript. Satu-satunya hal yang saya bisa pastikan adalah bahwa mereka mengekspos antarmuka yang diberikan.
Saya menganggap sebagai tolok ukur dari ekspresi bahasa seberapa baik ia dapat menulis struktur datanya sendiri sebagai perpustakaan, dan seberapa nyaman menggunakannya.
Sebagai contoh, Scala menyediakan berbagai koleksi dengan implementasi yang berbeda dan jaminan kinerja. Semuanya diimplementasikan dalam Scala itu sendiri, dan sintaks untuk menggunakannya hanya sedikit lebih kompleks daripada jika mereka dibangun dan memiliki dukungan runtime.
Satu-satunya struktur dasar yang benar-benar membutuhkan dukungan dari runtime itu sendiri, setidaknya dalam bahasa yang dikelola, adalah array: jika Anda tidak mengelola memori, Anda akan kesulitan mendapatkan banyak byte yang berdekatan. Setiap struktur lain dapat dibangun dari array dan pointer (atau referensi).
sumber
APL (dan varian modern terkait, A +, J dan K) memiliki skalar, vektor, dan matriks sebagai struktur data kelas satu.
Ya, mereka dapat usang hanya sebagai varian pada array. Tetapi mereka juga bebas dari deklarasi kompleks dan tidak berasal dari perpustakaan yang terpisah, mereka merasa seperti struktur data kompleks yang merupakan bagian kelas bahasa.
sumber
Daftar dan petakan peta dan sintaksis penutupan yang mudah digunakan adalah fitur penting dari bahasa tingkat tinggi.
Perbedaan antara kode Java ini:
dan kode Groovy ini:
sangat besar. Ini perbedaan antara program baris 40.000 dan program 10.000 baris. Masalah sintaksis.
sumber
var t = new Thing(foo: 3, bar: 6.3, baz: true);
- hanya 4 karakter lagi.Tentu itu tergantung pada aplikasi bahasa pemrograman, tetapi untuk bahasa level yang lebih tinggi harus senyaman mungkin untuk bekerja dengan struktur data umum apa pun. Lihat daftar tipe data abstrak di Wikipedia untuk contohnya. Saya menemukan prinsip-prinsip dasar berikut yang paling umum (tetapi saya juga ingin mendengar pendapat lain):
Anda dapat meniru struktur apa pun dengan struktur lain - itu hanya tergantung pada seberapa mudah dan jelas bahasa pemrograman memungkinkannya. Contohnya:
Sebagian besar bahasa menyediakan setidaknya satu jenis untuk urutan yang diurutkan, satu untuk peta 1 dimensi, dan satu untuk peta multi dimensi, terbatas pada fungsi. Secara pribadi, saya sering melewatkan set dan memesan struktur multi-dimensi dalam bahasa seperti Perl, PHP, JavaScript, Lua ... karena meniru mereka tidak cukup nyaman.
sumber
Saya pikir itu ide buruk untuk memiliki terlalu banyak tipe data istimewa yang mendapatkan sintaks khusus. Ini mempersulit sintaksis bahasa yang tidak perlu, membuat kode lebih sulit untuk dibaca, mempersulit pemula untuk belajar dan membuatnya lebih sulit untuk mengembangkan alat untuk bahasa.
Tidak apa-apa untuk membuat pengecualian untuk sejumlah kecil tipe struktur data yang sangat umum. Saya mungkin akan mengizinkan maksimum:
Apa pun yang lebih canggih dari itu mungkin harus diserahkan ke perpustakaan untuk ditangani, menggunakan sintaksis normal bahasa untuk tipe data khusus.
Secara khusus, hal-hal seperti pohon Merah / Hitam, Antrian Prioritas dll. Memiliki cukup banyak opsi implementasi yang mungkin, jadi tidak bijaksana untuk memanggang implementasi tertentu ke dalam bahasa inti. Lebih baik membiarkan orang memilih implementasi yang paling tepat untuk situasi mereka. Contoh pilihan implementasi yang saya mungkin tidak ingin seorang perancang bahasa membatasi pilihan saya pada:
sumber