Tại sao unsigned int không tuân thủ CLS?


111

Tại sao các số nguyên không dấu không tuân thủ CLS?

Tôi bắt đầu nghĩ rằng đặc điểm kỹ thuật kiểu chỉ dành cho hiệu suất chứ không phải cho tính đúng đắn.

Câu trả lời:


88

Không phải tất cả các ngôn ngữ đều có khái niệm về int không dấu. Ví dụ, VB 6 không có khái niệm int không dấu mà tôi nghi ngờ đã dẫn đến quyết định không thực hiện của các nhà thiết kế VB7 / 7.1 (nó hiện được triển khai trong VB8).

Để trích:

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

CLS được thiết kế đủ lớn để bao gồm các cấu trúc ngôn ngữ thường được các nhà phát triển cần, nhưng cũng đủ nhỏ để hầu hết các ngôn ngữ có thể hỗ trợ nó. Ngoài ra, bất kỳ cấu trúc ngôn ngữ nào khiến không thể nhanh chóng xác minh độ an toàn của loại mã đã bị loại trừ khỏi CLS để tất cả các ngôn ngữ tuân thủ CLS có thể tạo ra mã có thể xác minh nếu họ chọn làm như vậy.

Cập nhật: Tôi đã tự hỏi về điều này vài năm trước và trong khi tôi không thể hiểu tại sao một UInt không thể xác minh được loại an toàn, tôi đoán các chàng trai CLS đã phải có một điểm cắt ở đâu đó về mức tối thiểu cơ bản số loại giá trị được hỗ trợ. Ngoài ra, khi bạn nghĩ về dài hạn khi ngày càng có nhiều ngôn ngữ được chuyển sang CLR, tại sao lại buộc chúng thực hiện các int không dấu để đạt được sự tuân thủ CLS nếu hoàn toàn không có khái niệm nào?


@Kevin: Tôi chỉ băn khoăn về chủ đề. Bạn trả lời có vẻ logic. Tôi chỉ thích suy nghĩ về chủ đề. Tôi nghĩ thật tiếc là các kiểu giống Pascal không được đưa vào CLR. Nhưng lập luận của bạn về các ngôn ngữ khác: điều đó đã không ngăn được IronPython sử dụng kiểu gõ động mạnh mẽ (DLR) trong một CLR được nhập tĩnh đặc biệt?
doekman

@doekman: Trong khi có IronPython và IronRuby chứng minh rằng CLR có thể cung cấp một nền tảng mà bạn có thể xây dựng các ngôn ngữ được nhập động, mục tiêu của CLS là cung cấp một bộ tiêu chuẩn vượt qua chức năng của ngôn ngữ và cho phép chúng tương tác với nhau thành công và an toàn. Tôi không nghĩ rằng những gì một ngôn ngữ có thể làm về việc thêm các tính năng DL có liên quan trực tiếp đến những gì nên đi vào CLS / CTS.
Kev

Theo hiểu biết của tôi, CLR có một kiểu nguyên thủy số nguyên 32 bit, có các hướng dẫn riêng biệt cho phép cộng có dấu với kiểm tra tràn, bổ sung không dấu với kiểm tra tràn và bổ sung có dấu-bất khả tri mod 2 ^ 32, v.v.; khi được yêu cầu chuyển đổi một tham chiếu đối tượng thành một số nguyên gốc 32 bit, CLR không biết cũng như không quan tâm đến việc mã sử dụng số đó mong muốn nó được ký hay không có dấu. Cho dù trình biên dịch tin rằng một số được ký hay không có dấu thường sẽ ảnh hưởng đến những hướng dẫn mà trình biên dịch tạo ra cho các hoạt động với nó, nhưng đó là vấn đề ngôn ngữ - không phải CLR -.
supercat

23

Tôi nghi ngờ một phần của vấn đề xoay quanh thực tế là các kiểu số nguyên không dấu trong C được yêu cầu hoạt động như các thành viên của một vòng đại số trừu tượng chứ không phải là các số [nghĩa là nếu một biến số nguyên 16 bit không dấu bằng 0 , giảm nó là bắt buộcđể mang lại 65,535 và nếu nó bằng 65,535 thì khi tăng dần thì bắt buộc phải mang lại bằng không.] Đôi khi hành vi như vậy cực kỳ hữu ích, nhưng các kiểu số thể hiện hành vi như vậy có thể đã đi ngược lại tinh thần của một số ngôn ngữ. Tôi phỏng đoán rằng quyết định bỏ qua các loại không được đánh dấu có thể có trước quyết định hỗ trợ cả ngữ cảnh số được kiểm tra và không được kiểm tra. Cá nhân tôi ước có các kiểu số nguyên riêng biệt cho các số không dấu và các vành đại số; áp dụng toán tử trừ một bậc cho số 32-bit không dấu sẽ mang lại kết quả có dấu 64-bit [phủ định bất kỳ điều gì khác 0 sẽ mang lại số âm] nhưng việc áp dụng phép trừ một bậc cho một kiểu vòng sẽ tạo ra nghịch đảo cộng trong vòng đó.

Trong mọi trường hợp, lý do số nguyên không dấu không tuân thủ CLS là do Microsoft quyết định rằng các ngôn ngữ không cần phải hỗ trợ số nguyên không dấu để được coi là "tương thích với CLS".


Giải thích tuyệt vời từ quan điểm toán học!
dizarter

6

Các int không dấu không giúp bạn đạt được nhiều điều đó trong cuộc sống thực, tuy nhiên việc có nhiều hơn 1 loại int sẽ khiến bạn đau đầu, vì vậy rất nhiều ngôn ngữ chỉ có int đơn.

Tuân thủ CLS nhằm cho phép một lớp được sử dụng từ nhiều ngôn ngữ…

Hãy nhớ rằng không ai bắt bạn phải tuân thủ CLS.

Bạn vẫn có thể sử dụng các int chưa được ký trong một phương thức hoặc dưới dạng parms cho một phương thức riêng tư , vì nó chỉ là API công khai mà tuân thủ CLS hạn chế.


16
Chúng rất cần thiết, nếu bạn đang thực hiện bất kỳ phép tính nào khôn ngoan.
nicodemus 13

@ nicodemus13 lần cuối cùng bạn thấy hệ thống quản trị doanh nghiệp có số học khôn ngoan trong miền vấn đề của nó là khi nào? (Ví dụ: loại phần mềm mà các lập trình viên VB.NET viết)
Ian Ringrose

38
Bất kỳ thứ gì có tổng kiểm tra sẽ sử dụng số học khôn ngoan, điều đó khá phổ biến, và tôi thấy hơi kỳ lạ khi kéo mọi ngôn ngữ khác xuống, bởi vì VB không hỗ trợ số nguyên không dấu. .NET cũng có nghĩa là chung chung, không chỉ dành cho người viết VB của ứng dụng LOB. Khi bạn nói '1 loại int', bạn không nghĩ rằng việc có byte, short, int, long cũng là một điều khó khăn? Tôi không hiểu tại sao việc ký kết lại khó xử hơn.
nicodemus 13

5

Các số nguyên không dấu không tuân thủ CLS vì chúng không thể tương tác giữa các ngôn ngữ nhất định.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.