Apa yang dimaksud dengan tipe data primitif?

42

Pemahaman saya tentang tipe data primitif adalah itu

Ini adalah tipe data yang disediakan oleh bahasa secara implisit (Lainnya adalah kelas yang ditentukan pengguna)

Jadi bahasa yang berbeda memiliki kumpulan tipe data yang berbeda yang dianggap primitif untuk bahasa tertentu. Apakah itu benar?

Dan apa perbedaan antara "tipe data dasar" dan "tipe data bawaan". Wikipedia mengatakan tipe data primitif adalah salah satu dari keduanya.

PS - Mengapa tipe "string" dianggap sebagai tipe primitif di SNOBOL4 dan bukan di Jawa?

jsp99
sumber

Jawaban:

34

Itu agak tergantung pada bahasa.

Misalnya, dalam bahasa seperti C dan C ++, Anda memiliki sejumlah built-in jenis skalar - int, float, double, char, dll Ini adalah "primitif" dalam arti bahwa mereka tidak bisa diurai menjadi komponen yang lebih sederhana. Dari tipe dasar ini Anda dapat menentukan tipe baru - tipe pointer, tipe array, tipe struct, tipe union, dll.

Kemudian Anda memiliki bahasa seperti Lisp sekolah tua, di mana semuanya adalah atom atau daftar . Sekali lagi, dengan definisi di atas, atom adalah "primitif" dalam arti bahwa ia tidak dapat diuraikan menjadi sesuatu yang lebih sederhana.

Edit

Sejauh yang saya ketahui, istilah "primitif", "dasar", dan "bawaan" cukup dapat dipertukarkan. Namun, jika Anda benar-benar ingin bertele - tele, Anda dapat membedakan antara tipe yang "built-in" (yang secara eksplisit disediakan oleh definisi bahasa) dan tipe yang berasal dari tipe built-in yang masih "primitif" atau "dasar" karena mereka tidak dapat diuraikan menjadi elemen yang lebih sederhana. C'stypedeffasilitas memungkinkan Anda untuk membuat nama tipe baru untuk tipe yang sudah ada. Ada memungkinkan Anda untuk membuat jenis skalar baru yang memiliki kendala pada mereka. Misalnya, Anda bisa mendapatkan tipe Latitude dari tipe mengambang bawaan, dengan batasan yang tidak bisa mengambil nilai di luar rentang [-90.0, 90.0]. Ini masih tipe primitif atau dasar karena tidak dapat dipecah menjadi komponen yang lebih sederhana, tetapi karena itu didefinisikan pengguna, itu tidak dianggap sebagai tipe "built-in".

Sekali lagi, konsep-konsep ini sedikit kabur, dan itu benar-benar tergantung pada konteksnya. Misalnya, gagasan tipe "built-in" tidak ada artinya untuk bahasa tanpa jenis seperti BLISS.

John Bode
sumber
apa perbedaan antara tipe data dasar dan bawaan?
jsp99
1
Apakah "string" merupakan tipe data primitif di Jawa ?? (Saya telah melihat komentar delnan untuk jawaban Jesper). Saya ingin tahu pendapat Anda, karena dalam salah satu komentar Anda, Anda mengatakan "apakah tipe primitif tergantung pada siapa Anda bertanya".
jsp99
@Appy - lihat edit.
John Bode
3
@Appy String di Java tidak primitif karena ini adalah tipe majemuk. Jika Anda melihat kode sumber kelas String (src.zip di folder JDK) Anda akan melihat, bahwa String secara internal direpresentasikan sebagai array karakter. Jadi, Anda dapat menguraikan String menjadi karakter individu. Anda tidak dapat menguraikan karakter menjadi nilai yang lebih kecil yang membuat chartipe primitif dan Stringtipe gabungan.
Jacek Prucia
2
@Appy Anda tidak mengerti intinya. String SNOBOL4 tidak dapat diurai. String Java bisa. Itulah perbedaannya. Keduanya dibangun tetapi hanya string SNOBOL4 yang primitif.
Rig
19

Dari perspektif Jawa :

Di Jawa, ada perbedaan yang sangat jelas antara tipe primitif dan non-primitif.

