ชนิดข้อมูลดั้งเดิมมีความหมายอย่างไร


42

ความเข้าใจของฉันเกี่ยวกับประเภทข้อมูลดั้งเดิมคือ

มันเป็นประเภทข้อมูลที่จัดทำโดยภาษาโดยนัย (อื่น ๆ เป็นชั้นเรียนที่ผู้ใช้กำหนด)

ภาษาที่ต่างกันจึงมีชุดข้อมูลที่แตกต่างกันซึ่งถือว่าเป็นภาษาดั้งเดิมสำหรับภาษานั้น นั่นถูกต้องใช่ไหม?

และอะไรคือความแตกต่างระหว่าง "ประเภทข้อมูลพื้นฐาน" และ "ประเภทข้อมูลในตัว" Wikipedia กล่าวว่าประเภทข้อมูลดั้งเดิมเป็นหนึ่งในสองชนิดนี้

PS - ทำไมประเภท "string" จึงถูกพิจารณาว่าเป็นประเภทพื้นฐานใน SNOBOL4 และไม่ใช่ใน Java?

คำตอบ:


34

มันขึ้นอยู่กับภาษา

ยกตัวอย่างเช่นในภาษาเช่น C และ C ++ คุณมีจำนวนของในตัวชนิดเกลา - int, float, double, charฯลฯ เหล่านี้เป็น "ดั้งเดิม" ในแง่ที่ว่าพวกเขาไม่สามารถย่อยสลายเป็นชิ้นส่วนที่เรียบง่าย จากประเภทพื้นฐานเหล่านี้คุณสามารถกำหนดประเภทใหม่ - ประเภทตัวชี้ประเภทอาร์เรย์ประเภทโครงสร้างประเภทยูเนี่ยน ฯลฯ

แล้วคุณมีภาษาเช่นโรงเรียนเก่าเสียงกระเพื่อมที่ทุกอย่างเป็นอย่างใดอย่างหนึ่งอะตอมหรือรายการ อีกครั้งตามคำนิยามข้างต้นอะตอมเป็น "ดั้งเดิม" ในแง่ที่ว่ามันไม่สามารถย่อยสลายเป็นสิ่งที่ง่ายกว่า

แก้ไข

เท่าที่ฉันกังวลคำว่า "ดึกดำบรรพ์" "พื้นฐาน" และ "ในตัว" นั้นใช้แทนกันได้ค่อนข้างมาก หากคุณต้องการได้รับความคล่องแคล่วจริง ๆคุณสามารถแยกแยะความแตกต่างระหว่างประเภทที่มี "บิวท์อิน" (ที่มาพร้อมกับคำจำกัดความภาษาอย่างชัดเจน) และประเภทที่ได้มาจากประเภทบิวด์อินที่ยังคงเป็น "ดั้งเดิม" หรือ "พื้นฐาน" ในสิ่งที่พวกเขาไม่สามารถจำแนกออกเป็นองค์ประกอบที่เรียบง่าย ซีtypedefสิ่งอำนวยความสะดวกช่วยให้คุณสร้างชื่อประเภทใหม่สำหรับประเภทที่มีอยู่ Ada ช่วยให้คุณสร้างสเกลาร์ชนิดใหม่ที่มีข้อ จำกัด ตัวอย่างเช่นคุณสามารถสืบทอดประเภท Latitude จากชนิดลอยในตัวโดยมีข้อ จำกัด ที่ไม่สามารถรับค่านอกช่วง [-90.0, 90.0] มันยังคงเป็นชนิดพื้นฐานหรือแบบพื้นฐานที่ไม่สามารถแยกย่อยเป็นส่วนประกอบที่ง่ายกว่าใด ๆ แต่เนื่องจากเป็นแบบที่ผู้ใช้กำหนดเองจึงไม่ถือว่าเป็นชนิด "ในตัว"

