I wonder how much of C that was just "that is how it happened to turn out".
E.g. C vs Lisp vs Smalltalk vs APL vs ML/Haskell vs COBOL vs FORTH vs PROLOG
Concrete example from personal experience:
All objects in Ruby have a unique ID. The standard implementation of Ruby added a function to go from the ID to the object. This was easy on the standard implementation of Ruby, because the ID is just the pointer, so you can just cast it. It's a nightmare on more sophisticated implementations of Ruby where an object may not have a single canonical address that you can use as an ID, and you need to store a huge separate mapping.
I would be partial to any course that uses Appel's "Modern Compiler Implementation in ML", though that book is getting pretty old now.
[0]: https://github.com/cksystemsteaching/selfie [1]: https://vimeopro.com/user12798068/university-of-salzburg-int...
https://thorstenball.com/books/ seems like a good star, and if you don't know Go it shouldn't take too long to get acquainted with it.
https://dirkjan.ochtman.nl/writing/2012/07/21/compilers-on-c...
http://openclassroom.stanford.edu/MainFolder/DocumentPage.ph...