İlkel veri türüyle ne kastedilmektedir?


42

İlkel bir veri tipine dair anlayışım

Bir dil tarafından örtük olarak sağlanan bir veri türüdür (Diğerleri kullanıcı tanımlı sınıflardır)

Bu yüzden farklı diller, o dil için ilkel sayılan farklı veri tiplerine sahiptir. Bu doğru mu?

Ve "temel veri türü" ile "yerleşik veri türü" arasındaki fark nedir. Wikipedia, ilkel bir veri türünün ikisinden biri olduğunu söylüyor.

PS - Neden "string" tipi SNOBOL4'te Java dilinde değil, ilkel bir tür olarak kabul ediliyor?

Yanıtlar:


34

Bir tür dile bağlı.

- Örneğin, C ve C gibi dillerde ++, yerleşik sayıl türde bir dizi var int, float, double, charbunlar daha basit bileşenlerine ayrılması olamayacağını Bunlar anlamda "ilkel" dir, vb. Bu temel türlerden yeni türler tanımlayabilirsiniz - imleç türleri, dizi türleri, yapı türleri, birleştirme türleri vb.

Öyleyse eski okul Lisp gibi bir dilin var, burada her şey bir atom ya da liste . Yine, yukarıdaki tanım gereği, bir atom daha basit bir şeye ayrıştırılamaz anlamında "ilkeldir".

Düzenle

Endişelendiğim kadarıyla, "ilkel", "temel" ve "yerleşik" terimleri hemen hemen birbiriyle değiştirilebilir. Gerçekte bilgiçlik sahibi olmak istiyorsanız , "yerleşik" (dil tanımı tarafından açıkça belirtilenler) türleri ve hala "ilkel" veya "temel" olan yerleşik türlerden türetilen türleri ayırt edebilirsiniz. Bunun içinde daha basit elemanlara ayrıştırılamazlar. C'lertypedefTesis mevcut türler için yeni tür adları oluşturmanıza olanak sağlar. Ada, üzerinde kısıtlamaları olan yeni skalar türleri oluşturmanıza olanak sağlar. Örneğin, yerleşik kayan türden bir Latitude türü türetebilir, [-90.0, 90.0] aralığının dışındaki değerleri alamaz. Hala basit bir bileşene bölünemediği için ilkel veya temel bir türdür, ancak kullanıcı tarafından tanımlandığından "yerleşik" bir tür olarak kabul edilmez.

Yine, bu kavramlar biraz bulanık ve gerçekten bağlama dayanıyor. Örneğin, "yerleşik" bir tür nosyonu, BLISS gibi yazılmaz bir dil için anlamsızdır.


Temel ve yerleşik veri tiplerinin arasındaki fark nedir?
jsp99

1
"String" Java'da ilkel bir veri türü midir? (Delnan'ın Jesper'ın cevabına yaptığı yorumu gördüm). Fikrinizi bilmek istiyorum, çünkü yorumlarınızdan birinde “ilkel tipin kime sorduğunuza bağlı olup olmadığı” demiştiniz.
jsp99

@Appy - düzenlemeye bakınız.
John Bode

3
@Appy Java, bileşik bir tür olduğu için ilkel değil. String sınıf kaynak koduna bakarsanız (JDK klasöründeki src.zip) göreceksiniz, dahili olarak String karakter dizisi olarak temsil edilir. Böylece String'i tek tek karakterlere ayırabilirsiniz. Karakteri, charilkel bir tür ve Stringbir bileşik tür yapan daha küçük değerlere ayıramazsınız .
Jacek Prucia,

2
@Appy Noktayı kaçırıyorsunuz. SNOBOL4 dizeleri ayrılamaz. Java dizeleri olabilir. Bu fark. Her ikisi de yerleşiktir, ancak yalnızca SNOBOL4 dizeleri ilkeldir.
Rig

19

Gönderen Java perspektifi:

Java'da, ilkel ve ilkel olmayan türler arasında çok net bir ayrım vardır.

İlkel bir türün değişkeni doğrudan bu türün değerini içerir (başka bir deyişle, bunlar değer türleridir ).