อีกครั้งแนวคิดเหล่านี้ค่อนข้างคลุมเครือและขึ้นอยู่กับบริบท ตัวอย่างเช่นความคิดของประเภท "ในตัว" นั้นไม่มีความหมายสำหรับภาษาที่ไม่มีการพิมพ์เช่น BLISS


อะไรคือความแตกต่างระหว่างพื้นฐานและสร้างขึ้นในประเภทข้อมูล?
jsp99

1
"string" เป็นประเภทข้อมูลดั้งเดิมใน Java หรือไม่? (ฉันได้เห็นความคิดเห็นของ delnan ต่อคำตอบของ Jesper) ฉันต้องการทราบความคิดเห็นของคุณเพราะหนึ่งในความคิดเห็นของคุณคุณพูดว่า "ประเภทดั้งเดิมหรือไม่นั้นขึ้นอยู่กับคนที่คุณถาม"
jsp99

@Appy - ดูการแก้ไข
John Bode

3
@Appy String ใน Java ไม่ได้เป็นพื้นฐานเพราะเป็นประเภทสารประกอบ หากคุณดูซอร์สโค้ดคลาส String (src.zip ในโฟลเดอร์ JDK) คุณจะเห็นว่า String ภายในนั้นจะแสดงเป็นอาร์เรย์ของอักขระ ดังนั้นคุณสามารถแยกย่อยสตริงออกเป็นอักขระแต่ละตัวได้ คุณไม่สามารถแยกตัวละครออกเป็นค่าที่น้อยลงซึ่งทำให้charประเภทดั้งเดิมและStringประเภทผสม
Jacek Prucia

2
@Appy คุณไม่มีจุด ไม่สามารถแยกสตริง SNOBOL4 ได้ สตริง Java สามารถ นั่นคือความแตกต่าง ทั้งสองถูกสร้างขึ้น แต่สตริง SNOBOL4 เท่านั้นเป็นดั้งเดิม
Rig

19

จากมุมมองJava :

ใน Java มีความแตกต่างที่ชัดเจนระหว่างประเภทดั้งเดิมและไม่ใช่ดั้งเดิม

ตัวแปรประเภทดั้งเดิมมีค่าของประเภทนั้นโดยตรง (ในคำอื่น ๆ พวกเขาเป็นประเภทค่า )

ตัวแปรประเภทที่ไม่ใช่ดั้งเดิมไม่มีค่าโดยตรง แต่เป็นการอ้างอิง (คล้ายกับตัวชี้) ไปยังวัตถุแทน (เป็นไปไม่ได้ใน Java เพื่อสร้างประเภทค่าที่ผู้ใช้กำหนด)

Java มีแปดชนิดดั้งเดิม: byte, short, int, long, char, boolean, และfloat doubleสิ่งอื่นใดที่ไม่ใช่แบบดั้งเดิม


