Remix.run Logo
tialaramex 4 days ago

> Even assembly language and machine code has types.

I agree with the overall thrust of your argument, but on this specifically what's noticeable in an assembly language is that data doesn't have types, the operations are typed. That's usually not really a thing in programming languages. It does happen, but it's not common.

For example Rust's Wrapping<i8> is a distinct type from Saturating<i8>, and if we've got variables named foo and bar with the value 100 in them, if foo and bar have the type Wrapping<i8> the addition operation means the answer is -56 but for Saturating<i8> the exact same addition operation gets you 127

In assembly or machine code there's be Wrapping addition, and Saturating addition and they'd both work on integers, which don't themselves inherently care.

guerrilla 4 days ago | parent [-]

No, the data is typed; it's just not type checked.

tialaramex 4 days ago | parent [-]

I don't buy it. Go look at the Godbolt assembly output when you write software with some floating point constants on a modern CPU. The assembly has no floating point constants, because why would it, the data doesn't have a type, those constants are just emitted as integers, because they're the same thing.

The 32-bit integer 0x3f000000 is literally the same thing as the 32-bit floating point value 0.5

guerrilla 4 days ago | parent [-]

Types are not data formats.

tialaramex 4 days ago | parent [-]

Sure, but what I'm getting at is that RAX does not have a type

If we write that Quake 3 "fast" inverse square root, the machine code does not have any casting or type changes, but the C does and the Rust does, because in machine code the operations were typed but in these high level languages the values were typed.

guerrilla 2 days ago | parent [-]

Types are also not type annotations.