İlkel olmayan bir tür değişken, doğrudan değeri içermez; bunun yerine, bir nesneye referans (işaretçiye benzer). (Java'da kullanıcı tanımlı değer türleri oluşturmak mümkün değildir).

Java sekiz ilkel tipleri vardır: byte, short, int, long, char, boolean, floatve double. Başka bir şey ilkel olmayan bir türdür.


Dize veri türü Java'da ilkel değildir. Her Java main () programında "public static void main (String args [])" yazıyoruz. Neden? Neden her zaman anada bir String argümanını iletmek zorundayız? Ayrıca Java türündeki Java türünü asla C / C ++ içine eklediğimiz şekilde almamız gerekmez (örn. #İnclude <string> veya std :: string kullanarak). Lütfen açıkla.
Maxood

7
@Maxood String yapar dilde özel bir statüye sahip (o imza öyle, değişmezleri alır mainsanırım açıkça JLS tarafından izin verilen orada staj oluyor, kullanılabilir automagicallylar vb) ama bu bir değil ilkel veri türü. Biri buna yerleşik diyebilir .

@Jesper Neden ilkel türlerle çalışmak daha hızlı? Sırf basit olmayan ilkel olmayan sargıların olmadığı gerçeği yüzünden mi? İlkel ve ilkel olmayanlar arasındaki farkı ... CPU'nun içine yerleştirilen ilkellerin olduğu gibi mi anlamaya çalışıyorum?
Abdul,

Vikipedi: "Dile ve uygulamaya bağlı olarak, ilkel veri tipleri bilgisayarın hafızasındaki nesnelerle birebir yazışmalara sahip olabilir veya olmayabilir. Ancak, genellikle basit ilkel veri tipleri üzerinde işlemlerin en hızlı dil olmasını bekler. orada yapılar var. " --- Yani bu 1'e 1 yazışma, bunun daha hızlı olmasının temel nedenidir, nesnelerle ise 1'e 1 değildir. Doğrumuyum?
Abdul,

1
@Abdul çok karmaşık yapmaz. CPU, farklı türden ilkel değerler (örneğin, 32 bit veya 64 bit tam sayı veya tek veya çift duyarlıklı kayan nokta sayısı) içerebilen bir dizi yazmacıya sahiptir ve CPU, donanım üzerinde işlem yapmak üzere uygulanan talimatlara sahiptir. kayıtlardaki değerler. Son sözünüz aslında doğrudur.
Jesper

9

İlkel, diğer veri türlerinden oluşturulmamış temel bir veri türüdür. Sadece bir tek değeri temsil edebilir. Tüm ilkeller, zorunlu olarak yerleşik veri türleridir (derleyici bunları bilmek zorundadır), ancak tüm yerleşik veri türleri ilkel değildir.

Bazı dillerde, derleyici, başka şeylerden oluşan belirli türlerle ilgili yerleşik bilgiye sahiptir, çünkü onlara özel bir şekilde davranabilmesi gerekir. Örnekler, Delphi ve Visual Basic'teki Variant (ve Boo eşdeğeri, "Duck") ve çoğu OO dilinde temel nesne sınıfı olabilir.


Teşekkürler :) Cevabınız çok bilgilendirici, ama net olarak anlayamıyorum. Bazı örnekler verin (muhtemelen C / C ++ / Java ile).
jsp99

@Mason Wheeler Gevşek yazma ve güçlü yazma terimini kullandığımız yer burasıdır. İnsanların VB'nin gevşek yazılmış bir dil olduğunu söylerken duyduğum gibi, Java kesinlikle yazılmış bir dildir. Lütfen onaylayın.
Maxood

3
@Appy C ++, dizgiler, vektörler ve haritalar için sınıflarla birlikte gelir. Bunlar yerleşik olarak, dille birlikte gelir, dil tanımında vb. Vardır. Ancak C ++ dilinde yazılır ve standart kütüphaneden gelirler. Aynı davranan kendi yazabilirsiniz. Bunu bir int veya karakter ile karşılaştırın. C + 'da kendi karakterinizi tanımlayamazsınız. Her operatörü bir sınıfta aşırı yükleyebilir ve aynı şekilde davranmayan, aynı şekilde davranan bir şey elde edebilirsiniz. Bu ilkel. Temel olarak, o dilde uygulanamayan bir dilde tanımlanmış bir şey.
stonemetal

