Một loại dữ liệu nguyên thủy có nghĩa là gì?


42

Sự hiểu biết của tôi về một kiểu dữ liệu nguyên thủy là

Nó là một kiểu dữ liệu được cung cấp bởi một ngôn ngữ ngầm (Những người khác là các lớp do người dùng định nghĩa)

Vì vậy, các ngôn ngữ khác nhau có các bộ kiểu dữ liệu khác nhau được coi là nguyên thủy cho ngôn ngữ cụ thể đó. Có đúng không?

Và sự khác biệt giữa "kiểu dữ liệu cơ bản" và "kiểu dữ liệu tích hợp" là gì. Wikipedia cho biết một kiểu dữ liệu nguyên thủy là một trong hai.

PS - Tại sao loại "chuỗi" được coi là loại nguyên thủy trong SNOBOL4 mà không phải trong Java?

Câu trả lời:


34

Nó phụ thuộc vào ngôn ngữ.

Ví dụ, trong các ngôn ngữ như C và C ++, bạn có một số được xây dựng trong các loại vô hướng - int, float, double, char, vv Đây là những "nguyên thủy" theo nghĩa là chúng không thể bị phân hủy thành các thành phần đơn giản hơn. Từ các loại cơ bản này, bạn có thể xác định các loại mới - loại con trỏ, kiểu mảng, kiểu cấu trúc, kiểu kết hợp, v.v.

Sau đó, bạn có một ngôn ngữ như Lisp trường học cũ, nơi mọi thứ đều là nguyên tử hoặc danh sách . Một lần nữa, theo định nghĩa trên, một nguyên tử là "nguyên thủy" theo nghĩa là nó không thể bị phân hủy thành một cái gì đó đơn giản hơn.

Biên tập

Theo như tôi quan tâm, các thuật ngữ "nguyên thủy", "cơ bản" và "tích hợp" có thể thay thế cho nhau. Tuy nhiên, nếu bạn muốn thực sự mang tính mô phạm, bạn có thể phân biệt giữa các loại "tích hợp" (những loại được cung cấp rõ ràng theo định nghĩa ngôn ngữ) và các loại có nguồn gốc từ các loại tích hợp vẫn còn "nguyên thủy" hoặc "cơ bản" trong đó chúng không thể bị phân hủy thành các yếu tố đơn giản hơn. Ctypedefcơ sở cho phép bạn tạo tên loại mới cho các loại hiện có. Ada cho phép bạn tạo các loại vô hướng mới có các ràng buộc đối với chúng. Ví dụ: bạn có thể lấy ra một loại Latitude từ loại nổi tích hợp, với ràng buộc mà nó không thể đảm nhận các giá trị ngoài phạm vi [-90.0, 90.0]. Nó vẫn là một loại cơ bản hoặc cơ bản ở chỗ nó không thể được chia thành bất kỳ thành phần đơn giản nào, nhưng vì nó do người dùng định nghĩa, nó không được coi là loại "tích hợp".

Một lần nữa, những khái niệm này hơi mờ nhạt, và nó thực sự phụ thuộc vào bối cảnh. Ví dụ, khái niệm loại "tích hợp" là vô nghĩa đối với một ngôn ngữ không chữ như BLISS.


sự khác biệt giữa cơ bản và được xây dựng trong kiểu dữ liệu là gì?
jsp99

1
"Chuỗi" có phải là kiểu dữ liệu nguyên thủy trong Java không ?? (Tôi đã thấy bình luận của delnan cho câu trả lời của Jesper). Tôi muốn biết ý kiến ​​của bạn, bởi vì trong một trong những ý kiến ​​của bạn, bạn đã nói "loại nguyên thủy hay không phụ thuộc vào người bạn hỏi".
jsp99

@Appy - xem chỉnh sửa.
John Bode

