İmzasız int'ler neden CLS uyumlu değil?


111

İşaretsiz tamsayılar neden CLS uyumlu değil?

Tip spesifikasyonunun sadece performans için olduğunu ve doğruluk için olmadığını düşünmeye başlıyorum.

Yanıtlar:


88

Tüm dillerde imzasız giriş kavramı yoktur. Örneğin, VB 6'nın imzalanmamış ints kavramı yoktu, sanıyorum ki VB7 / 7.1 tasarımcılarının da uygulamama kararına neden oldu (şimdi VB8'de uygulandı).

Alıntılamak:

http://msdn.microsoft.com/en-us/library/12a7a7h3.aspx

CLS, geliştiriciler tarafından yaygın olarak ihtiyaç duyulan dil yapılarını içerecek kadar büyük, ancak çoğu dilin destekleyebileceği kadar küçük olacak şekilde tasarlanmıştır. Ek olarak, kodun tür güvenliğini hızlı bir şekilde doğrulamayı imkansız kılan herhangi bir dil yapısı, CLS'nin dışında tutulmuştur, böylece tüm CLS uyumlu diller, bunu seçerlerse doğrulanabilir kod üretebilirler.

Güncelleme: Birkaç yıl önce bunu merak etmiştim ve bir UInt'in neden tip güvenliğinin doğrulanabilir olmadığını anlayamasam da, sanırım CLS görevlilerinin minimum temel değerin ne olacağına dair bir kesme noktasına sahip olmaları gerekiyordu. desteklenen değer türlerinin sayısı. Ayrıca, gittikçe daha fazla dilin CLR'ye taşındığı daha uzun vadeyi düşündüğünüzde, kesinlikle hiçbir kavram yoksa, neden onları CLS uyumluluğu elde etmek için imzasız ints uygulamaya zorlayasınız ki?


@Kevin: Sadece konuyu merak ettim. Cevap mantıklı görünüyor. Sadece konu hakkında düşünmeyi seviyorum. Bence Pascal benzeri tiplerin CLR'ye girememesi utanç verici. Ancak diğer diller hakkındaki argümanınız: bu, IronPython'un oldukça statik yazılan bir CLR'de güçlü dinamik yazım (DLR) kullanmasını durdurmadı mı?
doekman

@doekman: Evet IronPython ve IronRuby, CLR'nin dinamik olarak yazılmış diller oluşturabileceğiniz bir platform sağlayabileceğini gösterirken, CLS'nin amacı, dil işlevselliğini aşan ve başarılı ve güvenli bir şekilde birlikte çalışmasına izin veren bir dizi standart sağlamaktı. Bir dilin, DL özelliklerinin eklenmesi ile doğrudan CLS / CTS'ye girilmesi gerekenlerle ilgili olduğunu söylemek açısından ne yapabileceğini düşünmüyorum.
Kev

Anladığım kadarıyla, CLR, taşma denetimi ile işaretli toplama, taşma denetimi ile işaretsiz toplama ve işaret agnostik toplama modu 2 ^ 32, vb. İle işaretli toplama için ayrı talimatlara sahip 32 bitlik bir ilkel türe sahiptir; Bir nesne referansını 32 bitlik bir ilkele dönüştürmesi istendiğinde, CLR bu numarayı kullanan kodun imzalı veya işaretsiz olmasını beklediğini ne bilir ne de umursar . Derleyicinin bir sayının imzalı veya işaretsiz olduğuna inanıp inanmadığı, genellikle derleyicinin onunla işlemler için hangi talimatları ürettiğini etkiler, ancak bu CLR değil, bir dil sorunudur.
supercat

23

Sanırım sorunun bir kısmı, C'deki işaretsiz tam sayı türlerinin sayılar yerine soyut bir cebirsel halkanın üyeleri gibi davranması gerektiği gerçeği etrafında dönüyor [yani, işaretsiz 16 bitlik bir tam sayı değişkeni sıfıra eşitse , azaltmak gerekli65,535 vermek ve 65,535'e eşitse, sıfır vermek için artırılması gerekir.] Bu tür davranışların son derece yararlı olduğu zamanlar vardır, ancak sayısal türler bu tür davranışlar sergilerken bazı dillerin ruhuna aykırı olabilir. İmzasız türleri ihmal etme kararının muhtemelen hem işaretli hem de denetlenmemiş sayısal bağlamları destekleme kararından önce geldiğini tahmin ediyorum. Şahsen, işaretsiz sayılar ve cebirsel halkalar için ayrı tam sayı türleri olsaydı; işaretsiz 32 bitlik sayıya bir tekli eksi operatör uygulamak 64 bitlik işaretli bir sonuç vermelidir [sıfırdan başka herhangi bir şeyin olumsuzlanması negatif bir sayı verir], ancak bir halka türüne bir tekli eksi uygulamak o halka içindeki toplamanın tersini vermelidir.

Her halükarda, işaretsiz tam sayıların CLS uyumlu olmamasının nedeni, Microsoft'un "CLS uyumlu" olarak kabul edilebilmesi için dillerin işaretsiz tam sayıları desteklemesi gerekmediğine karar vermesidir.


Matematiksel açıdan mükemmel bir açıklama!
dizarter

6

İmzasız int'ler gerçek hayatta size çok fazla kazandırmaz, ancak birden fazla int türüne sahip olmak size acı verir, bu nedenle birçok dilde yalnızca ints söylenir.

CLS uyumlu, bir sınıfın birçok dilden kullanılmasına izin vermeyi amaçlamaktadır ...

Kimsenin sizi CLS uyumlu yapmadığını unutmayın.

CLS uyumlu yalnızca genel API olduğundan , bir yöntem içinde veya özel bir yöntemin parametresi olarak işaretsiz girişleri kullanmaya devam edebilirsiniz .


16
Biraz aritmetik yapıyorsanız, bunlar oldukça önemlidir.
nicodemus13

@ nicodemus13 En son ne zaman sorunlu etki alanında bit tabanlı aritmetik olan bir işletme yönetim sistemi gördünüz? (Örneğin, VB.NET programcılarının yazdığı yazılım türü)
Ian Ringrose

38
Sağlama toplamı olan her şey bit bazlı aritmetik kullanır, bu oldukça yaygındır ve diğer tüm dilleri aşağı doğru sürüklemek bana garip geliyor çünkü VB işaretsiz tam sayıları desteklemiyordu. .NET, yalnızca LOB uygulamalarının VB yazarları için değil, aynı zamanda jenerik olmalıdır. '1 tür int' dediğinizde, bayt, kısa, int, uzun olmanın da bir acı olduğunu düşünmüyor musunuz? İmzalamanın neden daha tuhaf olduğunu tam olarak anlamıyorum.
nicodemus13

5

İşaretsiz tamsayılar, belirli diller arasında birlikte çalışamadıkları için CLS uyumlu 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.