5

Neden "string" tipi, SNOBOL4'te Java ile değil, ilkel bir tür olarak kabul edilir?

Çünkü Java Dil Belirtimi, "ilkel" kelimesinin Java bağlamında ne anlama geldiğini çok net bir şekilde belirlediğinden ve Java Stringbu belirtime uymadığından, SNOBOL4 Dil Belirtimi, "ilkel" in SNOBOL4 ve SNOBOL4 dizesi bağlamında ne anlama geldiğini tanımlamaktadır. bu şartnameye uygundur.

Gerçekten daha fazlası yok. İlgili dilin tanımı, belirli kelimelerin ne anlama geldiğini ve bu açıklamaya uygun olan veya olmayan bir şeyi tanımlar. Örneğin, C Dil Belirtimi, "işlev" kelimesinin anlamını, "işlev" kelimesinin genellikle ne anlama geldiğini açıkça ifade etmeyen bir şey olarak tanımlar , ancak kelimenin C topluluğunda kullanıldığı şeklidir.


@Mittag Cevabınıza dayanarak, bazı ifadelere göz attım ve bu konudaki neredeyse tüm şüpheleri gideren çok hoş bir bağlantıya rastladım :).
jsp99

0

'İlkel' veri türü, bellekte depolanan bir değere sahip olduğunuz anlamına gelir - bu değerin hiçbir yöntemi veya iç yapısı yoktur. İlkel, yalnızca dış işlemler tarafından çalıştırılabilir.

Java'da, ilkel sayılar sayılardır (int, uzun, vb.) Ve char. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

Eğer değeriniz bir yapıya sahipse (burdaki sapları düşünüyorum) o zaman ilkel değildir. Metotları varsa (bir nesne veya sınıf), ilkel değildir.


2
C # 'ın ilkel intveri tipi yapar ... yöntemlerine sahip
Heinzi

Bir örnek verebilir misiniz?
JoshRagem

var myString = 3.ToString();(bakınız Int32.ToString () ). Not bu intC # olduğu içinde eşanlamlı için Int32, yani, Int32 bir basit bir tür (Java, farklı Integerfarklıdır int). Böylece, 3.ToString()C # gelmez değil boks dahil!
Heinzi,

Bu çok ilginç; Sağladığınız bağlantı 'int' gerçekten 'Int32' sınıfının (veya ilkel ve sarıcı sınıfın bir birleşimi) sınıfının bir nesnesi olduğunu gösterir, bu nedenle koyduğum tanımla 'int' ilkel değildir. :)
JoshRagem