ดังนั้นประเภทข้อมูล String จึงไม่ใช่แบบดั้งเดิมใน Java ในทุกโปรแกรม Java main () เราเขียน "public void main main (String args [])" ทำไม? ทำไมเราต้องผ่านการโต้แย้งสตริงในหลักเสมอ นอกจากนี้เราไม่จำเป็นต้องนำเข้าประเภทสตริงใน Java ด้วยวิธีที่เรารวมไว้ใน C / C ++ (เช่น #include <string> หรือการใช้ std :: string) กรุณาอธิบาย.
Maxood

7
@Maxood String จะมีสถานะพิเศษในภาษา (ที่จะได้รับตัวอักษรก็อยู่ในลายเซ็นของmainมีที่ฝึกงานซึ่งผมคิดว่าจะได้รับอนุญาตอย่างชัดเจนโดย JLS ก็สามารถใช้ได้โดยอัตโนมัติ ฯลฯ ) แต่มันไม่ได้เป็นแบบดั้งเดิมชนิดข้อมูล หนึ่งอาจเรียกว่าในตัว

@Jesper ทำไมประเภทดั้งเดิมจึงทำงานเร็วกว่า เพียงเพราะความจริงที่ว่าพวกเขาไม่มีห่อพิเศษที่ไม่ใช่แบบดั้งเดิม? ฉันพยายามที่จะเข้าใจถึงความแตกต่างระหว่างสิ่งดั้งเดิมและสิ่งที่ไม่สำคัญ ... เช่นเดียวกับสิ่งที่สร้างขึ้นในซีพียูหรืออะไร?
อับดุล

จากวิกิพีเดีย: "ขึ้นอยู่กับภาษาและการนำไปใช้งานชนิดข้อมูลดั้งเดิมอาจมีหรือไม่มีการโต้ตอบแบบหนึ่งต่อหนึ่งกับวัตถุในหน่วยความจำของคอมพิวเตอร์อย่างไรก็ตามมักจะคาดหวังว่าการทำงานกับชนิดข้อมูลพื้นฐานขั้นพื้นฐานจะเป็นภาษาที่เร็วที่สุด โครงสร้างมี " --- ดังนั้นการติดต่อแบบ 1 ต่อ 1 นี้เป็นสาเหตุที่ทำให้มันเร็วขึ้นในขณะที่มีวัตถุมันไม่ใช่แบบ 1 ต่อ 1 ฉันถูกไหม?
อับดุล

1
@ Abdul ไม่ได้ทำให้มันซับซ้อนเกินไป CPU มีจำนวนการลงทะเบียนที่สามารถมีค่าดั้งเดิมต่าง ๆ ได้ (เช่นจำนวนเต็มแบบ 32 บิตหรือ 64 บิตหรือเลขทศนิยมที่มีความแม่นยำเพียงจุดเดียวหรือสองครั้ง) และ CPU มีคำแนะนำในการนำฮาร์ดแวร์ไปใช้ในการทำงาน ค่าในการลงทะเบียน คำพูดสุดท้ายของคุณถูกต้องแล้ว
Jesper

9

ดึกดำบรรพ์เป็นชนิดข้อมูลพื้นฐานที่ไม่ได้สร้างจากชนิดข้อมูลอื่น มันสามารถแทนค่าเดียวเท่านั้น primitives ทั้งหมดเป็นชนิดข้อมูลแบบบิวด์อินตามความจำเป็น (คอมไพเลอร์ต้องรู้เกี่ยวกับมัน) แต่ไม่ใช่ชนิดข้อมูลที่มีอยู่แล้วทั้งหมดนั้นเป็นแบบดั้งเดิม

ในบางภาษาคอมไพเลอร์มีความรู้ในตัวในบางประเภทที่ถูกสร้างขึ้นจากสิ่งอื่น ๆ เพราะมันจะต้องสามารถปฏิบัติต่อพวกมันด้วยวิธีพิเศษ ตัวอย่างจะเป็น Variant ใน Delphi และ Visual Basic (และ Boo ที่เทียบเท่า "Duck") และคลาสอ็อบเจ็กต์พื้นฐานในภาษา OO ส่วนใหญ่


ขอบคุณ :) คำตอบของคุณมีข้อมูลมาก แต่ฉันไม่สามารถเข้าใจได้อย่างชัดเจน ถ้าคุณยกตัวอย่าง (อาจใช้ C / C ++ / Java)
jsp99

@Mason Wheeler นี่คือที่เราใช้คำว่าการพิมพ์หลวมและการพิมพ์ที่แข็งแกร่ง อย่างที่ฉันเคยได้ยินคนพูดว่า VB เป็นภาษาที่พิมพ์อย่างหลวม ๆ ในขณะที่ Java เป็นภาษาที่พิมพ์ได้ดี กรุณายืนยัน.
Maxood

