Tipe data skalar vs. primitif - apakah keduanya sama?

127

Di berbagai artikel yang pernah saya baca, terkadang ada referensi untuk tipe data primitif dan terkadang ada referensi untuk skalar.

Pemahaman saya tentang masing-masing adalah bahwa mereka adalah tipe data dari sesuatu yang sederhana seperti int, boolean, char, dll.

Apakah ada sesuatu yang saya lewatkan yang berarti Anda harus menggunakan terminologi tertentu atau apakah istilah tersebut dapat dipertukarkan? Halaman Wikipedia untuk masing-masing halaman tidak menunjukkan sesuatu yang jelas.

Jika persyaratannya hanya dapat dipertukarkan, mana yang lebih disukai?

Ben Pearson
sumber

Jawaban:

203

Saya tidak berpikir mereka dapat dipertukarkan. Mereka sering kali serupa, tetapi perbedaannya memang ada, dan tampaknya terutama pada apa yang dikontraskan dan apa yang relevan dalam konteks.

Skalar biasanya dikontraskan dengan senyawa , seperti array, peta, set, struct, dll. Skalar adalah nilai "tunggal" - bilangan bulat, boolean, mungkin string - sedangkan senyawa terdiri dari beberapa skalar (dan mungkin referensi ke senyawa lainnya). "Skalar" digunakan dalam konteks di mana perbedaan yang relevan adalah antara nilai tunggal / sederhana / atom dan nilai gabungan.

Tipe primitif , bagaimanapun, dikontraskan dengan tipe referensi misalnya , dan digunakan ketika perbedaan yang relevan adalah "Apakah ini secara langsung sebuah nilai, atau apakah itu referensi ke sesuatu yang berisi nilai sebenarnya?", Seperti dalam tipe primitif Java vs. referensi . Saya melihat ini sebagai perbedaan tingkat yang lebih rendah daripada skalar / senyawa, tetapi tidak sepenuhnya.

Itu sangat tergantung pada konteks (dan seringkali rumpun bahasa apa yang sedang dibahas). Untuk mengambil satu, mungkin patologis, contoh: string. Dalam C, string adalah gabungan (larik karakter), sedangkan di Perl, string adalah skalar. Di Java, string adalah objek (atau tipe referensi). Dalam Python, semuanya (secara konseptual) merupakan tipe objek / referensi, termasuk string (dan angka).

Michael Ekstrand
sumber
1
Juga untuk dipertimbangkan dalam diskusi tentang tipe referensi dan tipe primitif adalah tipe "nilai". Mengenai kesetaraan skalar dan primitif, itu tergantung pada bahasanya. Menurut manual PHP, misalnya, hanya setengah dari tipe primitifnya adalah skalar: php.net/manual/en/language.types.intro.php
Joe Bowbeer
11
Ini membantu saya 8 tahun kemudian :)
CoderXYZ
18

Ada banyak kebingungan dan penyalahgunaan istilah-istilah ini. Seringkali yang satu digunakan untuk mengartikan yang lain. Inilah arti sebenarnya dari istilah-istilah itu.

"Native" mengacu pada jenis yang disertakan dalam bahasa, bukan yang disediakan oleh pustaka (bahkan pustaka standar), terlepas dari bagaimana penerapannya. String Perl adalah bagian dari bahasa Perl, jadi string asli di Perl. C menyediakan semantik string melalui pointer ke chars menggunakan perpustakaan, jadi pointer ke char adalah native, tetapi string tidak.

"Atomic" mengacu pada jenis yang tidak lagi dapat diuraikan. Ini kebalikan dari "komposit" . Komposit dapat diuraikan menjadi kombinasi nilai atom atau komposit lainnya. Bilangan bulat asli dan bilangan floating point adalah atom. Pecahan, bilangan kompleks, wadah / koleksi, dan string adalah gabungan.

"Skalar" - dan ini adalah salah satu yang membingungkan kebanyakan orang - mengacu pada nilai yang dapat menyatakan skala (karena itulah namanya), seperti ukuran, volume, hitungan, dll. Bilangan bulat, bilangan floating point, dan pecahan adalah skalar. Bilangan kompleks, boolean, dan string BUKAN skalar. Sesuatu yang bersifat atom belum tentu skalar dan sesuatu yang skalar belum tentu atom. Skalar bisa asli atau disediakan oleh perpustakaan.

Beberapa jenis memiliki klasifikasi yang aneh. Jenis BigNumber, biasanya diimplementasikan sebagai larik digit atau integer, adalah skalar, tetapi secara teknis tidak atomik. Mereka dapat tampak seperti atom jika penerapannya tersembunyi dan Anda tidak dapat mengakses komponen internal. Tetapi komponennya hanya tersembunyi, jadi atomicity adalah ilusi. Mereka hampir selalu tersedia di perpustakaan, jadi mereka tidak asli, tapi bisa saja. Dalam bahasa pemrograman Mathematica, misalnya, bilangan besar adalah native dan, karena tidak ada cara bagi program Mathematica untuk menguraikannya menjadi blok penyusunnya, bilangan tersebut juga atom dalam konteks itu, meskipun faktanya mereka adalah komposit di bawah sampul (di mana Anda tidak lagi berada di dunia bahasa Mathematica).

