Skaler ve ilkel veri türü - bunlar aynı şey mi?


127

Okuduğum çeşitli makalelerde bazen ilkel veri türlerine, bazen de skalerlere göndermeler var.

Her biri hakkındaki anlayışım, bunların int, boolean, char, vb. Gibi basit bir şeyin veri türleri olduklarıdır.

Eksik olduğum bir şey var mı, bu, belirli bir terminolojiyi kullanmanız gerektiği anlamına mı geliyor yoksa terimler birbirinin yerine kullanılabilir mi? Her biri için Wikipedia sayfaları bariz bir şey göstermiyor.

Terimler basitçe birbirinin yerine geçebilirse, hangisi tercih edilir?

Yanıtlar:


203

Değiştirilebilir olduklarını sanmıyorum. Sıklıkla benzerdirler, ancak fark vardır ve esas olarak neyle karşılaştırıldıkları ve bağlamla ilgili olanlarla ilgili görünmektedir.

Skalarlar tipik olarak diziler, haritalar, kümeler, yapılar vb. Gibi bileşiklerle zıttır . Skaler, "tek" bir değerdir - tamsayı, boole, belki bir dizedir - bir bileşik birden çok skalerden (ve muhtemelen diğer bileşikler). "Skaler", ilgili ayrımın tek / basit / atomik değerler ve bileşik değerler arasında olduğu bağlamlarda kullanılır.

Bununla birlikte, ilkel türler , örneğin, referans türleri ile karşılaştırılır ve Java'nın ilkel türlere karşı referanslarında olduğu gibi, ilgili ayrım "Bu doğrudan bir değer mi, yoksa gerçek değeri içeren bir şeye başvuru mu?" Olduğunda kullanılır. . Bunu skaler / bileşikten biraz daha düşük seviyeli bir ayrım olarak görüyorum, ama tam olarak değil.

Bu gerçekten bağlama (ve sıklıkla hangi dil ailesinin tartışıldığına) bağlıdır. Muhtemelen patolojik bir örnek almak gerekirse: dizeler. C'de bir dizge bir bileşiktir (bir karakter dizisi), Perl'de ise bir dize skalerdir. Java'da bir dize bir nesnedir (veya başvuru türüdür). Python'da, dizeler (ve sayılar) dahil her şey (kavramsal olarak) bir nesne / referans türüdür.


1
Ayrıca referans türleri ve ilkel türler tartışmasında dikkate alınması gereken "değer" türleridir. Skaler ve ilkellerin denkliği ile ilgili olarak, dile bağlıdır. Örneğin, PHP kılavuzuna göre, ilkel türlerinin yalnızca yarısı skalerdir
Joe Bowbeer

11
Bu bana 8 yıl sonra yardımcı oldu :)
CoderXYZ

18

Bu terimlerin çok fazla kafa karışıklığı ve yanlış kullanımı var. Genellikle biri diğerini ifade etmek için kullanılır. İşte bu terimlerin aslında ne anlama geldiği.

"Yerel" , nasıl uygulandıklarına bakılmaksızın bir kitaplık (standart bir kitaplık bile) tarafından sağlanmanın aksine, dile yerleşik olan türleri ifade eder. Perl dizeleri Perl dilinin bir parçasıdır, bu nedenle Perl'de yereldirler. C, bir kitaplık kullanarak karakterlere işaretçiler üzerinde dize semantiği sağlar, bu nedenle karaktere işaretçi yereldir, ancak dizeler değildir.

"Atomik" , artık ayrıştırılamayan bir türü ifade eder. "Kompozit" in tam tersidir . Kompozitler, atomik değerlerin veya diğer kompozitlerin bir kombinasyonuna ayrıştırılabilir. Yerel tam sayılar ve kayan nokta sayıları atomiktir. Kesirler, karmaşık sayılar, kaplar / koleksiyonlar ve dizeler bileşiktir.

"Skaler" - ve çoğu insanın kafasını karıştıran budur - boyut, hacim, sayımlar vb. Gibi ölçeği (dolayısıyla adı) ifade edebilen değerleri ifade eder. Tamsayılar, kayan nokta sayıları ve kesirler skalerdir. Karmaşık sayılar, mantıksal değerler ve dizeler skaler DEĞİLDİR . Atomik olan bir şeyin skaler olması gerekmez ve skaler olan bir şeyin atomik olması gerekmez. Skalarlar yerel olabilir veya kütüphaneler tarafından sağlanabilir.

Bazı türlerin garip sınıflandırmaları vardır. Genellikle basamak veya tamsayı dizisi olarak uygulanan BigNumber türleri skalerdir, ancak teknik olarak atomik değildirler. Uygulama gizliyse ve dahili bileşenlere erişemiyorsanız atomik görünebilirler. Ancak bileşenler yalnızca gizlidir, bu nedenle atomiklik bir yanılsamadır. Neredeyse her zaman kütüphanelerde sağlanırlar, bu yüzden yerel değiller, ama olabilirler. Örneğin Mathematica programlama dilinde, büyük sayılar yereldir ve bir Mathematica programının onları yapı taşlarına ayırmasının bir yolu olmadığından, bu bağlamda atomiktirler, kapaklar (artık Mathematica dilinin dünyasında olmadığın yer).