3
@Appy C ++ มาพร้อมกับคลาสสำหรับสตริงเวกเตอร์และแผนที่ สิ่งเหล่านี้มีอยู่ในตัวพร้อมกับภาษาอยู่ในคำจำกัดความของภาษาเป็นต้นอย่างไรก็ตามพวกมันเขียนด้วยภาษา C ++ มาจากไลบรารีมาตรฐาน คุณสามารถเขียนของคุณเองที่ทำงานเหมือนกัน เปรียบเทียบสิ่งนี้กับ int หรือตัวอักษร คุณไม่สามารถกำหนดถ่านของคุณเองใน C ++ คุณสามารถโอเวอร์โหลดโอเปอเรเตอร์ทุกตัวในชั้นเรียนและรับสิ่งที่มีพฤติกรรมคล้ายกัน แต่ไม่เหมือนกัน นี่คือดั้งเดิม โดยทั่วไปสิ่งที่กำหนดไว้ในภาษาที่ไม่สามารถนำไปใช้ในภาษานั้น
stonemetal

5

ทำไมประเภท "string" จึงถูกพิจารณาว่าเป็นประเภทพื้นฐานใน SNOBOL4 และไม่ใช่ใน Java

เนื่องจาก Java Language Specification ระบุไว้อย่างชัดเจนว่าคำว่า "ดั้งเดิม" หมายถึงอะไรในบริบทของ Java และ Java Stringไม่สอดคล้องกับข้อกำหนดนี้ในขณะที่ SNOBOL4 Language Specification กำหนดว่า "ดั้งเดิม" หมายถึงอะไรในบริบทของสตริงของ SNOBOL4 และ SNOBOL4 เป็นไปตามข้อกำหนดที่

ไม่มีอะไรมากไปกว่านี้แล้ว ข้อมูลจำเพาะของภาษานั้นกำหนดความหมายของคำบางคำและบางสิ่งที่เหมาะกับคำอธิบายนั้นหรือไม่ ตัวอย่างเช่นข้อกำหนดภาษา C กำหนดความหมายของคำว่า "ฟังก์ชั่น" ให้เป็นสิ่งที่ไม่ชัดเจนว่าคำว่า "ฟังก์ชั่น" มักจะหมายถึงอะไร แต่นั่นเป็นวิธีที่คำนี้ใช้ในชุมชน C


@Mittag จากคำตอบของคุณฉันได้ค้นหาวลีและพบลิงค์ที่ดีมากซึ่งเกือบจะหมดความสงสัยในหัวข้อนี้ :)
jsp99

0

ชนิดข้อมูล 'ดั้งเดิม' หมายความว่าคุณมีค่าที่เก็บไว้ในหน่วยความจำ - ค่านี้ไม่มีวิธีการหรือโครงสร้างภายใน ดึกดำบรรพ์สามารถดำเนินการได้โดยการดำเนินงานภายนอกเท่านั้น

ใน Java พื้นฐานคือตัวเลข (int, long, etc. ) และ char http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

หากคุณค่าของคุณมีโครงสร้าง (ฉันกำลังคิดของเสาที่นี่) แล้วมันไม่ได้เป็นแบบดั้งเดิม ถ้ามันมีวิธีการ (วัตถุหรือคลาส) มันไม่ใช่แบบดั้งเดิม


2
C # 's ดั้งเดิมintชนิดข้อมูลไม่มีวิธีการ ...
Heinzi

คุณยกตัวอย่างได้ไหม
JoshRagem

var myString = 3.ToString();(ดูInt32.ToString () ) โปรดทราบว่าintใน C # เป็นคำพ้องความหมายสำหรับInt32เช่นInt32 เป็นประเภทดั้งเดิม (ไม่เหมือนกับ Java ซึ่งIntegerแตกต่างจากint) ดังนั้น3.ToString()ใน C # ไม่เกี่ยวข้องกับมวย!
Heinzi

มันน่าสนใจมาก ลิงก์ที่คุณระบุบ่งชี้ว่า 'int' เป็นวัตถุของคลาส 'Int32' (หรืออาจเป็นการรวมกันของคลาสดั้งเดิมและคลาส wrapper) ดังนั้นโดยนิยามที่ฉันใส่: 'int' ไม่ใช่แบบดั้งเดิม :)
JoshRagem