3
Chuỗi @Appy trong Java không nguyên thủy vì đây là loại hỗn hợp. Nếu bạn nhìn vào mã nguồn lớp String (src.zip trong thư mục JDK) bạn sẽ thấy, String bên trong được biểu diễn dưới dạng một mảng các ký tự. Vì vậy, bạn có thể phân tách Chuỗi thành các ký tự riêng lẻ. Bạn không thể phân tách ký tự thành các giá trị nhỏ hơn tạo charthành kiểu nguyên thủy và Stringkiểu ghép.
Jacek Prucia

2
@Appy Bạn đang thiếu điểm. Chuỗi SNOBOL4 không thể bị phân tách. Chuỗi Java có thể. Đó là sự khác biệt. Cả hai đều được tích hợp sẵn nhưng chỉ có chuỗi SNOBOL4 là nguyên thủy.
Giàn

19

Từ phối cảnh Java :

Trong Java, có một sự phân biệt rất rõ ràng giữa các kiểu nguyên thủy và không nguyên thủy.

Một biến của kiểu nguyên thủy trực tiếp chứa giá trị của kiểu đó (nói cách khác, chúng là kiểu giá trị ).

Một biến của loại không nguyên thủy không chứa giá trị trực tiếp; thay vào đó, nó là một tham chiếu (tương tự như một con trỏ) đến một đối tượng. (Java không thể tạo các loại giá trị do người dùng định nghĩa).

Java có tám loại nguyên thủy: byte, short, int, long, char, boolean, floatdouble. Bất cứ điều gì khác là một loại không nguyên thủy.


Vì vậy, kiểu dữ liệu chuỗi là không nguyên thủy trong Java. Trong mọi chương trình main () của Java, chúng tôi viết "public static void main (String args [])". Tại sao? Tại sao chúng ta luôn phải truyền đối số String trong main? Ngoài ra, chúng tôi không bao giờ cần nhập kiểu Chuỗi trong Java theo cách chúng tôi đưa nó vào C / C ++ (ví dụ: #include <string> hoặc sử dụng std :: string). Vui lòng giải thích.
Maxood

7
@Maxood String không có tình trạng đặc biệt trong ngôn ngữ (nó được literals, đó là trong chữ ký của main, có của thực tập mà tôi đoán được phép một cách rõ ràng bởi JLS, nó có sẵn automagically, vv) nhưng nó không phải là một nguyên thủy kiểu dữ liệu. Người ta có thể gọi nó là tích hợp .

@Jesper Tại sao các kiểu nguyên thủy nhanh hơn để làm việc với? Chỉ đơn giản là do thực tế họ không có gói không nguyên thủy làm gì? Tôi đang cố gắng tìm ra sự khác biệt giữa nguyên thủy và không nguyên thủy ... như trong các nguyên thủy được tích hợp vào CPU hay gì đó?
Abdul

Từ Wikipedia: "Tùy thuộc vào ngôn ngữ và cách triển khai của nó, các loại dữ liệu nguyên thủy có thể có hoặc không có sự tương ứng một-một với các đối tượng trong bộ nhớ của máy tính. Tuy nhiên, người ta thường mong đợi các thao tác trên các loại dữ liệu nguyên thủy cơ bản là ngôn ngữ nhanh nhất có cấu trúc. " --- Vì vậy, sự tương ứng 1-1 này là nguyên nhân gốc rễ của nó nhanh hơn, trong khi với các đối tượng, nó không phải là 1-1. Tôi có đúng không?
Abdul

1
@Abdul đừng làm nó quá phức tạp. CPU có một số thanh ghi, có thể chứa các loại giá trị nguyên thủy khác nhau (ví dụ: số nguyên 32 bit hoặc 64 bit hoặc số dấu phẩy động chính xác một hoặc hai lần) và CPU có các lệnh được triển khai trong phần cứng để thực hiện các thao tác trên các giá trị trong thanh ghi. Nhận xét cuối cùng của bạn về cơ bản là chính xác.
Jesper

9

Nguyên thủy là một kiểu dữ liệu cơ bản không được tạo ra từ các kiểu dữ liệu khác. Nó chỉ có thể đại diện cho một giá trị duy nhất. Tất cả các kiểu nguyên thủy là các kiểu dữ liệu tích hợp theo sự cần thiết, (trình biên dịch phải biết về chúng), nhưng không phải tất cả các kiểu dữ liệu dựng sẵn đều là các kiểu nguyên thủy.

Trong một số ngôn ngữ, trình biên dịch có kiến ​​thức tích hợp về một số loại được xây dựng từ những thứ khác, bởi vì nó phải có khả năng xử lý chúng theo một cách đặc biệt. Ví dụ sẽ là Biến thể trong Delphi và Visual Basic (và tương đương Boo, "Vịt") và lớp đối tượng cơ sở trong hầu hết các ngôn ngữ OO.


Cảm ơn :) Câu trả lời của bạn rất nhiều thông tin, nhưng tôi không thể hiểu rõ. CAn bạn đưa ra một số ví dụ (có thể với C / C ++ / Java).
jsp99

