aboutsummaryrefslogtreecommitdiff
path: root/vs-c.md
diff options
context:
space:
mode:
authorMelody Horn <melody@boringcactus.com>2020-10-24 22:12:52 -0600
committerMelody Horn <melody@boringcactus.com>2020-10-24 22:12:52 -0600
commitccfea3af030160a547988736174ca109e4bd7c07 (patch)
tree872ffc35d586d697e50591be63fefc9cea5824f6 /vs-c.md
parenta984bef9893a83f97dbb667477ad6ad1d58c0140 (diff)
downloadspec-ccfea3af030160a547988736174ca109e4bd7c07.tar.gz
spec-ccfea3af030160a547988736174ca109e4bd7c07.zip
move the C comparison to its own file
Diffstat (limited to 'vs-c.md')
-rw-r--r--vs-c.md68
1 files changed, 68 insertions, 0 deletions
diff --git a/vs-c.md b/vs-c.md
new file mode 100644
index 0000000..60d7905
--- /dev/null
+++ b/vs-c.md
@@ -0,0 +1,68 @@
+What differentiates Crowbar from C?
+
+# Removals
+
+Some of the footguns and complexity in C come from misfeatures that can simply not be used.
+
+## Footguns
+
+### Almost Always The Wrong Thing
+
+- `goto`
+- Octal literals
+- Hexadecimal float literals
+- Wide characters
+- Digraphs
+- Prefix `++` and `--`
+- Chaining mixed left and right shifts (e.g. `x << 3 >> 2`)
+- Chaining relational/equality operators (e.g. `3 < x == 2`)
+- Mixed chains of bitwise or logical operators (e.g. `2 & x && 4 ^ y`)
+- The comma operator `,`
+
+### Explicit Beats Implicit
+
+- `typedef`
+- Octal escape sequences
+- Using an assignment operator (`=`, `+=`, etc) or (postfix) `++` and `--` as components in a larger expression
+- The conditional operator `?:`
+- Preprocessor macros (but constants are fine)
+
+## Needless Complexity
+
+### Let The Compiler Decide
+
+- `inline`
+- `register`
+
+### Who Even Cares
+
+- `restrict`
+- `volatile`
+- `_Imaginary`
+
+# Adjustments
+
+Some C features are footguns by default, so Crowbar ensures that they are only used correctly.
+
+- Unions are not robust by default.
+ Crowbar only supports unions when they are [tagged unions](tagged-unions.md).
+
+C's syntax isn't perfect, but it's usually pretty good.
+However, sometimes it just sucks, and in those cases Crowbar makes changes.
+
+- C's variable declaration syntax is far from intuitive in nontrivial cases (function pointers, pointer-to-`const` vs `const`-pointer, etc).
+ Crowbar uses [simplified type syntax](types.md) to keep types and variable names distinct.
+- `_Bool` is just `bool`, `_Complex` is just `complex` (why drag the preprocessor into it?)
+- Adding a `_` to numeric literals as a separator
+- All string literals, char literals, etc are UTF-8
+
+# Additions
+
+## Anti-Footguns
+
+- C is generous with memory in ways that are unreliable by default.
+ Crowbar adds [memory safety guarantees](safety.md) to make correctness the default behavior.
+
+## Trivial Room For Improvement
+
+- Binary literals, prefixed with `0b`/`0B`