diff options
Diffstat (limited to '_posts')
-rw-r--r-- | _posts/2020-09-28-crowbar-1-defining-a-c-replacement.md | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/_posts/2020-09-28-crowbar-1-defining-a-c-replacement.md b/_posts/2020-09-28-crowbar-1-defining-a-c-replacement.md new file mode 100644 index 0000000..bdbd96b --- /dev/null +++ b/_posts/2020-09-28-crowbar-1-defining-a-c-replacement.md @@ -0,0 +1,88 @@ +--- +title: "Crowbar: Defining a good C replacement" +--- + +I like Rust a lot. +That said, the always-opinionated, often-correct Drew DeVault raises some good points in his blog post [Rust is not a good C replacement](https://drewdevault.com/2019/03/25/Rust-is-not-a-good-C-replacement.html). +He names some attributes that C has and Rust lacks which he thinks are required in a good C replacement. +So what can we say are some features of a hypothetical good C replacement? + +## Portability + +Per Drew, "C is the most portable programming language." +Rust, via LLVM, supports a lot of target architectures, but C remains ubiquitous. +Anything less portable than LLVM is, therefore, incapable of being a good C replacement, and to be a truly great C replacement a language should be as portable as C. + +The lifehack that makes sense here to me, difficult as it might be to implement, is to have the compiler for your C replacement be able to emit C as a compile target. +It might not be the same C that a competent C programmer would write by hand, the result might not initially be as fast as the compiler would be if it were running the full toolchain directly, but in principle a self-hosting compiler that could also emit C would be extremely easy to bootstrap on any new architecture. + +## Specification + +The C specification, while large and unwieldy and expensive, does at least exist. +This creates a clear definition for how a compiler *should* work, whereas the behavior of Rust-the-language is defined to be whatever rustc-the-compiler does. +Rust's lack of a specification allows it to move fast and not break things, which is cool for Rust (shout out to async/await), but there's virtue in moving slow, too. +I don't think Rust itself necessarily needs a specification, but I do think that a good C replacement should be formally specified, and move at the speed of bureaucracy to ensure only the best changes get actually made. + +The C99 specification is 538 pages and costs more money than I'd want to spend to get a legitimate copy of. +A good C replacement should probably have a specification that fits in half the size - hell, call it 200 pages for a nice round number - and that specification should be released free of charge and under a permissive license. + +## Diverse Implementations + +I think this is a result of having a specification more than a cause of its own, but Drew points out that the various C compilers keep each other and the spec honest and well-tested. +I think in principle a good C replacement could start out with only one compiler, but it would need to be fairly straightforward to write a new compiler for - which is certainly not the case for C. +It might be helpful to have several different reference compilers, themselves written in different languages and for different contexts. +(It would be a fun party trick to have a WebAssembly-based compiler that people could poke around at in their browsers.) + +## Zero-Effort FFI + +Drew calls this point "a consistent and stable ABI," but I think the context in which that matters is being able to use other libraries from your code, and being able to compile your code as a library that other people can use in turn, without needing to jump through extra hoops like writing glue layers manually or recompiling everything from source. +The easy ("easy") solution is to just build libraries that C code can just use directly, and use the same ABI that C libraries in turn would export, so that there's no such thing as FFI because no functions exist which are foreign. + +## Composable Build Tools + +I don't give a shit about this one, but in fairness to Drew I could understand why he would. +If I have a project that starts out being entirely C, and I'm like "oh lemme try out Rust for some of this", I don't want to start by swapping out my build system and everything, I want to keep my Makefiles and make like one change to them and call it a day. +(Makefiles also suck, but they don't dual-wielding-footguns suck, so it doesn't matter.) +But cargo is very decidedly not built to be used that way, and rustc is very decidedly not built to be called from things that aren't cargo. +So a good C replacement should have a compiler that works the way C compilers tend to, i.e. you pass in a file or several and a bunch of arguments and it builds the file you need it to build. + +## *fart noises* + +> Concurrency is generally a bad thing. + +## Safety Is Just Another Feature + +In light of all the problems he has with Rust, Drew declares + +> Yes, Rust is more safe. I don’t really care. In light of all of these problems, I’ll take my segfaults and buffer overflows. + +And like. +On one hand, those are all extremely avoidable problems, and the way to avoid them is to start using a memory safe language. +And they do cause *rather more substantial problems* than not having a specification. + +But also. +On the other hand, I don't eat my vegetables, I only comment my code half the time, I use Windows and I don't hate it. +We're all of us creatures of habit, we do what's familiar, and we'll keep doing things in dangerous ways if switching to safe ways would have too high a learning curve. +So as much of a bruh moment as this is in the abstract, I've been there, I'll likely be there again, and I can't really judge all that harshly. + +## Crowbar + +The conclusion to Drew's blog post opens like this: + +> C is far from the perfect language - it has many flaws. +> However, its replacement will be simpler - not more complex. + +And those sentences have been rattling around in my brain for a while now. +Because he's right about that much. +If we want C programmers to stop using C, we have to give them something that's only as different from C as it actually needs to be. +We need C: The Good Parts Plus Barely Enough To Add Memory Safety And Good Error Handling. + +And as someone with extraordinarily poor time management skills, I think I kinda want to work on building that. + +Naming things is widely known to be the hardest problem in computer science, but since the goal is to pry C diehards away from C, I think a good name for this project would be + +[Crowbar: the good parts of C, with a little bit extra](https://sr.ht/~boringcactus/crowbar-lang/). + +I don't know if this will get any of my time and attention. +It really shouldn't - I've got so much other shit I should be doing instead - but also this is fun so who knows. +Join the mailing lists if you're interested in participating. |