4 ms·
My undergrad was entirely in the C language and I’m very glad for it. Sometimes more modern languages can throw me for a loop, no pun intended, but the beauty (
by JohnMakin 2y ago
My undergrad was entirely in the C language and I’m very glad for it. Sometimes more modern languages can throw me for a loop, no pun intended, but the beauty (and horror) of C is that you are pretty close to the metal, it’s not very abstracted at all, and it allows you a lot of freedom (which is why it’s so foot gunny).
I will never love anything as much as I love C, but C development jobs lie in really weird fields I’m not interested in, and I’m fairly certain I am not talented enough. I have seen C wizardry up close that I know I simply cannot do. However, one of the more useful exercises I ever did was implement basic things like a file system, command line utilities like ls/mkdir etc. Sometimes they are surprisingly complex, sometimes no.
After you program in C for a while certain conventions meant to be extra careful kind of bubble up in languages in a way that seems weird to other people. for example I knew a guy that’d auto reject C PR’s if they didn’t use the syntax if (1==x) rather than if (x==1). The former will not compile if you accidentally use variable assignment instead of equality operator (which everyone has done at some point).
This tendency bites me a lot in some programming cultures, people (ime) tend to find this style of programming as overly defensive.
- smackeyacky 2y agoIn an embedded environment, overly defensive is an asset
- JohnMakin 2y agoThat’s precisely where my little professional C experience was. I then switched to a python shop and was initially horrified at some conventions, took some getting used to.
- deleted 2y ago[deleted]
- uecker 2y agoI force my students to do C development. And it turns out that it is not that hard if you approach it with modern tools which catch a lot of problems. The lack of abstraction is fixed with good libraries. C evolved a lot and many foot guns are not a problem anymore. For example for if (x = 1) you nowaday get a warning. https://godbolt.org/z/79acPPro6 https://godbolt.org/z/79acPPro6 Implicit int, calling functions without prototypes, etc. are hard errors. And so on.
- tialaramex 2y agoThe warning says to add parentheses, which sure enough silences the warning, your foot, however, still has a bullet hole in it.
- uecker 2y agoThe warning is very clear. If you did intend to use the result of an assignment as truth value, you would notice. In any case, did not have a single problem with this type of error in the last decades, working with programmers of various skill levels including beginners.
- lelanthran 2y ago> The warning says to add parentheses, which sure enough silences the warning, your foot, however, still has a bullet hole in it. The warning also says that it's an assignment. It's a pretty clear warning meant to force the programmer to do extra work to get the error.
- Joel_Mckay 2y agoThe libglib-dev with gcc is very handy for toy projects, but only _after_ students try to write their own versions: https://docs.gtk.org/glib/data-structures.html https://docs.gtk.org/glib/data-structures.html It could be fun to do a lab summary after the lists and hashes introduction. Have a wonderful day, =)
- uecker 2y agoI absolutely I agree that learning to create you own abstractions is an incredible useful skill. It depends though. For a programming course this makes absolutely sense. But for applied problems in, say, biomedical engineering, this does not work. Many students know only a bit of Python, and then it is too much and "too inconvenient" to start from scratch in C. With Python they have a lot of things more easily available, so they make quick progress. This does not lead to good results though! For most of the Python projects, we end of throwing away the code later. Another problem is that students often do not know what they are doing, e.g. the use some statistical package or visualization package and get nicely looking results, but they do not know what it means and often it is entirely wrong. For machine learning projects it is even worse. So much nonsense and errors from copying other people Python code....
- 8372049 2y ago> if they didn’t use the syntax if (1==x) rather than if (x==1). The former will not compile if you accidentally use variable assignment instead of equality operator No need for Yoda notation. clang will warn of this by default and gcc will do so if you compile with -Wall, which should also be your default.
- frou_dh 2y ago> for example I knew a guy that’d auto reject C PR’s if they didn’t use the syntax if (1==x) rather than if (x==1). The former will not compile if you accidentally use variable assignment instead of equality operator I've seen that one and personally dislike that mindset: Making the code less readable to compensate for a disinterest in using actual static analysis tooling.
- kubanczyk 2y agoLess readable? I agree these are less readable: if (987654321987654321==x) if (find_optimal(frobnicator(x)*8)==1) while these are subjectively more readable: if (x==987654321987654321) if (1==find_optimal(frobnicator(x)*8))
- tuveson 2y agoThese days GCC and Clang will both give you warnings for this if you have -Wall, which everyone should.
- mgerdts 2y ago> I have seen C wizardry up close that I know I simply cannot do. I have written C at least a few times per year for over 30 years. About ten years of that was OS development on Solaris and its derivatives. Articles like this show crazy things you can do in C. I’ve never found the need to do things like this and have never seen them in the wild. The places that wizardry is required are places like integer and buffer overflow, locking, overall structure of large codebases, build infrastructure, algorithms, etc. Many of these are concerns in most languages. > auto reject C PR’s if they didn’t use the syntax if (1==x) rather than if (x==1) When I was a student in the 90s advice like this would have been helpful. Compiler warnings and static analyzers are so much better now that tricks like this are not needed.
- lelanthran 2y ago> I knew a guy that’d auto reject C PR’s if they didn’t use the syntax if (1==x) rather than if (x==1). The former will not compile if you accidentally use variable assignment instead of equality operator (which everyone has done at some point). That's not so much of a footgun anymore - the common C compilers will warn you about that so there's not much point in defending against it. Same with literal format string parameters to printf functions: the compiler is very good at warning about mismatched types.