Чому непідписані int не відповідають стандартам CLS?


111

Чому непідписані цілі числа не відповідають CLS?

Я починаю вважати, що специфікація типу - це лише для продуктивності, а не для коректності.

Відповіді:


88

Не всі мови мають поняття безпідписаних літер. Наприклад, VB 6 не мав поняття безпідписаних вхідних даних, які, як я підозрюю, призвели до того, що розробники VB7 / 7.1 також не реалізували (це реалізовано зараз у VB8).

Цитувати:

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

CLS був розроблений таким чином, щоб бути достатньо великим, щоб включати мовні конструкції, які зазвичай потрібні розробникам, але досить малі, що більшість мов можуть його підтримувати. Крім того, будь-яка мовна конструкція, яка унеможливлює швидку перевірку безпеки типу коду, була виключена з CLS, щоб усі мови, сумісні з CLS, могли створювати код, що перевіряється, якщо вони вирішили це зробити.

Оновлення: мені було цікаво про це кілька років тому, і хоча я не можу зрозуміти, чому UInt не буде перевіряти безпеку, я думаю, хлопці CLS повинні були десь відрізати те, що буде базовим мінімумом кількість підтримуваних типів значень. Крім того, коли ви думаєте про більш тривалий термін, коли все більше мов переносяться до CLR, навіщо змушувати їх реалізовувати неподписані вставки, щоб отримати відповідність CLS, якщо ніколи не існує концепції?


@Kevin: Я просто задумався над темою. Ви відповідаєте, здається, логікою. Мені просто подобається подумати над темою. Я думаю, що це ганьба, подібні Паскалю типи, не ввійшли в CLR. Але ваш аргумент щодо інших мов: це не зупинило IronPython використовувати сильно динамічний набір тексту (DLR) у надзвичайно статичному набраному CLR?
doekman

@doekman: Хоча так IronPython та IronRuby демонструють, що CLR може забезпечити платформу, на якій можна будувати динамічно набрані мови, мета CLS полягала в тому, щоб забезпечити набір стандартів, що перевершують функціональність мови та дозволять їм успішно та безпечно взаємодіяти. Я не думаю, що мова може зробити, наприклад, додавання функцій DL безпосередньо пов'язане з тим, що повинно входити в CLS / CTS.
Кев

З мого розуміння, CLR має один 32-бітний цілочисельний примітивний тип, який має окремі інструкції щодо підписаного додавання з перевіркою переповнення, безпідписаного додавання з перевіркою переповнення та додавання знаків-агностиків mod 2 ^ 32 тощо; коли його запитують перетворити посилання об'єкта на 32-розрядний цілочисельний примітив, CLR не знає і не піклується, чи очікує код, який використовує це число, його підписати чи не підписати. Незалежно від того, чи вважає компілятор число підписане чи непідписане, це вплине, як правило, на те, які інструкції компілятор створює для операцій з ним, але це мова, а не CLR.
supercat

23

Я підозрюю, що частина випуску обертається навколо того, що неподписані цілі типи в C повинні вести себе як члени абстрактного алгебраїчного кільця, а не як числа [це означає, наприклад, що якщо неподписана 16-бітна ціла цінна змінна дорівнює нулю , декрементуючи це потрібнащоб отримати 65535, а якщо вона дорівнює 65535, то при збільшенні потрібно отримати нуль.] Бувають випадки, коли така поведінка надзвичайно корисна, але числові типи виявляють, що така поведінка може йти проти духу деяких мов. Я б припустив, що рішення про опущення непідписаних типів, ймовірно, передує рішенню підтримки як перевірених, так і неперевірених числових контекстів. Особисто я хотів би, щоб існували окремі цілі типи для безпідписаних чисел та алгебраїчних кілець; застосування оператора унарного мінусу до непідписаного 32-розрядного числа повинно дати результат 64-розрядного підпису [заперечення нічого, крім нуля, дасть від'ємне число], але, застосувавши одинарний мінус до типу кільця, слід отримати додатково обернену добавку в межах цього кільця.

У будь-якому випадку, причина, що непідписані цілі числа не відповідають CLS, полягає в тому, що Microsoft вирішила, що мови не повинні підтримувати непідписані цілі числа, щоб вважати їх "сумісними з CLS".


Відмінне пояснення з математичної точки зору!
дизартер

6

Непідписаний int не так сильно заробляє вас у реальному житті, однак наявність більш ніж 1 типу int доставляє вам біль, тому багато мов співали лише ints.

Сумісна з CLS спрямована на те, щоб дозволити використовувати клас з багатьох мов ...

Пам’ятайте, що ніхто не робить вас сумісними з CLS.

Ви все ще можете використовувати неподписані вставки в межах методу або як parms до приватного методу, оскільки обмежує сумісність із CLS лише публічний API.


16
Вони досить важливі, якщо ви робите будь-яку розумну арифметику.
nicodemus13

@ nicodemus13, коли ви востаннє бачили систему адміністратора бізнесу, яка мала біт-арифметику у своїй проблемній області? (Наприклад, програмне забезпечення, яке пишуть програмісти VB.NET)
Ян Рінроуз

38
Все, що має контрольну суму, використовує біт-розумну арифметику, це досить часто, і мені здається дивно перетягувати будь-яку іншу мову вниз, оскільки VB не підтримував непідписані цілі числа. .NET також повинен бути загальним, не тільки для VB-авторів програм LOB. Коли ви говорите "1 тип int", ви не думаєте, що байт, короткий, int, long - це також біль? Я не зовсім розумію, чому підписання стає більш незручним.
nicodemus13

5

Ненаписані цілі числа не відповідають стандартам CLS, оскільки вони не сумісні між певними мовами.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.