@Mason Wheeler Đây là nơi chúng tôi sử dụng thuật ngữ gõ lỏng và gõ mạnh. Như tôi đã nghe người ta nói rằng VB là một ngôn ngữ được gõ lỏng lẻo trong khi Java là một ngôn ngữ được gõ mạnh. Vui lòng xác nhận.
Maxood

3
@Appy C ++ xuất xưởng với các lớp cho chuỗi, vectơ và bản đồ. Chúng được tích hợp sẵn chúng đi kèm với ngôn ngữ, nằm trong định nghĩa ngôn ngữ, v.v. Tuy nhiên, chúng được viết bằng C ++, chúng đến từ thư viện chuẩn. Bạn có thể viết của riêng bạn mà hành xử giống hệt nhau. So sánh điều này với một int hoặc char. Bạn không thể xác định char của riêng bạn trong C ++. Bạn có thể quá tải mọi toán tử trên một lớp và có được thứ gì đó tương tự nhưng không giống hệt nhau. Đây là một nguyên thủy. Về cơ bản một cái gì đó được xác định trong một ngôn ngữ không thể thực hiện được trong ngôn ngữ đó.
ném đá vào

5

Tại sao loại "chuỗi" được coi là loại nguyên thủy trong SNOBOL4 mà không phải trong Java?

Bởi vì Đặc tả ngôn ngữ Java xác định rất rõ từ "nguyên thủy" nghĩa là gì trong ngữ cảnh của Java và Java Stringkhông phù hợp với đặc tả này, trong khi Đặc tả ngôn ngữ SNOBOL4 định nghĩa "nguyên thủy" nghĩa là gì trong ngữ cảnh của chuỗi SNOBOL4 và SNOBOL4 phù hợp với đặc điểm kỹ thuật đó.

Thực sự không có gì hơn cho nó. Đặc điểm kỹ thuật của ngôn ngữ tương ứng xác định nghĩa của một số từ nhất định và từ nào đó phù hợp với mô tả đó hoặc không. Ví dụ, Đặc tả ngôn ngữ C định nghĩa nghĩa của từ "hàm" là một từ rất rõ ràng không phải từ "hàm" thường có nghĩa là gì, nhưng đó là cách từ được sử dụng trong cộng đồng C.


@Mittag Dựa trên câu trả lời của bạn, tôi đã tìm ra một số cụm từ và tìm thấy một liên kết rất hay mà gần như xóa tan mọi nghi ngờ về chủ đề cụ thể này :).
jsp99

0

Kiểu dữ liệu 'nguyên thủy' có nghĩa là bạn có một giá trị được lưu trong bộ nhớ - giá trị này không có phương thức hoặc cấu trúc bên trong. Một nguyên thủy chỉ có thể được vận hành bởi các hoạt động bên ngoài.