1
@barlop: Java ไม่ได้สืบทอดจาก C ++ ถ้าเฮอร์เบิร์ตชิลด์ไม่สามารถทำให้ข้อเท็จจริงตรงไปตรงมาได้ฉันไม่แน่ใจว่าฉันจะเชื่อใจในส่วนที่เหลือของหนังสือเล่มนี้ Patrick Naughton ผู้ออกแบบดั้งเดิมของ Java เป็นแฟนตัวยงของ Objective-C ในความเป็นจริงเขาได้แจ้งให้ทราบล่วงหน้าเกี่ยวกับการทำงานกับ Objective-C ที่ NeXT เมื่อ Scott McNealy โน้มน้าวให้เขาพักที่ Sun และออกแบบภาษาใหม่ James Gosling ผู้ออกแบบดั้งเดิมคนอื่น ๆ คุ้นเคยกับ Smalltalk (บรรพบุรุษโดยตรงของ Objective-C) และ Lisp (แรงบันดาลใจสำหรับ Smalltalk) ต่อมาสมาชิกหลายคนของทีมออกแบบ Objective-C ได้ย้ายไปที่ Sun
Jörg W Mittag

0

ฉันเจอข้อมูลบางอย่างและรู้สึกว่ามันจะช่วยคำตอบอื่น ๆ ดังนั้นต้องการแบ่งปัน -

Wikipedia พูดว่า -

ในวิทยาการคอมพิวเตอร์ชนิดข้อมูลดั้งเดิมนั้นเป็นอย่างใดอย่างหนึ่งต่อไปนี้:

ประเภทพื้นฐานคือประเภทข้อมูลที่จัดทำโดยภาษาการเขียนโปรแกรมเป็นแบบเอกสารสำเร็จรูปพื้นฐาน ภาษาส่วนใหญ่อนุญาตให้คอมโพสิตประเภทที่ซับซ้อนมากขึ้นที่จะสร้างซ้ำเริ่มต้นจากประเภทพื้นฐาน
ชนิดในตัวเป็นชนิดข้อมูลที่ภาษาการเขียนโปรแกรมให้การสนับสนุนในตัว

ในภาษาการเขียนโปรแกรมส่วนใหญ่ชนิดข้อมูลพื้นฐานทั้งหมดมีอยู่แล้วในตัว นอกจากนี้หลายภาษายังมีชุดของชนิดข้อมูลคอมโพสิต ("สตริง" ประเภทใน Java)

ฉันอยากจะบอกแบบนี้ -
ประเภทข้อมูลพื้นฐานคือประเภทข้อมูลที่ไม่สามารถแยกย่อยได้อีกต่อไป ("string" สามารถสร้างจาก "char" ได้ แต่ char ไม่สามารถ 'แยกย่อย' ลงในประเภทข้อมูลใด ๆ ได้ (ในโปรแกรมส่วนใหญ่ ภาษา) ดังนั้นจึงเป็นประเภทข้อมูลพื้นฐาน)

ประเภทสตริงใน SNOBOL4 นั้นถือว่าดั้งเดิม แต่ฉันไม่รู้เหตุผลที่แน่นอนว่าทำไม มันทั้งพื้นฐานและในตัวใน SNOBOL4

ข้อมูลจำเพาะ Java ระบุรายการประเภทข้อมูลที่คิดว่าเป็นประเภทข้อมูลพื้นฐานอย่างชัดเจน เนื่องจากประเภทสตริงไม่ได้อยู่ในสเปคของพวกเขาจึงไม่ได้เป็นประเภทข้อมูลดั้งเดิมใน Java ตรวจสอบว่าเป็นประเภทในตัว


-2

ดึกดำบรรพ์เป็นชนิดข้อมูลพื้นฐานที่จัดทำโดยภาษา ตัวอย่างในภาษา C คือ int, float, char ชนิดข้อมูล มันมีไว้เป็นส่วนพื้นฐานของภาษา