Bu tanımlar kullanılan dilden bağımsızdır.


16
Skaler tipin bu tanımı bana en mantıklı gelse de, en yaygın olarak kabul edilen bu gibi görünmüyor.
lleaff

1
'Skalar'ın net bir tanımı için teşekkürler. @Lleaff'ın belirttiği gibi çoğu insanın bu özel anlamda kullanmadığına işaret etse de, kullansalar daha iyi olur.
clockworkpc

Mükemmel dil tanımları. Bu cevap, daha kapsamlı bir tartışma için Michael Ekstrand'ın cevabı ile birlikte okunmalıdır. Programlama dilleri bağlamında skaler maalesef farklı anlamlara sahiptir.
Jerry

9

Basitçe ifade etmek gerekirse, bir "skaler" tip, bir bileşik veya koleksiyonun aksine tek bir öğeyi ifade ediyor gibi görünecektir. Dolayısıyla skalarlar hem ilkel değerleri hem de enum değeri gibi şeyleri içerir.

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

Belki de 'skaler' terim C'ye bir geri dönüş olabilir:

skalarlar, tek bir değer içeren ve diğer C ++ nesnelerinden oluşmayan ilkel nesnelerdir

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

Bunun, bu öğelerin bir 'ölçek' değerine sahip olup olmayacağına işaret edip etmediğini merak ediyorum. - Sayıları saymak gibi.


2
Bana (çok uzun zaman önce okulda) terimin bir "vektör işlemcinin" aksine "skaler işlemciden" türetildiği öğretildi. Skaler işlemci, bir seferde yalnızca bir veri parçasını işleyebilen bir CPU'dur. Bu işlemciler aritmetik terimlerden sonra adlandırıldı / adlandırıldı. Yeterince ilginç bir şekilde, Wikipedia'da 'skaler' aradığınızda, 'değişken'e yönlendirilirsiniz.
Evert

2

Scott Langeberg'in cevabını beğendim çünkü özlü ve yetkili bağlantılarla destekleniyor. Elimde olsa Scott'ın cevabına olumlu oy verirdim.

Sanırım "ilkel" veri türü birincil veri türü olarak kabul edilebilir, böylece ikincil veri türleri birincil veri türlerinden türetilir. Türetme, bir C ++ yapısı gibi birleştirme yoluyla yapılır. Bir yapı, ikincil bir veri türü elde etmek için veri türlerini (int ve bir karakter gibi) birleştirmek için kullanılabilir. Yapı tanımlı veri türü her zaman ikincil bir veri türüdür. Birincil veri türleri hiçbir şeyden türetilmez, bunun yerine programlama dilinde verilmiştir.

İlkel olan isimlendirmenin birincil anlamına bir paralelim var. Bu paralellik "düzenli ifade" dir. "Düzenli" terminolojisinin "düzenleyici" olarak anlaşılabileceğini düşünüyorum. Böylece aramayı düzenleyen bir ifadeye sahip olursunuz.

Skaler etimoloji ( http://www.etymonline.com/index.php?allowed_in_frame=0&search=scalar&searchmode=none ) merdiven benzeri anlamına gelir. Sanırım bunun programlamayla ilgili olduğu yol, merdivenin tek bir boyuta sahip olmasıdır: Merdivenin sonundan itibaren kaç basamak. Skaler bir veri türünün yalnızca bir boyutu vardır ve bu nedenle tek bir değerle temsil edilir.

Bence kullanımda, ilkel ve skaler birbirinin yerine kullanılabilir. Skaler olmayan bir ilkel veya ilkel olmayan bir skaler örneği var mı?

Değiştirilebilir olmasına rağmen, ilkel, veri türünün diğer veri türlerinin temel yapı taşı olduğunu ve ilkel, diğer veri türlerinden oluşmadığını ifade eder.

Skaler, tek bir değere sahip olduğunu ifade eder. Skaler matematiksel vektör ile zıtlık gösterir. Bir vektör tek bir değerle temsil edilmez, çünkü (örnek olarak bir tür vektör kullanılarak) vektörün yönünü temsil etmek için bir değer ve vektörün büyüklüğünü temsil etmek için başka bir değer gerekir.

Referans bağlantıları: http://whatis.techtarget.com/definition/primitive http://en.wikipedia.org/wiki/Primitive_data_type


0

C'de, numaralandırma türleri, karakterler ve tamsayıların çeşitli temsilleri, skaler türler adı verilen daha genel bir tür sınıfı oluşturur. Bu nedenle, herhangi bir skaler türdeki değerler üzerinde gerçekleştirebileceğiniz işlemler, tamsayılarla aynıdır.


0

boş tip, "skaler tip" tanımına en gerçekçi şekilde uyan tek şeydir. "Hiçbiri" nin "N." olarak serileştirilmesi bile. geleneksel olarak skaler olan 16 bitlik bir sözcüğe - veya birden çok olası değeri olan tek bir bit'e sığdırmak "tek bir veri" değildir.


0

Her ilkel skalerdir, ancak tersi değildir. DateTime skalerdir, ancak ilkel değildir.

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.