1
@ barlop: Java, C ++ 'dan gelmiyor . Eğer Herbert Schildt bu kadar basit bir gerçeği bile elde edemezse, kitabın geri kalanına da güveneceğimden emin değilim. Java'nın orijinal tasarımcısı Patrick Naughton büyük bir Objective-C hayranıydı. Aslında, Scott McNealy onu Sun’da kalmaya ve yeni bir dil tasarlamaya ikna ettiğinde NeXT’de Objective-C’de çalışmak için çoktan bildirimde bulunmuştu. Diğer özgün tasarımcı James Gosling, Smalltalk (Objective-C'nin doğrudan atası) ve Lisp'i (Smalltalk için ilham kaynağı) çok iyi tanıyordu. Daha sonra, Objective-C tasarım ekibinin birkaç üyesi Sun'a taşındı.
Jörg W Mittag

0

Bazı bilgilere rastladım ve diğer cevaplara yardımcı olacağını hissettim. Öyleyse paylaşmak istiyorum -

Wikipedia diyor -

Bilgisayar bilimlerinde ilkel veri tipi aşağıdakilerden biridir:

Temel tür , bir programlama dili tarafından temel bir yapı taşı olarak sağlanan bir veri türüdür. Çoğu dil, daha karmaşık bileşik türlerinin temel türlerden başlayarak özyineli olarak oluşturulmasına izin verir.
Yerleşik tür , programlama dilinin yerleşik destek sağladığı bir veri türüdür.

Çoğu programlama dilinde, tüm temel veri tipleri yerleşiktir. Ek olarak, birçok dil bir dizi bileşik veri türü de sağlar (Java'da "string" tipi).

Bunu şöyle söylemek isterim -
Temel bir veri türü, daha fazla kırılamayan bir veri türüdür ("string" türü "char" dan yapılabilir, ancak char, herhangi bir veri tipine 'bozulamaz' (Programlamanın çoğunda) diller). Yani temel veri türü)

Dize türü, SNOBOL4 içinde ilkel olarak kabul edilir. Gerçi nedenini tam olarak bilmiyorum. Hem temel hem de SNOBOL4'te yerleşik olarak bulunur.

Java özelliği, ilkel tip olduğunu düşündüğü veri tiplerinin listesini açıkça belirtmektedir. Dize türü belirtimlerinde olmadığı için, Java'da yerleşik bir tür olmasına rağmen ilkel bir veri türü değildir.


-2

İlkeller, dilin kendisi tarafından sağlanan temel veri türleridir. C dilinde örnek int, float, char veri türleridir. Dilin temel bir parçası olarak sağlanır.

Primitif olmayanlar kullanıcı tanımlı değişkenler veya nesnelerdir. Örneğin, verileri saklayan bir nesne tanımlayabilir veya kendi değişkenlerinizi tanımlamak için C içinde struct kullanabilirsiniz. Bunlar ilkel değildir, çünkü onları kullanmak için önce tanımlamanız gerekir.

Örnekler: Çalışan, Öğrenci, a_very_large_number_that_you_defined_yourself

Daha fazla açıklama ile düzenleme ve yorumu ele alma İlkel bir dilden gelen ve New anahtar sözcüğünü kullanarak bildirmek zorunda olduğunuz D ++ gibi C ++ değişkenleri olmayan değişkenler olarak ilkel olduğunu düşünüyorum. Bu onu bir nesne yapar, böylece bir Dize ilkel olmaz.

Yorumunuzu cevaplayın: Muhtemelen değişkenin uygulanması ile ilgili olmalı. Dil çekirdeğinin bir parçası olsaydı, ilkeldir. Değilse değil. Örnek C ++ 'da dizedir. Bu bir çekirdek değişken değildir ve Yeni anahtar kelime kullanılarak bildirilir. Bu yüzden ilkel değil.


Cevap için teşekkürler . Bir veri tipinin "ilkel" olarak sınıflandırılması uygulamaya mı bağlı? C / C ++ 'da olduğu gibi, dizeleri char dizileri olarak depolarız. Fakat onları açıkça tanımlamamız gerekir. Öyleyse, başka bir dilin bir dizgiyi saklamak için aynı uygulaması yapması ancak örtük olarak sağlaması durumunda, "string" veri tipi o dilde ilkel midir?
jsp99

@Appy - muhtemelen. C, böyle bir stringveri türü sağlamaz ; dizeleri, ilkel türdeki kümeler olarak temsil edilir char. C ++ uygun bir stringveri türü sundu , ancak bunun "ilkel" bir tür olup olmadığının kime sorduğunuza bağlı. Şahsen ben böyle sınıflandırmam. Bununla birlikte, muhtemelen tamamen keyfi olan nedenlerden dolayı eski okul BASIC dize türünü ilkel bir tür olarak sınıflandırırdım.
John Bode

Yorumunuz int sorunun kendisi. Plz düzenlemeye bakın.
Noname

2
C ++ 'daki dizelerin new
jk

@jk C ++ ile bağlantım kesildi. Haklısın. Ans düzeltecektir.
Noname

-2

İlkel tipler ve kullanıcı tanımlı veri tipleri kavramının daha iyi anlaşılması için diğer cevapların eksik olduğu kavramdır compiler.

Belirteç olarak seçili olan sözcükler kavramını anlarsanız , ilkellerin bir derleyicinin kendi bildiği tek veri türü olduğunu anlayacaksınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.