ไม่ใช่ดั้งเดิมคือตัวแปรหรือวัตถุที่ผู้ใช้กำหนด ตัวอย่างเช่นคุณสามารถกำหนดวัตถุที่เก็บข้อมูลหรือคุณสามารถใช้ struct ใน C เพื่อกำหนดตัวแปรของคุณเอง สิ่งเหล่านี้ไม่ใช่ดั้งเดิมเพราะคุณต้องกำหนดก่อนเพื่อใช้งาน

ตัวอย่าง: พนักงาน, นักเรียน, a_very_large_number_that_you_defined_yourself

แก้ไขด้วยคำอธิบายเพิ่มเติมและพูดถึงความคิดเห็น ฉันคิดว่าเป็นตัวแปรดั้งเดิมที่มาพร้อมกับภาษา แต่ไม่ใช่ตัวแปรเช่น String ใน C ++ ที่คุณต้องประกาศโดยใช้คำหลักใหม่ ทำให้มันเป็นวัตถุดังนั้น String จะไม่เป็นแบบดั้งเดิม

คำตอบที่คุณแสดงความคิดเห็น: มันอาจจะเกี่ยวข้องกับการใช้งานของตัวแปร ถ้ามันเป็นส่วนหนึ่งของแกนกลางของภาษามันเป็นพื้นฐาน ถ้าไม่ใช่มันไม่ใช่ ตัวอย่างคือ String ใน C ++ นี่ไม่ใช่ตัวแปรหลักและประกาศโดยใช้คำหลักใหม่ ดังนั้นจึงไม่ใช่แบบดั้งเดิม


ขอบคุณสำหรับคำตอบ . การจำแนกประเภทข้อมูลเป็น "ดั้งเดิม" ขึ้นอยู่กับการนำไปใช้งานหรือไม่ เช่นเดียวกับใน C / C ++ เราเก็บสตริงเป็น char arrays แต่เราจำเป็นต้องกำหนดอย่างชัดเจน ดังนั้นหากภาษาอื่นมีการใช้งานเหมือนกันในการจัดเก็บสตริง แต่มีการบอกเป็นนัยประเภทข้อมูล "สตริง" จะเป็นแบบดั้งเดิมในภาษานั้นหรือไม่
jsp99

@Appy - อาจเป็นไปได้ C ไม่ได้จัดเตรียมstringประเภทข้อมูลไว้ charสตริงจะแสดงเป็นมวลรวมของชนิดดั้งเดิม C ++ แนะนำstringชนิดข้อมูลที่เหมาะสมแต่ไม่ว่าจะเป็นชนิด "ดั้งเดิม" หรือไม่นั้นขึ้นอยู่กับบุคคลที่คุณถาม โดยส่วนตัวฉันจะไม่แยกประเภทนี้ อย่างไรก็ตามฉันจะจัดประเภทสตริงสตริงพื้นฐานแบบโรงเรียนเป็นประเภทดึกดำบรรพ์ด้วยเหตุผลที่อาจเป็นไปตามอำเภอใจโดยสิ้นเชิง
John Bode

ที่อยู่ความคิดเห็นของคุณ int คำถามตัวเอง โปรดดูการแก้ไข
Noname

2
ไม่จำเป็นต้องสร้างสตริงใน C ++ ด้วย new
jk

@jk ฉันไม่ได้ใช้ C ++ คุณพูดถูก จะแก้ไข ans
Noname

-2

สำหรับดีขึ้นการทำความเข้าใจแนวคิดของรูปแบบดั้งเดิมและการที่ผู้ใช้กำหนดประเภทข้อมูลทั้งหมดที่คำตอบอื่น ๆ compilerขาดเป็นแนวคิดของ

หากคุณเข้าใจแนวคิดของคำศัพท์ที่เลือกรับเป็นโทเค็นคุณจะได้รู้ว่าดั้งเดิมเป็นประเภทข้อมูลเดียวที่คอมไพเลอร์รู้ด้วยตัวเอง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.