Mengapa unsigned int tidak sesuai dengan CLS?

111

Mengapa unsigned integer tidak sesuai dengan CLS?

Saya mulai berpikir spesifikasi tipe hanya untuk kinerja dan bukan untuk kebenaran.

doekman
sumber

Jawaban:

88

Tidak semua bahasa memiliki konsep unsigned int. Misalnya VB 6 tidak memiliki konsep unsigned int yang saya curigai mendorong keputusan desainer VB7 / 7.1 untuk tidak menerapkannya juga (sekarang diimplementasikan di VB8).

Kutipan:

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

CLS dirancang agar cukup besar untuk menyertakan konstruksi bahasa yang biasanya dibutuhkan oleh pengembang, namun cukup kecil sehingga sebagian besar bahasa dapat mendukungnya. Selain itu, konstruksi bahasa apa pun yang tidak memungkinkan untuk memverifikasi dengan cepat keamanan jenis kode telah dikecualikan dari CLS sehingga semua bahasa yang sesuai dengan CLS dapat menghasilkan kode yang dapat diverifikasi jika mereka memilih untuk melakukannya.

Pembaruan: Saya bertanya-tanya tentang ini beberapa tahun yang lalu, dan sementara saya tidak dapat melihat mengapa UInt tidak akan menjadi jenis keamanan yang dapat diverifikasi, saya kira orang-orang CLS harus memiliki titik potong di suatu tempat tentang apa yang akan menjadi baseline minimum jumlah jenis nilai yang didukung. Juga ketika Anda memikirkan tentang jangka panjang di mana semakin banyak bahasa yang di-porting ke CLR mengapa memaksa mereka untuk mengimplementasikan unsigned int untuk mendapatkan kepatuhan CLS jika sama sekali tidak ada konsep?

Kev
sumber
@Kevin: Saya hanya ingin tahu tentang topiknya. Anda menjawab sepertinya logika. Saya hanya suka memikirkan topiknya. Saya pikir itu memalukan, tipe seperti Pascal tidak berhasil masuk ke CLR. Tetapi argumen Anda tentang bahasa lain: itu tidak menghentikan IronPython menggunakan pengetikan yang sangat dinamis (DLR) dalam CLR yang diketik dengan statis?
doekman
@doekman: Meskipun yes IronPython dan IronRuby mendemonstrasikan bahwa CLR dapat menyediakan platform tempat Anda dapat membangun bahasa yang diketik secara dinamis, tujuan CLS adalah untuk menyediakan satu set standar yang melampaui fungsionalitas bahasa dan memungkinkan mereka untuk beroperasi dengan sukses dan aman. Saya tidak berpikir apa yang dapat dilakukan suatu bahasa dalam hal menambahkan fitur DL secara langsung terkait dengan apa yang harus masuk ke CLS / CTS.
Kev
Dari pemahaman saya, CLR memiliki satu tipe primitif integer 32-bit, yang memiliki instruksi terpisah untuk penambahan yang ditandatangani dengan pemeriksaan overflow, penambahan unsigned dengan pemeriksaan overflow, dan penambahan tanda-agnostic mod 2 ^ 32, dll .; ketika diminta untuk mengonversi referensi objek menjadi primitif integer 32-bit, CLR tidak tahu atau tidak peduli apakah kode yang menggunakan nomor itu mengharapkannya untuk ditandatangani atau tidak. Apakah kompilator yakin suatu nomor ditandatangani atau tidak umumnya akan mempengaruhi instruksi apa yang dihasilkan kompilator untuk operasi dengannya, tetapi itu adalah masalah bahasa - bukan CLR.
supercat
23

Bagian dari masalah, saya curiga, berkisar pada fakta bahwa tipe integer unsigned di C diharuskan berperilaku sebagai anggota cincin aljabar abstrak daripada sebagai angka [artinya, misalnya, jika variabel integer 16-bit unsigned sama dengan nol , decrementing itu diperlukanuntuk menghasilkan 65.535, dan jika itu sama dengan 65.535 maka diperlukan peningkatan untuk menghasilkan nol.] Ada kalanya perilaku seperti itu sangat berguna, tetapi tipe numerik yang menunjukkan perilaku seperti itu mungkin bertentangan dengan semangat beberapa bahasa. Saya akan menduga bahwa keputusan untuk menghilangkan tipe unsigned mungkin mendahului keputusan untuk mendukung konteks numerik yang dicentang dan tidak dicentang. Secara pribadi, saya berharap ada tipe integer terpisah untuk bilangan unsigned dan cincin aljabar; menerapkan operator minus unary ke bilangan 32-bit unsigned harus menghasilkan hasil bertanda 64-bit [meniadakan apa pun selain nol akan menghasilkan bilangan negatif] tetapi menerapkan minus unary ke jenis cincin harus menghasilkan invers aditif di dalam cincin itu.

Bagaimanapun, alasan bilangan bulat unsigned tidak sesuai dengan CLS adalah karena Microsoft memutuskan bahwa bahasa tidak harus mendukung bilangan bulat tidak bertanda tangan agar dianggap "kompatibel dengan CLS".

supercat
sumber
Penjelasan yang sangat bagus dari perspektif matematika!
dizarter
6

Unsigned int tidak memberi Anda banyak manfaat di kehidupan nyata, namun memiliki lebih dari 1 jenis int membuat Anda sakit, jadi banyak bahasa hanya memiliki int yang hangus.

Kepatuhan CLS ditujukan untuk memungkinkan kelas dapat digunakan dari banyak bahasa…

Ingatlah bahwa tidak ada yang membuat Anda patuh pada CLS.

Anda masih bisa menggunakan unsigned int dalam sebuah metode, atau sebagai parms untuk metode privat , karena hanya API publik yang dibatasi oleh CLS.

Ian Ringrose
sumber
16
Mereka sangat penting, jika Anda melakukan aritmatika yang sedikit bijak.
nicodemus13
@ nicodemus13 Kapan terakhir kali Anda melihat sistem admin bisnis yang memiliki sedikit aritmatika dalam domain masalahnya? (Misalnya jenis perangkat lunak yang ditulis pemrogram VB.NET)
Ian Ringrose
38
Apa pun dengan checksum akan menggunakan aritmatika bit-bijaksana, itu cukup umum, dan tampaknya aneh bagi saya untuk menyeret setiap bahasa lain ke bawah, karena VB tidak mendukung integer yang tidak bertanda tangan. .NET juga dimaksudkan untuk menjadi generik, tidak hanya untuk penulis VB aplikasi LOB. Ketika Anda mengatakan '1 type of int', Anda tidak berpikir memiliki byte, short, int, long juga merepotkan? Saya tidak mengerti mengapa penandatanganan menjadi lebih canggung.
nicodemus13
5

Integer yang tidak bertanda tangan tidak sesuai dengan CLS karena tidak dapat dioperasikan antara bahasa tertentu.

Bryan Roth
sumber