Variabel tipe primitif secara langsung berisi nilai tipe itu (dengan kata lain, mereka adalah tipe nilai ).

Variabel tipe non-primitif tidak mengandung nilai secara langsung; alih-alih, ini adalah referensi (mirip dengan pointer) ke objek. (Tidak mungkin di Jawa untuk membuat tipe nilai yang ditentukan pengguna).

Java memiliki delapan tipe primitif: byte, short, int, long, char, boolean, floatdan double. Yang lainnya adalah tipe non-primitif.

Jesper
sumber
Jadi String datatype adalah non-primitif di Jawa. Dalam setiap program Java () utama kita menulis "public static static (String args [])". Mengapa? Mengapa kita selalu harus melewati argumen String di main? Juga kita tidak perlu mengimpor tipe String di Java seperti cara kita memasukkannya ke dalam C / C ++ (mis. #Include <string> atau menggunakan std :: string). Tolong jelaskan.
Maxood
7
@ Maxwell String memang memiliki status khusus dalam bahasa (itu mendapat literal, itu dalam tanda tangan main, ada interning yang saya anggap diizinkan secara eksplisit oleh JLS, itu tersedia secara otomatis, dll.) Tetapi itu bukan tipe data primitif . Orang mungkin menyebutnya built-in .
@Jesper Mengapa tipe primitif lebih cepat bekerja? Hanya karena fakta bahwa mereka tidak memiliki pembungkus ekstra non-primitif? Saya mencoba untuk mencari tahu perbedaan antara primitif dan non-primitif ... seperti apakah primitif dibangun ke dalam CPU atau sesuatu?
Abdul
Dari Wikipedia: "Bergantung pada bahasa dan implementasinya, tipe data primitif mungkin atau mungkin tidak memiliki korespondensi satu-ke-satu dengan objek dalam memori komputer. Namun, orang biasanya mengharapkan operasi pada tipe data primitif dasar menjadi bahasa tercepat. konstruk ada. " --- Jadi korespondensi 1-ke-1 ini adalah penyebab utama lebih cepat, sedangkan dengan objek, itu bukan 1-ke-1. Apakah saya benar?
Abdul
1
@Abdul jangan membuatnya terlalu rumit. CPU memiliki sejumlah register, yang dapat berisi berbagai jenis nilai primitif (misalnya integer 32-bit atau 64-bit atau angka floating point presisi tunggal atau ganda) dan CPU memiliki instruksi yang diterapkan dalam perangkat keras untuk melakukan operasi pada nilai-nilai dalam register. Komentar terakhir Anda pada dasarnya benar.
Jesper
9

Primitif adalah tipe data dasar yang tidak dibangun dari tipe data lainnya. Itu hanya dapat mewakili satu nilai tunggal. Semua primitif adalah tipe data bawaan karena kebutuhan, (kompilator harus mengetahuinya), tetapi tidak semua tipe data bawaan merupakan primitif.

Dalam beberapa bahasa, kompiler memiliki pengetahuan bawaan tentang jenis-jenis tertentu yang dibangun dari hal-hal lain, karena ia harus dapat memperlakukan mereka dengan cara yang khusus. Contohnya adalah Varian dalam Delphi dan Visual Basic (dan setara Boo, "Duck") dan kelas objek dasar dalam sebagian besar bahasa OO.

Mason Wheeler
sumber
Terima kasih :) Jawaban Anda sangat informatif, tetapi saya tidak dapat memahami dengan jelas. Bisakah Anda memberikan beberapa contoh (mungkin dengan C / C ++ / Java).
jsp99
@Mason Wheeler Di sinilah kami menggunakan istilah pengetikan yang longgar dan pengetikan yang kuat. Seperti yang saya dengar orang mengatakan bahwa VB adalah bahasa yang diketik secara longgar sedangkan Java adalah bahasa yang diketik dengan kuat. Mohon konfirmasi.
Maxood
3
@Appy C ++ dikirimkan bersama kelas untuk string, vektor, dan peta. Ini built-in mereka datang dengan bahasa, dalam definisi bahasa dll. Namun mereka ditulis dalam C ++ mereka berasal dari perpustakaan standar. Anda dapat menulis sendiri yang berperilaku identik. Bandingkan ini dengan int atau char. Anda tidak dapat mendefinisikan karakter Anda sendiri di C ++. Anda bisa membebani setiap operator di kelas dan mendapatkan sesuatu yang berperilaku sama tetapi tidak identik. Ini primitif. Pada dasarnya sesuatu didefinisikan dalam bahasa yang tidak dapat diterapkan dalam bahasa itu.
stonemetal
5