Trong Java, nguyên thủy là số (int, long, v.v.) và char. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

Nếu giá trị của bạn có cấu trúc (tôi đang nghĩ về các thanh chống ở đây) thì đó không phải là nguyên thủy. Nếu nó có các phương thức (một đối tượng hoặc lớp) thì nó không phải là nguyên thủy.


2
C # 's nguyên thủy intkiểu dữ liệu không có phương pháp ...
Heinzi

Bạn có thể cho một ví dụ?
JoshRagem

var myString = 3.ToString();(xem Int32.ToString () ). Lưu ý rằng inttrong C # là một từ đồng nghĩa với Int32, nghĩa là, Int32 một kiểu nguyên thủy (không giống như Java, nơi Integerkhác với int). Do đó, 3.ToString()trong C # không liên quan đến quyền anh!
Heinzi

Thật là thú vị; liên kết bạn cung cấp chỉ ra rằng 'int' thực sự là một đối tượng của lớp 'Int32' (hoặc có thể là sự kết hợp giữa lớp nguyên thủy và lớp bao bọc), vì vậy theo định nghĩa tôi đặt: 'int' không phải là nguyên thủy. :)
JoshRagem

1
@barlop: Java không được truyền từ C ++. Nếu Herbert Schildt thậm chí không thể hiểu được sự thật đơn giản như vậy, tôi cũng không chắc mình sẽ tin vào phần còn lại của cuốn sách. Patrick Naughton, nhà thiết kế ban đầu của Java, là một người hâm mộ Objective-C khổng lồ. Trên thực tế, anh ta đã đưa ra thông báo để làm việc trên Objective-C tại NeXT, khi Scott McNealy thuyết phục anh ta ở lại Sun và thiết kế một ngôn ngữ mới. James Gosling, nhà thiết kế ban đầu khác, rất quen thuộc với Smalltalk (tổ tiên trực tiếp của Objective-C) và Lisp (nguồn cảm hứng cho Smalltalk). Sau đó, một số thành viên của nhóm thiết kế Objective-C đã chuyển đến Sun.
Jörg W Mittag

0

Tôi đã xem qua một số thông tin và cảm thấy nó sẽ hỗ trợ các câu trả lời khác. Vì vậy, muốn chia sẻ nó -

Wikipedia nói -

Trong khoa học máy tính, kiểu dữ liệu nguyên thủy là một trong những điều sau đây:

Kiểu cơ bảnkiểu dữ liệu được cung cấp bởi ngôn ngữ lập trình dưới dạng khối xây dựng cơ bản. Hầu hết các ngôn ngữ cho phép các loại hỗn hợp phức tạp hơn được xây dựng đệ quy bắt đầu từ các loại cơ bản.
Kiểu tích hợpkiểu dữ liệu mà ngôn ngữ lập trình cung cấp hỗ trợ tích hợp.

Trong hầu hết các ngôn ngữ lập trình, tất cả các loại dữ liệu cơ bản đều được tích hợp sẵn. Ngoài ra, nhiều ngôn ngữ cũng cung cấp một tập hợp các kiểu dữ liệu tổng hợp (kiểu "chuỗi" trong Java).

Tôi muốn nói theo cách này -
Một kiểu dữ liệu cơ bản là một kiểu dữ liệu không thể bị phá vỡ thêm (loại "chuỗi" có thể được tạo từ "char", nhưng char không thể được "chia nhỏ" thành bất kỳ kiểu dữ liệu nào (Trong hầu hết Lập trình ngôn ngữ). Vì vậy, nó là kiểu dữ liệu cơ bản)

Kiểu chuỗi, trong SNOBOL4 được coi là nguyên thủy. Tôi không biết lý do chính xác tại sao. Nó vừa cơ bản cũng như tích hợp sẵn trong SNOBOL4.

