Warum sind nicht signierte Ints nicht CLS-konform?

111

Warum sind vorzeichenlose Ganzzahlen nicht CLS-konform?

Ich fange an zu denken, dass die Typenspezifikation nur der Leistung und nicht der Korrektheit dient.

Doekman
quelle

Antworten:

88

Nicht alle Sprachen haben das Konzept von Ints ohne Vorzeichen. Zum Beispiel hatte VB 6 kein Konzept für nicht signierte Ints, was meiner Meinung nach die Entscheidung der Designer von VB7 / 7.1 zur Nichtimplementierung veranlasste (es ist jetzt in VB8 implementiert).

Zitieren:

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

Das CLS wurde so konzipiert, dass es die von Entwicklern häufig benötigten Sprachkonstrukte enthält, aber klein genug, dass die meisten Sprachen es unterstützen können. Darüber hinaus wurde jedes Sprachkonstrukt, das es unmöglich macht, die Typensicherheit von Code schnell zu überprüfen, aus dem CLS ausgeschlossen, sodass alle CLS-kompatiblen Sprachen überprüfbaren Code erzeugen können, wenn sie dies wünschen.

Update: Ich habe mich vor einigen Jahren darüber gewundert, und obwohl ich nicht verstehen kann, warum ein UInt nicht überprüfbar für die Typensicherheit ist, mussten die CLS-Leute irgendwo einen Grenzwert für das Mindestmaß festlegen Anzahl der unterstützten Werttypen. Auch wenn Sie längerfristig darüber nachdenken, wo immer mehr Sprachen in die CLR portiert werden, warum sollten Sie sie dann zwingen, nicht signierte Ints zu implementieren, um die CLS-Konformität zu erreichen, wenn es überhaupt kein Konzept gibt?

Kev
quelle
@ Kevin: Ich habe mich nur über das Thema gewundert. Ihre Antwort scheint logisch. Ich denke nur gerne über das Thema nach. Ich finde es schade, dass Pascal-ähnliche Typen es nicht in die CLR geschafft haben. Aber Ihr Argument zu anderen Sprachen: Das hat IronPython nicht davon abgehalten, stark dynamische Typisierung (DLR) in einer stark statisch typisierten CLR zu verwenden?
Doekman
@doekman: Während IronPython und IronRuby zeigen, dass die CLR eine Plattform bieten kann, auf der Sie dynamisch typisierte Sprachen erstellen können, bestand das Ziel des CLS darin, eine Reihe von Standards bereitzustellen, die über die Sprachfunktionalität hinausgehen und ihnen ermöglichen, erfolgreich und sicher zusammenzuarbeiten. Ich denke nicht, was eine Sprache in Bezug auf das Hinzufügen von DL-Funktionen tun kann, hängt direkt mit dem zusammen, was in das CLS / CTS aufgenommen werden soll.
Kev
Nach meinem Verständnis hat die CLR einen 32-Bit-Integer-Primitivtyp, der separate Anweisungen für die vorzeichenbehaftete Addition mit Überlaufprüfung, die vorzeichenlose Addition mit Überlaufprüfung und die vorzeichenunabhängige Addition mod 2 ^ 32 usw.; Wenn die CLR aufgefordert wird, eine Objektreferenz in ein 32-Bit-Ganzzahlprimitiv zu konvertieren, weiß sie weder, noch kümmert es sie, ob der Code, der diese Nummer verwendet, erwartet , dass sie signiert oder nicht signiert ist. Ob der Compiler glaubt, dass eine Nummer signiert oder nicht signiert ist, wirkt sich im Allgemeinen darauf aus, welche Anweisungen der Compiler für Operationen mit ihm generiert. Dies ist jedoch ein Sprach- und kein CLR-Problem.
Supercat
23

Ich vermute, ein Teil des Problems dreht sich um die Tatsache, dass vorzeichenlose Ganzzahltypen in C sich als Mitglieder eines abstrakten algebraischen Rings und nicht als Zahlen verhalten müssen [was beispielsweise bedeutet, dass eine vorzeichenlose 16-Bit-Ganzzahlvariable gleich Null ist , dekrementieren ist erforderlichum 65.535 zu ergeben, und wenn es gleich 65.535 ist, muss es inkrementiert werden, um Null zu ergeben.] Es gibt Zeiten, in denen ein solches Verhalten äußerst nützlich ist, aber numerische Typen zeigen, dass ein solches Verhalten möglicherweise gegen den Geist einiger Sprachen verstoßen hat. Ich würde vermuten, dass die Entscheidung, vorzeichenlose Typen wegzulassen, wahrscheinlich vor der Entscheidung liegt, sowohl geprüfte als auch ungeprüfte numerische Kontexte zu unterstützen. Ich persönlich wünschte, es hätte separate Ganzzahltypen für vorzeichenlose Zahlen und algebraische Ringe gegeben. Das Anwenden eines unären Minusoperators auf eine vorzeichenlose 32-Bit-Zahl sollte ein vorzeichenbehaftetes 64-Bit-Ergebnis ergeben [das Negieren von etwas anderem als Null würde eine negative Zahl ergeben], aber das Anwenden eines unären Minus auf einen Ringtyp sollte das additive Inverse innerhalb dieses Rings ergeben.

In jedem Fall ist der Grund dafür, dass vorzeichenlose Ganzzahlen nicht CLS-kompatibel sind, dass Microsoft entschieden hat, dass Sprachen keine vorzeichenlosen Ganzzahlen unterstützen müssen, um als "CLS-kompatibel" zu gelten.

Superkatze
quelle
Hervorragende Erklärung aus mathematischer Sicht!
Dizarter
6

Unsignierte Ints bringen Ihnen im wirklichen Leben nicht so viel, aber mehr als eine Art von Int zu haben, schmerzt Sie, so dass viele Sprachen nur Ints gesungen haben.

CLS-konform zielt darauf ab, dass eine Klasse aus vielen Sprachen verwendet werden kann…

Denken Sie daran, dass niemand Sie CLS-konform macht.

Sie können weiterhin vorzeichenlose Ints innerhalb einer Methode oder als Parameter für eine private Methode verwenden, da nur die öffentliche API die CLS-Kompatibilität einschränkt.

Ian Ringrose
quelle
16
Sie sind ziemlich wichtig, wenn Sie ein bisschen arithmetisch rechnen.
nicodemus13
@ nicodemus13 Wann haben Sie das letzte Mal ein Business-Admin-System gesehen, dessen Problemdomäne bitweise arithmetisch war? (ZB die Art von Software, die VB.NET-Programmierer schreiben)
Ian Ringrose
38
Alles, was eine Prüfsumme enthält, verwendet bitweise Arithmetik, was ziemlich häufig vorkommt, und es erscheint mir seltsam, jede andere Sprache nach unten zu ziehen, da VB keine vorzeichenlosen Ganzzahlen unterstützt. .NET soll auch generisch sein, nicht nur für VB-Autoren von LOB-Apps. Wenn Sie '1 Typ von int' sagen, denken Sie nicht, dass es auch schmerzhaft ist, Byte, kurz, int, lang zu haben? Ich verstehe nicht ganz, warum das Unterschreiben unangenehmer ist.
nicodemus13
5

Ganzzahlen ohne Vorzeichen sind nicht CLS-kompatibel, da sie zwischen bestimmten Sprachen nicht interoperabel sind.

Bryan Roth
quelle