Mengapa tipe "string" dianggap sebagai tipe primitif di SNOBOL4 dan bukan di Java?

Karena Spesifikasi Bahasa Jawa dengan sangat jelas menentukan apa arti kata "primitif" dalam konteks Jawa, dan Java Stringtidak sesuai dengan spesifikasi ini, sedangkan Spesifikasi Bahasa SNOBOL4 mendefinisikan apa arti "primitif" dalam konteks string SNOBOL4 dan SNOBOL4 sesuai dengan spesifikasi itu.

Tidak ada yang lebih dari itu. Spesifikasi bahasa masing-masing mendefinisikan arti kata-kata tertentu dan sesuatu yang cocok dengan deskripsi itu atau tidak. Sebagai contoh, Spesifikasi Bahasa C mendefinisikan arti kata "fungsi" menjadi sesuatu yang sangat jelas bukan arti kata "fungsi", tetapi itulah cara kata tersebut digunakan di dalam komunitas C.

Jörg W Mittag
sumber
@Mittag Berdasarkan jawaban Anda, saya mencari beberapa frasa di Google dan menemukan tautan yang sangat bagus yang hampir menghilangkan semua keraguan tentang topik khusus ini :).
jsp99
0

Tipe data 'primitif' berarti bahwa Anda memiliki nilai yang tersimpan di memori - nilai ini tidak memiliki metode atau struktur internal. Primitif hanya dapat dioperasikan oleh operasi eksternal.

Di Jawa, primitif adalah angka (int, panjang, dll.) Dan char. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

Jika nilai Anda memiliki struktur (saya memikirkan struts di sini) maka itu bukan primitif. Jika memiliki metode (objek atau kelas) itu bukan primitif.

JoshRagem
sumber
2
intTipe data primitif C # memang memiliki metode ...
Heinzi
Bisakah Anda memberi contoh?
JoshRagem
var myString = 3.ToString();(lihat Int32.ToString () ). Perhatikan bahwa intdalam C # adalah sinonim untuk Int32, yaitu, Int32 adalah tipe primitif (tidak seperti Java, di mana Integerberbeda dari int). Jadi, 3.ToString()di C # tidak melibatkan tinju!
Heinzi
Itu sangat menarik; tautan yang Anda berikan menunjukkan bahwa 'int' benar-benar objek kelas 'Int32' (atau mungkin kombinasi dari kelas primitif dan kelas pembungkus), jadi menurut definisi yang saya cantumkan: 'int' bukan primitif. :)
JoshRagem
1
@barlop: Java tidak diturunkan dari C ++. Jika Herbert Schildt bahkan tidak bisa meluruskan fakta sesederhana itu, saya tidak yakin saya akan mempercayai sisa buku ini juga. Patrick Naughton, perancang asli Jawa, adalah penggemar Objective-C yang besar. Bahkan, dia sudah memberikan pemberitahuan untuk mengerjakan Objective-C di NeXT, ketika Scott McNealy meyakinkannya untuk tinggal di Sun dan merancang bahasa baru. James Gosling, perancang asli lainnya, sangat akrab dengan Smalltalk (leluhur langsung Objective-C) dan Lisp (inspirasi untuk Smalltalk). Belakangan, beberapa anggota tim desain Objective-C pindah ke Sun.
Jörg W Mittag
0

Saya menemukan beberapa informasi dan merasa itu akan membantu jawaban yang lain. Jadi ingin membagikannya -

Wikipedia mengatakan -

Dalam ilmu komputer, tipe data primitif adalah salah satu dari yang berikut:

Tipe dasar adalah tipe data yang disediakan oleh bahasa pemrograman sebagai blok penyusun dasar. Sebagian besar bahasa memungkinkan tipe komposit yang lebih rumit untuk dibangun secara rekursif mulai dari tipe dasar.
Tipe bawaan adalah tipe data yang bahasa pemrogramannya menyediakan dukungan bawaan.

