News for hackers. Stuff that matters.
Re:Go 2, here we come by the_clarence on Thursday November 29, 2018 @01:47PM (#18562661)
Why oh why do people want a value to have different bounds depending on which system it is used? This is a source of huge confusion and why people stick to uint8 and other precise types
Re:Go 2, here we come by adrianmonk on Thursday November 29, 2018 @02:32PM (#18563154)
It's a perfectly reasonable niche use case for achieving maximum performance.

My main issues with it are:

1. Like many other performance optimizations, it is a trade-off. You may be sacrificing easy maintenance or even introducing breakage (if the person using it doesn't understand the limitations and implications). So IMHO you should only do it if you can show through profiling, etc. that the gain is real and worth it.

2. As a matter of language ergonomics, it should never be something that anyone does unknowingly. You should have to explicitly ask for it. The type name should be something blindingly obviously like "native_int" or "word_int".

Re:Go 2, here we come by dcow on Thursday November 29, 2018 @03:06PM (#18563459)
Even Swift who’s mantra is do nothing unexpected or implicit has a machine dependent (word sized) Int type.
Re:Go 2, here we come by the_clarence on Thursday November 29, 2018 @04:19PM (#18564115)
You’re trading off security here. Users are going to shoot themselves in the foot assuming that int is this size or this size.
Re:Go 2, here we come by drb91 on Thursday November 29, 2018 @02:00PM (#18562810)
People have traditionally wanted to use the maximum sized type that can fit in a register.
Re:Go 2, here we come by Someone on Thursday November 29, 2018 @03:57PM (#18563937)
More precisely: they wanted the integer type that was large enough and ran their code fastest.

On CPUs with 64-bit and 32-bit registers, that typically is the register-sized integer type. Machines with 16-bit registers are a bit of an edge case, as 16-bit integers may both be a lot faster on them then 32-bit integers and, in many cases, too small)

If go chose to use 32-bit integers as default, some users on 64-bit systems would complain that they couldn’t create, say, an array of 6 billion ints. If they chose 64-bit, some users on 32-bit systems would complain their loops were needlessly slow, and code bloated (why waste 4 bytes of almost every integer in a program?)

Not having generics makes this more of a problem. If go had generics, switching between integer sizes could be a matter of recompilation using a different compiler flag)

A sufficiently advanced compiler would help here, but go doesn’t have one (not exceptional), and doesn’t even aim to have one (compilation speed seems more of a goal than run-time speed)

Re:Go 2, here we come by TheDong on Thursday November 29, 2018 @08:03PM (#18565712)
> Not having generics makes this more of a problem. If go had generics, switching between integer sizes could be a matter of recompilation using a different compiler flag)

Isn't it already the case that you can switch between int sizes with compiler flags?

    var i int
That will be 32 bits if I compile it with GOOS=linux GOARCH=386 and will be 32 bits if I swap in amd64 instead of 386 there.

Is there any language where generics are useful for switching between int sizes? None come to mind offhand, so I don't quite understand what you mean.

Re:Go 2, here we come by user5994461 on Thursday November 29, 2018 @03:17PM (#18563545)
Traditionally the register size was too small, it's very common to have numbers above 256 or 65536. It's not true anymore with 32 bits numbers and a limit of 2 billion.
Re:Go 2, here we come by throwaway34241 on Thursday November 29, 2018 @04:29PM (#18564210)
On 64 bit systems you can have large arrays that are bigger than a 32 bit int. For example, it's nice to be able to load a >2GB file into a byte array.

For comparison, Java's int type is 32 bits on 64 bit systems, but then this limits the array size. It seems like a lesser evil to have a platform-native int type than to limit the size of arrays (especially since servers can be expected to increase their max memory going forward).

Of course, standardizing on 64 bit ints instead would require emulating them on 32 bit systems, when they can't support that much memory anyway (you could argue that 32 bit systems don't matter much anymore, but if you really don't care about ever running on them, then you can just treat 'int' as 64 bits and not variable size).

Re:Go 2, here we come by Too on Friday November 30, 2018 @01:52AM (#18567269)
C# is the same, int is merely an alias for Int32 and the default Array type only holds 32bit.

If you really need to, it's easy to wrap this into your own BigArray-class holding a 32bit-array-of-32bit-arrays and overriding the []-operator with Int64 as argument.

Re:Go 2, here we come by scott_s on Thursday November 29, 2018 @04:35PM (#18564268)
It's a rational practice when your language allows casting pointers to integers. Since the size of the pointer itself will vary based on the underlying architecture, you need an integer type which will also vary based on the underlying architecture.
Re:Go 2, here we come by Vendan on Thursday November 29, 2018 @04:51PM (#18564423)
I feel you, but, that's uintptr. int is more useful as the "native type" for array/slice length/cap/indexing
Re:Go 2, here we come by friday99 on Thursday November 29, 2018 @05:20PM (#18564677)
Except length/cap/index are always positive, so I think int was a mistake here.
Re:Go 2, here we come by joppy on Thursday November 29, 2018 @10:32PM (#18566413)
I think that the rationale for using int for array indices and lengths and so on is to avoid shooting yourself in the foot with wrap-around arithmetic (again, my thesis being that when 99% of people use integers, they expect them to behave like integers and not wrap)

Take for example code which finds consecutive differences in a list, something like

  for i := 0; i < len(list) - 1; i++ {
    print(list[i+1] - list[i])
  }
This code looks fine and reasonable, and we even avoided the off-by-one error at the end. However, if len(list) is a uint and we run this on an empty list, len(list) - 1 is then 2^32 or something, and the program explodes.

So this is the rationale for using signed integers rather than unsigned integers. I think the language semantics should go further, and use true integers pretty much everywhere. Note that the compiler could still easily see that the index variable in the loop above is bounded, and use a machine word under-the-hood. But the programmer only ever has to think about well-behaved integers.

Re:Go 2, here we come by scott_s on Friday November 30, 2018 @11:44AM (#18570329)
I actually agree. I was responding to someone who dismissed the entire concept.
Re:Go 2, here we come by Vendan on Friday November 30, 2018 @07:33PM (#18574126)
no, I get that, but int is not for pointer<->integer conversions. That is very specifically a separate type:

    uintptr  an unsigned integer large enough to store the uninterpreted bits of a pointer value
https://golang.org/ref/spec#Numeric_types
Re:Go 2, here we come by scott_s on Friday November 30, 2018 @08:44PM (#18574462)
Sure, but did I imply it was? I’m genuinely confused.
Re:Go 2, here we come by Vendan on Monday December 03, 2018 @12:46AM (#18586615)
> language allows casting pointers to integers

The original thread was about converting int to be an arbitrary precision type: "so that 'int' can become a true integer". One would imagine that, to preserve the ability to do pointer <-> non-pointer number, they would just leave uintptr alone, and so basically ignore your concerns, whereas int as the "native type" for slice indexes and the like is a more likely reason to prevent messing with "int" itself

Re:Go 2, here we come by scott_s on Tuesday December 04, 2018 @10:46AM (#18600408)
Okay, that's the source of the confusion. I was not replying to that sentiment, which is a nuanced discussion on what an int should be. I was replying to the_clarence's categorical dismissal of variable width integer types.