unsigned int가 CLS 규격이 아닌 이유는 무엇입니까?


111

부호없는 정수가 CLS 규격이 아닌 이유는 무엇입니까?

유형 사양은 정확성이 아닌 성능을위한 것이라고 생각하기 시작했습니다.

답변:


88

모든 언어에 부호없는 정수 개념이있는 것은 아닙니다. 예를 들어 VB 6에는 서명되지 않은 int의 개념이 없었기 때문에 VB7 / 7.1의 디자이너가 구현하지 않기로 결정했습니다 (현재 VB8에서 구현 됨).

인용하려면 :

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

CLS는 개발자가 일반적으로 필요로하는 언어 구조를 포함 할 수있을만큼 충분히 크지 만 대부분의 언어에서 지원할 수있을만큼 충분히 작게 설계되었습니다. 또한 코드의 형식 안전성을 신속하게 확인할 수 없도록하는 모든 언어 구문은 CLS에서 제외되어 모든 CLS 호환 언어가 원하는 경우 확인 가능한 코드를 생성 할 수 있습니다.

업데이트 : 나는 몇 년 전에 이것에 대해 궁금해했고, 왜 UInt가 타입 안전성을 검증 할 수 없는지 알 수는 없지만 CLS 직원들은 기준선 최소값이 무엇인지 어딘가에 컷오프 지점이 있어야한다고 생각합니다. 지원되는 값 유형의 수. 또한 점점 더 많은 언어가 CLR로 포팅되는 장기적인 관점에서 생각할 때 개념이 전혀없는 경우 서명되지 않은 정수를 구현하여 CLS 규정을 준수해야하는 이유는 무엇입니까?


@Kevin : 방금 주제에 대해 궁금했습니다. 대답은 논리처럼 보입니다. 저는 그 주제에 대해 생각하고 싶습니다. Pascal과 같은 유형이 CLR에 포함되지 않은 것이 부끄러운 일이라고 생각합니다. 그러나 다른 언어에 대한 귀하의 주장 : 이것이 매우 정적 인 유형의 CLR에서 DLR (강력한 동적 유형)을 사용하는 IronPython을 중단하지 않았습니까?
doekman 2008-08-08

@doekman : 예 IronPython과 IronRuby는 CLR이 동적 형식 언어를 빌드 할 수있는 플랫폼을 제공 할 수 있음을 보여 주지만 CLS의 목표는 언어 기능을 뛰어 넘는 표준 집합을 제공하고 성공적이고 안전하게 상호 운용 할 수 있도록하는 것이 었습니다. DL 기능을 추가하는 것이 CLS / CTS에 들어가야하는 것과 직접적으로 관련이 있다는 점에서 언어가 할 수있는 일이 아니라고 생각합니다.
Kev

내 이해에서 CLR에는 하나의 32 비트 정수 프리미티브 유형이 있는데, 이는 오버플로 검사를 통한 부호 추가, 오버플로 검사를 통한 부호없는 추가 및 부호에 구애받지 않는 추가 모드 2 ^ 32 등을위한 별도의 명령이 있습니다. 개체 참조를 32 비트 정수 프리미티브로 변환하라는 요청을 받으면 CLR은 해당 번호를 사용하는 코드가 부호가 있는지 여부를 예상 하는지 여부를 알거나 신경 쓰지 않습니다 . 컴파일러가 숫자가 서명되었거나 서명되지 않았다고 생각하는지 여부는 일반적으로 컴파일러가 작업을 위해 생성하는 명령어에 영향을 주지만 이는 CLR이 아닌 언어 문제입니다.
supercat

23

문제의 일부는 C의 부호없는 정수 유형이 숫자가 아닌 추상 대수 링의 구성원으로 동작해야한다는 사실을 중심으로합니다 [예를 들어, 부호없는 16 비트 정수 변수가 0 인 경우 , 감소가 필요합니다.65,535를 산출하고 65,535와 같으면 0을 산출해야합니다.] 그러한 행동이 매우 유용 할 때가 있습니다. 그러나 숫자 유형이 그러한 행동을 보이는 것은 일부 언어의 정신에 반하는 것일 수 있습니다. 나는 서명되지 않은 유형을 생략하기로 한 결정이 아마도 확인 된 숫자 컨텍스트와 확인되지 않은 숫자 컨텍스트를 모두 지원하기로 결정한 것보다 앞서 있다고 추측 할 것입니다. 개인적으로 저는 부호없는 숫자와 대수 고리에 대해 별도의 정수 유형이 있었으면합니다. 단항 빼기 연산자를 부호없는 32 비트 숫자에 적용하면 64 비트 부호있는 결과가 생성되지만 [0 이외의 값을 부정하면 음수가 생성됨] 링 유형에 단항 빼기 연산자를 적용하면 해당 링 내에서 역 가산 값이 생성됩니다.

어쨌든 부호없는 정수가 CLS 규격이 아닌 이유는 Microsoft가 언어가 "CLS 호환"으로 간주되기 위해 부호없는 정수를 지원할 필요가 없다고 결정했기 때문입니다.


수학적 관점에서 훌륭한 설명!
dizarter

6

Unsigned int는 실생활에서 그다지 많은 것을 얻지 못하지만 int 유형이 두 개 이상이면 고통을 주므로 많은 언어가 int 만 있습니다.

CLS 규격은 많은 언어에서 클래스를 사용할 수 있도록하는 것입니다.

아무도 당신을 CLS 규격으로 만들지 않습니다.

CLS 규격이 제한하는 공용 API 만 있기 때문에 메서드 에서 서명되지 않은 int를 계속 사용 하거나 개인 메서드 에 대한 매개 변수로 사용할 수 있습니다 .


16
비트 산술을 수행하는 경우 매우 중요합니다.
nicodemus13

@ nicodemus13 문제 영역에서 비트 단위 산술이있는 비즈니스 관리 시스템을 마지막으로 본 것은 언제입니까? (예 : 소프트웨어의 종류 VB.NET 프로그래머가 작성하는 것이)
이안 Ringrose

38
체크섬이있는 모든 것은 비트 단위 산술을 사용합니다. 이는 매우 일반적이며, VB는 부호없는 정수를 지원하지 않았기 때문에 다른 모든 언어를 아래로 드래그하는 것이 이상하게 보입니다. .NET은 LOB 앱의 VB 작성자뿐만 아니라 일반적인 의미도 있습니다. '1 type of int'라고하면 byte, short, int, long도 고통스럽지 않다고 생각하십니까? 서명이 더 이상 어색한 이유를 잘 모르겠습니다.
nicodemus13

5

부호없는 정수는 특정 언어간에 상호 운용 할 수 없기 때문에 CLS 규격이 아닙니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.