Another systems language novice here, here’s my 2 cents from what I believe is at least part of the Rust intended audience (by design or just happen stance).
TL;DR:
My dream scenario would be this: unsuffixed literals and int are i32 but remove i and u suffixes entirely. Also implement a pointer sized integer named something else entirely and using a suffix such as ip, iz, iw, ix, etc etc. Personally I think isize is horribly strange, and can imagine anyone else coming from a dynamic language would say the same…but that’s another topic.
Full Story
Rust attracted me because I’m coming from a dynamic language background (Python), and it is allowing me to get into the systems level business safely (otherwise I woul dhave just jumped into C/C++). It is also somewhat familiar territory with type inference, etc. So I highly believe I won’t be the only non-systems programmer interested in using Rust (which is a great thing!). Having said all this, coming to a systems language, I know there will be a learning curve and things I need to start caring about, but saying that, “Everyone who uses Rust must care about integer widths all the time!” is ridiculous. You’re dangerously close to taking The Moral High Ground, which is super offputing. And unless Rust is being imposed on you by your job, that’s the point at which you walk away.
Initially, when starting with Rust people may not even be aware there are multiple width integers. They simply know, “I need a number.” (As many dynamic language users do). Not having an int type may be strange, to veteran C/C++ (or even Java/C#) developers, but may not be a huge deal to dynamic language developers. The downside is those trying to take the learning curve are potentially going to suffer by not having a good default choice and being told picking a good width integer is a must. When suggesting disallowing ints in release code, etc. This will also turn off newcomers. I totally understand trying to assist the programmer not make mistakes, but telling him or her outright what to do is a no go.
Using a BigInt just play it safe and cover those huge huge numbers isn’t plausible in my book. People coming from languages like Python or Ruby are coming to Rust for a reason, to get better performance, or static typing, etc. They will be aware there are differences in Rust, and specifying that ints can only hold up to X number safely is one such step on the learning escalator.
Why this is such a huge topic is strange to me. Those who really care about integer widths, will know to look for one that suits them. 32bit widths are almost certainly large enough for most of the, “Just give a me a number and I’ll sort out the size later” scenarios. If someone knows their number is going to be huge in advance, they already know they want a large (64bit or higher) number.
The real question to me is what is the fallback for unsuffixed literals? i32 from what I’ve heard. So in my mind, if we keep the i and u suffix (which I think should go away due to looking like imaginary numbers, and can be confusing when we already have unsuffixed literals) they should denote an int type which in this scenario is the same as unsuffixed literals (i32). Now, that’s a lot of duplication, and could lead to confusion to newcomers who may be using 5i or let x: int = 5; just to try to start doing things the “Rust Way.”
/rant off