Di sebagian besar bahasa pemrograman, semua tipe data dasar adalah bawaan. Selain itu, banyak bahasa juga menyediakan satu set tipe data komposit (tipe "string" di Jawa).

Saya ingin mengatakannya seperti ini -
Tipe data dasar adalah tipe data yang tidak dapat dirinci lebih lanjut (tipe "string" dapat dibuat dari "char", tetapi char tidak dapat 'dipecah' menjadi tipe data apa pun (Dalam sebagian besar Pemrograman bahasa) .Jadi ini adalah tipe data dasar)

Jenis string, di SNOBOL4 dianggap primitif. Meskipun saya tidak tahu alasan pasti mengapa. Baik dasar maupun bawaan di SNOBOL4.

Spesifikasi Java dengan jelas menyebutkan daftar tipe data yang dianggapnya tipe primitif. Karena tipe string tidak dalam spesifikasi mereka , itu bukan tipe data primitif di Jawa, meskipun menjadi tipe bawaan.

jsp99
sumber
-2

Primitif adalah tipe data mendasar yang disediakan oleh bahasa itu sendiri. Contoh dalam bahasa C adalah tipe data int, float, char. Ini disediakan sebagai bagian mendasar dari bahasa.

Non primitif adalah variabel atau objek yang ditentukan pengguna. Misalnya Anda bisa mendefinisikan objek yang menyimpan data atau Anda bisa menggunakan struct di C untuk mendefinisikan variabel Anda sendiri. Ini bukan primitif karena Anda harus mendefinisikannya terlebih dahulu untuk menggunakannya.

Contoh: Karyawan, Mahasiswa, a_very_large_number_that_you_defined_your diri

Sunting dengan lebih banyak penjelasan dan menanggapi komentar yang saya anggap primitif sebagai variabel yang awalnya berasal dari bahasa dan bukan variabel seperti String di C ++ yang harus Anda deklarasikan menggunakan kata kunci baru. Itu menjadikannya objek sehingga String tidak akan menjadi primitif.

Jawab komentar Anda: Ini mungkin ada hubungannya dengan implementasi variabel. Jika itu adalah bagian dari inti bahasa, itu adalah primitif. Jika tidak, tidak. Contohnya adalah String dalam C ++. Ini bukan variabel inti dan dinyatakan menggunakan kata kunci baru. Jadi itu tidak primitif.

Tanpa nama
sumber
Terima kasih atas jawabannya . Apakah klasifikasi tipe data sebagai "primitif" bergantung pada implementasinya? Seperti di C / C ++ kita menyimpan string sebagai array array. Tapi kita perlu mendefinisikannya secara eksplisit. Jadi jika beberapa bahasa lain memiliki implementasi yang sama untuk menyimpan string tetapi memberikannya secara implisit, apakah datatype "string" menjadi primitif dalam bahasa tertentu?
jsp99
@Appy - mungkin. C tidak menyediakan stringtipe data seperti itu; string direpresentasikan sebagai agregat dari tipe primitif char. C ++ memperkenalkan stringtipe data yang tepat , tetapi apakah itu tipe "primitif" itu sendiri tergantung pada siapa Anda bertanya. Secara pribadi, saya tidak akan mengklasifikasikannya. Namun, saya akan mengklasifikasikan tipe string BASIC old-school sebagai tipe primitif, untuk alasan yang mungkin sepenuhnya arbitrer.
John Bode
Mengatasi komentar Anda dalam pertanyaan itu sendiri. Tolong lihat edit.
Noname
2
string dalam C ++ tidak perlu dibuat dengan new
jk.
@ jk saya tidak terhubung dengan C ++. Kamu benar. Akan memperbaiki ans.
Noname
-2

Untuk lebih memahami konsep tipe primitif dan tipe data yang ditentukan pengguna, semua yang tidak ada jawaban lainnya adalah konsep compiler.

Jika Anda memahami konsep leksem yang dipilih sebagai token , Anda akan mengetahui bahwa primitif adalah satu-satunya tipe data yang diketahui oleh kompiler dengan sendirinya.

Amit
sumber