Definisi ini tidak bergantung pada bahasa yang digunakan.

Claudio Puviani
sumber
16
Meskipun definisi tipe skalar ini paling masuk akal bagi saya, ini tampaknya bukan yang paling umum diterima.
lleaff
1
Terima kasih untuk definisi yang jelas tentang 'Skalar'. Meskipun, seperti yang ditunjukkan @lleaff kebanyakan orang tidak menggunakannya dalam pengertian khusus ini, akan lebih baik jika mereka menggunakannya.
clockworkpc
Definisi linguistik yang sangat baik. Jawaban ini harus dibaca bersama dengan jawaban Michael Ekstrand untuk pembahasan yang lebih lengkap. Sayangnya, dalam konteks bahasa pemrograman, skalar memiliki arti yang berbeda.
Jerry
9

Sederhananya, akan tampak bahwa jenis 'skalar' mengacu pada satu item, bukan gabungan atau kumpulan. Jadi skalar menyertakan nilai primitif serta hal-hal seperti nilai enum.

http://ee.hawaii.edu/~tep/EE160/Book/chap5/section2.1.3.html

Mungkin istilah 'skalar' mungkin merupakan kemunduran ke C:

di mana skalar adalah objek primitif yang berisi satu nilai dan tidak terdiri dari objek C ++ lainnya

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1995/N0774.pdf

Saya ingin tahu apakah ini mengacu pada apakah barang-barang ini akan memiliki nilai 'skala'? - Seperti menghitung angka.

Scott Langeberg
sumber
2
Saya telah diajarkan (sangat lama di sekolah) bahwa istilah itu berasal dari 'prosesor skalar' berbeda dengan 'prosesor vektor'. Prosesor skalar adalah CPU yang hanya dapat menangani satu bagian data pada satu waktu. Prosesor ini dinamai menurut istilah aritmatika. Yang cukup menarik, ketika Anda mencari 'skalar' di wikipedia, Anda dialihkan ke 'variabel'.
Evert
2

Saya suka jawaban Scott Langeberg karena ringkas dan didukung oleh tautan otoritatif. Saya akan memilih jawaban Scott jika saya bisa.

Saya kira tipe data "primitif" dapat dianggap tipe data primer sehingga tipe data sekunder diturunkan dari tipe data primer. Derivasi melalui penggabungan, seperti struktur C ++. Sebuah struct dapat digunakan untuk menggabungkan tipe data (seperti dan int dan char) untuk mendapatkan tipe data sekunder. Tipe data yang ditentukan struktur selalu merupakan tipe data sekunder. Tipe data primer tidak diturunkan dari apapun, melainkan diberikan dalam bahasa pemrograman.

Saya memiliki paralel dengan primitif menjadi nomenklatur yang berarti primer. Paralel itu adalah "ekspresi reguler". Saya pikir nomenklatur "biasa" dapat dipahami sebagai "pengaturan". Jadi Anda memiliki ekspresi yang mengatur pencarian.

Etimologi skalar ( http://www.etymonline.com/index.php?allowed_in_frame=0&search=scalar&searchmode=none ) artinya seperti tangga. Menurut saya, kaitannya dengan pemrograman adalah bahwa sebuah tangga hanya memiliki satu dimensi: Berapa banyak anak tangga dari ujung tangga. Tipe data skalar hanya memiliki satu dimensi, sehingga diwakili oleh satu nilai.

Menurut saya dalam penggunaan, primitif dan skalar dapat dipertukarkan. Apakah ada contoh dari sebuah primitif yang bukan skalar, atau dari sebuah skalar yang tidak primitif?

Meskipun dapat dipertukarkan, primitif mengacu pada tipe data yang menjadi blok bangunan dasar dari tipe data lain, dan primitif tidak terdiri dari tipe data lain.

Skalar mengacu pada memiliki nilai tunggal. Skalar kontras dengan vektor matematika. Sebuah vektor tidak diwakili oleh satu nilai karena (menggunakan satu jenis vektor sebagai contoh) satu nilai diperlukan untuk mewakili arah vektor dan nilai lain diperlukan untuk mewakili besarnya vektor.

Tautan referensi: http://whatis.techtarget.com/definition/primitive http://en.wikipedia.org/wiki/Primitive_data_type

Indinfer
sumber
0

Di C, tipe enumerasi, karakter, dan berbagai representasi bilangan bulat membentuk kelas tipe yang lebih umum yang disebut tipe skalar. Karenanya, operasi yang dapat Anda lakukan pada nilai jenis skalar apa pun sama dengan operasi bilangan bulat.

Onkell Wang
sumber
0

tipe null adalah satu-satunya hal yang paling realistis sesuai dengan definisi "tipe skalar". Bahkan serialisasi 'None' sebagai 'N.' menyesuaikan dengan kata 16bit yang secara tradisional adalah skalar - atau bahkan satu bit yang memiliki beberapa kemungkinan nilai - bukanlah "data tunggal".

Pemberi komentar
sumber
0

Setiap primitif adalah skalar, tetapi tidak sebaliknya. DateTime adalah skalar, tetapi tidak primitif.

MarkZ
sumber