preliminary musings on bloatware guitarvydas.github.io/2024/04/27/Bloatware.html
This is extremely clarifying, because it makes it clear you're going in the exact opposite direction to me š
It's only a slight exaggeration to say I want to ship the IDE to "end-users" (scare quotes because I believe the demographic shouldn't exist). The source code should always be available.
So it now seems to me that we've been nodding along to each other that bloat is bad, but our definitions of "bloat" are in opposition. From my perspective, opcodes and the transistors they run on are a necessary evil. Both are bloat without the source code and late binding needed to keep the human in the loop exercising agency over them. Anything else is just disempowering legalism (futureofcoding.org/episodes/065) that is superfluous to requirements.
Interesting constrast. I am mostly on Kartik Agaram's side of what I consider important (non-bloat). But I think there's still a lot of overlap between both sides' definitions of bloat. For example code that exists due to technical debt.
Yeah, there's a reason this wasn't obvious. Mainstream software is bloated by both our definitions!
Traditional C compilers output code in assembly language , which is piped to an assembler , which is a program that outputs machine code . Modern compilers internally generate code in an intermediate representation , and then output machine code without going through assembly language. If you want to read the output in assembly language, you have to run a disassembler.
The assumption that the ideal application to ship to end users is all machine code and that anything else is bloat is an interesting one. If you look into it, it quickly becomes obvious that the machine code tends to be more bloated than the source code. That's on x86, an instruction set architecture that was designed to make the machine code as short as possible, at the expense of making the interpreter implemented in hardware more complex and less efficient. Modern alternatives to x86 care less about the compactness of the machine code.
It may actually be less bloated not to ship machine code, but instead ship an intermediate representation that can be JIT-compiled to machine code. Formats such as minified JS, Web Assembly and Dalvik bytecode are examples of more compact formats for shipping that in the end are passed to a JIT compiler that outputs less compact machine code.
Not only are instructions in intermediate representation shorter than in machine code, but intermediate representation can also take advantage of polymorphism, allowing polymorphic code to be shipped only once, whereas the final machine code may come in multiple monomorphic copies.