Đặc tả kỹ thuật Java đề cập rõ ràng danh sách các kiểu dữ liệu mà nó coi là kiểu nguyên thủy. Vì kiểu chuỗi không có trong đặc tả của chúng , nên nó không phải là kiểu dữ liệu nguyên thủy trong Java, được coi là kiểu dựng sẵn.


-2

Nguyên thủy là các loại dữ liệu cơ bản được cung cấp bởi chính ngôn ngữ. Ví dụ trong ngôn ngữ C là các kiểu dữ liệu int, float, char. Nó được cung cấp như là một phần cơ bản của ngôn ngữ.

Không nguyên thủy là các biến hoặc đối tượng do người dùng xác định. Ví dụ: bạn có thể định nghĩa một đối tượng lưu trữ dữ liệu hoặc bạn có thể sử dụng struct trong C để xác định các biến của riêng bạn. Đây không phải là nguyên thủy bởi vì bạn phải xác định chúng trước để sử dụng chúng.

Ví dụ: Nhân viên, Sinh viên, a_very_large_number_that_you_d ​​xác_yourself

Chỉnh sửa với nhiều lời giải thích và giải quyết nhận xét Tôi nghĩ về nguyên thủy là các biến xuất phát ban đầu với ngôn ngữ và không phải là các biến như Chuỗi trong C ++ mà bạn phải khai báo bằng từ khóa Mới. Điều đó làm cho nó trở thành một đối tượng để Chuỗi không phải là nguyên thủy.

Trả lời bạn nhận xét: Có lẽ phải làm với việc thực hiện biến. Nếu nó là một phần của lõi ngôn ngữ, thì nó là nguyên thủy. Nếu không thì không phải. Ví dụ là Chuỗi trong C ++. Đây không phải là một biến cốt lõi và được khai báo bằng từ khóa mới. Vì vậy, nó không phải là nguyên thủy.


Cảm ơn câu trả lời. Việc phân loại một kiểu dữ liệu là "nguyên thủy" có phụ thuộc vào việc thực hiện không? Giống như trong C / C ++, chúng tôi lưu trữ các chuỗi dưới dạng mảng char. Nhưng chúng tôi cần xác định rõ ràng chúng. Vì vậy, nếu một số ngôn ngữ khác có cùng cách triển khai để lưu trữ một chuỗi nhưng cung cấp nó hoàn toàn, liệu "chuỗi" kiểu dữ liệu có phải là nguyên thủy trong ngôn ngữ cụ thể đó không?
jsp99

@Appy - có thể. C không cung cấp stringkiểu dữ liệu như vậy; chuỗi được biểu diễn dưới dạng tổng hợp của kiểu nguyên thủy char. C ++ đã giới thiệu một stringkiểu dữ liệu phù hợp , nhưng chính nó có phải là kiểu "nguyên thủy" hay không phụ thuộc vào người bạn hỏi. Cá nhân, tôi sẽ không phân loại nó như vậy. Tuy nhiên, tôi sẽ phân loại một loại chuỗi BASIC cũ là loại nguyên thủy, vì những lý do có thể hoàn toàn tùy ý.
John Bode

Địa chỉ bình luận của bạn int câu hỏi chính nó. Xin vui lòng xem chỉnh sửa.
Noname

2
các chuỗi trong C ++ không cần phải được tạo bằng new
jk.

@jk Tôi đã mất liên lạc với C ++. Bạn đúng rồi. Sẽ sửa chữa ans.
Noname

-2

Để hiểu rõ hơn về khái niệm kiểu nguyên thủy và kiểu dữ liệu do người dùng định nghĩa, tất cả những câu trả lời khác thiếu là khái niệm compiler.

Nếu bạn hiểu khái niệm từ vựng được chọn làm mã thông báo , bạn sẽ biết rằng nguyên thủy là kiểu dữ liệu duy nhất mà trình biên dịch tự biết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.