C isn't a programming language anymore (2022)

(faultlore.com)

63 points | by stickynotememo 6 hours ago ago

71 comments

  • nacozarina 6 hours ago

    None of the alternatives have stability. What was exemplary & idiomatic rust pre-pandemic would be churlish & rejected now and the toolchain use would be different anyway.

    Carpenters, plumbers, masons & electricians work on houses 3-300 yrs old, navigate the range of legacy styles & tech they encounter, and predictably get good outcomes.

    Only C has, yet, given use that level of serviceability. C99, baby, why pay more?

    When there’s an alternative that can compete with that sort of real-world durability, C will get displaced.

    • cannonpr 5 hours ago

      Having just finished renovating a 140-year-old home with solid brick walls that was slowly collapsing and deteriorating due to the aforementioned professionals’ application of modern and chemically incompatible materials to it… I’m not sure I agree. It’s also why a lot of the UK’s building stock is slowly rotting with black mould right now. Literally none of the professionals I hired, before I trained them, knew how to properly repair a type of home that represents 30% of the UK building stock.

    • thayne an hour ago

      FWIW, the crabi project within rust is trying to improve on some parts of it. But it is still built on (a subset of) the environments c ABI. And it doesn't fix all the problems.

    • ux266478 3 hours ago

      > Only C has, yet, given use that level of serviceability.

      On the contrary, Lisp outshines C to a large degree here. Success has nothing to do with technical merit (if such a thing even exists), it's not a rational game.

      • Panzer04 3 hours ago

        What makes you say that?

        • ux266478 3 hours ago

          Reduce is a Lisp library that's still in active use from 1968, making it older than C itself. We can point to GNU Emacs as an ancient and venerable self-contained Lisp tortoise with more wrinkles than are finitely enumerable, and is in fact a hosted Lisp operating system. Pulling it apart and working with it is admittedly a treat even if I loathe it as a text editor. Mezzano is a modern Lisp OS that you can play with in a VM, and might give you an idea of why Lisp is such a great systems language.

          In short: Lisp is semantic and geared towards a living system. The basic REPL is sh + cc + ld + db (and a few others) all in one. It's almost a little mind bending how nice these systems are put together, how cleanly they work. C is like pulling teeth in comparison.

          I'm not even a fan of Lisp or sexpr languages. But it's the obvious heavyweight champion of longetivity and ultra-pragmatic service record... Yes, even in the systems domain.

    • charleslmunger 5 hours ago

      C99, but with a million macros backporting features from newer language versions and compiler extensions. Lovely features you don't get with ordinary c99:

      free_sized

      #embed

      static_assert

      Types for enum

      Alignof, alignas, aligned_alloc

      _Atomic

    • okanat 5 hours ago

      The replacement has already happened. It is HTTP and JSON for 99% of the software developed today. The reason C stayed has multiple reasons but most obvious ones are for me are:

      - People just stopped caring about operating systems research and systems programming after ~2005. Actual engineering implementations of the concepts largely stopped after the second half of 90s. Most developers moved on to making websites or applications in higher level programming languages.

      - C hit a perfect balance of being a small enough language to grok, being indepedent of the system manufacturers, reflecting the computer architecture of 80s, actually small in syntax and code length and quite easy to implement compilers for. This caused lots of legacy software being built into the infrastructure that gave birth to the current contemporary popular OSes and more importantly the infrastructure of the Internet. Add in .com bubbles and other crises, we basically have/had zero economic incentive to replace those systems.

      - Culture changed. We cared more about stability, repairability and reusability. Computers were expensive. So are programmers and software. Now computers are cheap. Our culture is more consumerist than ever. The mentality of "move fast and break things" permeated so well with economic policy and the zeitgeist. With AI it will get worse. So trying to make a real alternative to C (as a generic low level OS protocol) has reduced cultural value / optics. It doesn't fill the CVs as well.

      It doesn't mean that people haven't tried or even succeeded. Android was successful in multiple fronts in replacing C. Its "intents" and low level interface description language for hardware interfaces are great replacement for C ABI. Windows' COM is also a good replacement that gets rid of language dependence. There are still newer OSes try like Redox or Fuchsia.

      • PaulDavisThe1st an hour ago

        > People just stopped caring about operating systems research and systems programming after ~2005.

        and so it was that after that date, all development of

           embedded systems
           kernel drivers
           digital audio workstations
           video editors
           codecs for audio and video
           anything that involved actually controlling non-computer hardware
           game engines
        
        came to a grinding halt, and no further work was done.
      • noosphr 4 hours ago

        I'd never thought I'd see the day that anyone praises COM.

      • sinnsro 3 hours ago

        > It doesn't mean that people haven't tried or even succeeded. Android was successful in multiple fronts in replacing C. Its "intents" and low level interface description language for hardware interfaces are great replacement for C ABI. Windows' COM is also a good replacement that gets rid of language dependence. There are still newer OSes try like Redox or Fuchsia.

        I am not sure I buy this from a system perspective, especially when taking this[1] into consideration.

        ______

        1. Alexis King's reply to "Why do common Rust packages depend on C code?". Link: https://langdev.stackexchange.com/a/3237

      • trueismywork 4 hours ago

        Name me a stable binary interface that is not ints and arrays of ints

      • chasil 3 hours ago

        In pieces of my code, I need to call setuserid() to manage some of the security that I designed in 2010.

        There was no Rust at that point, and I used the most basic tool that could do it.

        Could I have done this in Java with gymnastics of JNI, linking C into the JRE?

        Definite maybe.

      • kogasa240p 4 hours ago

        >Culture changed. We cared more about stability, repairability and reusability. Computers were expensive. So are programmers and software. Now computers are cheap. Our culture is more consumerist than ever. The mentality of "move fast and break things" permeated so well with economic policy and the zeitgeist. With AI it will get worse. So trying to make a real alternative to C (as a generic low level OS protocol) has reduced cultural value / optics. It doesn't fill the CVs as well.

        IMO I do see this changing in the future as higher power computers become expensive once again, and I'm not just referring to the recent chip shortage.

  • pizlonator 5 hours ago

    It’s weird how whiny this post is. Like there’s zero intellectual curiosity about why C got this way, and why C gets to be the foundation for how systems software is written.

    I could write a whole essay about why, but now isn’t the time. I’m just going to enjoy the fact that TFA and the author don’t get it.

    • munificent 5 hours ago

      > why C gets to be the foundation for how systems software is written.

      Is there an answer here more interesting than "it's what Unix and Windows were written in, so that's how programs talked to the OS, and once you have an interface, it's impossible to change"?

      • drnick1 4 hours ago

        Yes and no. Clearly what you said is true, but the more profound reason is that C just minimally reflects how computers work. The rest is just convention.

        • thayne 13 minutes ago

          The things complained about in the article are not a minimal reflection of how computers work.

          Take the "wobbly types" for example. It would have been more "minimal" to have types tied directly to their sizes instead of having short, int, long, etc.

          There isn't any reason that compilers on the same platform have to disagree on the layout of the same basic type, but they do.

          The complaints about parsing header files could potentially be solved by an IDL that could compile to c header files and ffi definitions for other languages. It could even be a subset of c that is easier to parse. But nothing like that has ever caught on.

        • ChrisSD 2 hours ago

          It minimally reflects PDP-11 assembly, which is not how modern computers work.

          • uecker 12 minutes ago

            This is a meme which is repeated often, but not really true. If you disagree, please state specifically what property of PDP-11 you think it different from how modern computers work, and where this affects C but not other languages.

        • stackghost 38 minutes ago

          > C just minimally reflects how computers work. The rest is just convention.

          This hasn't been true for decades. x86 assembly is now itself an abstraction over what the CPU is actually doing.

          Microcode, speculative execution, etc.

          • kristianp 29 minutes ago

            It seems to be a meme on HN that C doesn't reflect hardware, now you're extending that to assembly. It seems silly to me. It was always an approximation of what happens under the hood, but I think the concepts of pointers, variable sizes and memory layout of structs all represent the machine at some level.

      • jonjacky 5 hours ago

        It wasn't a coincidence, or an accident. C was specifically designed to write Unix, by people who had experience with a lot of other computer languages, and had programmed other operating systems including Multics and some earlier versions of Unix. They knew exactly what they were doing, and exactly what they wanted.

        • munificent 4 hours ago

          I'm not sure what you mean by "coincidence" or "accident" here.

          C is a pretty OK language for writing an OS in the 70s. UNIX got popular for reasons I think largely orthogonal to being written in C. UNIX was one of the first operating systems that was widely licensed to universities. Students were obliged to learn C to work with it.

          If the Macintosh OS had come out first and taken over the world, we'd probably all be programming in Object Pascal.

          When everyone wanted to program for the web, we all learned JavaScript regardless of its merits or lack thereof.

          I don't think there's much very interesting about C beyond the fact that it rode a platform's coattails to popularity. If there is something interesting about it that I'm missing, I'd definitely like to know.

          • jonjacky a minute ago

            > I'm not sure what you mean by "coincidence" or "accident" here.

            I mean Unix had to be written in C, not in, say, Algol or PL/I or BLISS, high-level languages used to write other operating systems.

            I also meant that the features of C were not put there by impulse or whim, they were the outcome of considered decisions guided by the specific needs of Unix.

          • jonjacky 33 minutes ago

            It is often said that C became popular just because Unix was popular, due to being free -- it just "rode its coattails" as you put it.

            As if you could separate Unix from C. Without C there wouldn't have been any Unix to become popular, there wouldn't have been any coattails to ride.

            C gave Unix some advantages that other operating systems of the 1970s and 80s didn't have:

            Unix was ported to many different computers spanning a large range of cost and size, from microcomputers to mainframes.

            In Unix both the operating system and the applications were written in the same language.

            The original Unix and C developers wrote persuasive books that taught the C language and demonstrated how to do systems programming and application programming in C on Unix.

            Unix wasn't the first operating system to be written in a high-level language. The Burroughs OS was written in Algol, Multics was written in PL/I, and much of VMS was written in BLISS. None of those languages became popular.

            IN the 1970s and 80s, Unix wasn't universal in universities. Other operating systems were also widely used: Tenex, TOPS-10, and TOPS-20 on DEC-10s and 20s, VMS on VAXes. But their systems languages and programming cultures did not catch on in the same way as C and Unix.

            The original Macintosh OS of the 1980s was no competitor to Unix. It was a single user system without integrated network support. Apple replaced the original Macintosh OS with a system based on a Unix.

          • heyitsdaad 4 hours ago

            First to market is not necessarily the best, case in point: many video sites existed before Youtube, including ones based on Apple Quicktime. But in the end Flash won.

            To me it looks like there is a better way to do things and the better one eventually wins.

          • AnimalMuppet 3 hours ago

            Repeating a previous comment of mine (https://news.ycombinator.com/item?id=32784959) about an article in Byte Magazine (August 1983) on the C programming language:

            From page 52:

            > Operating systems have to deal with some very unusual objects and events: interrupts; memory maps; apparent locations in memory that really represent devices, hardware traps and faults; and I/O controllers. It is unlikely that even a low-level model can adequately support all of these notions or new ones that come along in the future. So a key idea in C is that the language model be flexible; with escape hatches to allow the programmer to do the right thing, even if the language designer didn't think of it first.

            This. This is the difference between C and Pascal. This is why C won and Pascal lost - because Pascal prohibited everything but what Wirth thought should be allowed, and Wirth had far too limited a vision of what people might need to do. Ritchie, in contrast, knew he wasn't smart enough to play that game, so he didn't try. As a result, in practice C was considerably more usable than Pascal. The closer you were to the metal, the greater C's advantage. And in those days, you were often pretty close to the metal...

            Later, on page 60:

            > Much of the C model relies on the programmer always being right, so the task of the language is to make it easy what is necessary... The converse model, which is the basis of Pascal and Ada, is that the programmer is often wrong, so the language should make it hard to say anything incorrect... Finally, the large amount of freedom provided in the language means that you can make truly spectacular errors, far exceeding the relatively trivial difficulties you encounter misusing, say, BASIC.

            Also true. And it is true that the "Pascal model" of the programmer has quite a bit of truth to it. But programmers collectively chose freedom over restrictions, even restrictions that were intended to be for their own good.

      • pizlonator 4 hours ago

        Yes

        • munificent 4 hours ago

          Care to share the answer with the rest of the class?

          • uecker 5 minutes ago

            I am not sure what Filip's view on this is. But like to point out the article from Stephen Kell linked below which explains why C is an incredibly useful tool for systems programming and what distinguishes it from all other languages.

            https://dl.acm.org/doi/abs/10.1145/3133850.3133867

    • exidy 4 hours ago

      The author is upfront about their goals and motivations and explicitly acknowledges that other concerns exist. Calling it whiny is ungracious -- the author is letting some very human frustration peek through in their narrative.

      Not everything has to be written with all the warmth and humanity of a UN subcommittee interim report on widget standardisation.

    • ranger_danger 5 hours ago

      What is TFA?

    • yunnpp 4 hours ago

      The writing is terrible and full of fluff. Maybe the cat logo should have been a warning.

  • smallstepforman 37 minutes ago

    C’s biggest sins (also inherited by C++):

    - unspecified default type sizes. Should have had i8, u16, i32, u64, f32, f64 from the beginning.

    - aliasing pointers being restricted by default (ie an alias keyword should have been added). Performance matters. All these benchmarks which show something beating C or C++ are mostly due to dealing with aliasing pointers. C++26 still doesnt have standardised restrict keyword.

    There are more but I understand the logic/usability/history behind them. The above points should have been addressed in the 80’s.

    • krior a minute ago

      Not the error "handling"? The array implementation? The weak type system? The barebones-macro-system? The nearly unuseable standard-library? The standard itself, a 750-page-tome you have to memorize, lest C is allowed to erase your hard drive?

      C is sin incarnated.

    • abcd_f 5 minutes ago

      Arrays decaying to pointers is probably the biggest non-platform specific design oversight.

      As you said, it's easy to see where it came from, but it should've been fixed long ago.

  • Animats an hour ago

    The trouble with C as an API format is that there's no size info. That's asking for buffer overflows.

    There's an argument for full type info at an API, but that gets complicated across languages. Things that do that degenerate into CORBA. Size info, though, is meaningful at the machine level, and ought to be there.

    Apple originally had Pascal APIs for the Mac, which did carry along size info. But they caved and went with C APIs.

  • Woodi 20 minutes ago

    Do someone pays for anti-C propaganda ?? All that logic breaking accusations...

    Eg. here, from memory:

    > ...you want to read 32 bits from file but OH NOOES long is 64 bit ! The language ! The imposibility !

    But when you read something ot unserialize some format you just need to know based on format schema or domain knowledge. Simple and straightforward like that ! You do not do some "reflections" on what language standard provide and then expect someone send you just that !!

    So that anti-C "movement" is mostly based on brainless exampless.

    Not saying C is perfect.

    But it is very good and I bet IBM and other big corps will keep selling things written and actively developed in C/C++ + adding hefty consulting fees.

    In the meantime proles has been adviced to move to cpu-cycle-eating inferior languages and layers over layers of cycle burning infra in cloud-level zero-privacy and guaranteed data leaks.

    Oh, btw. that femous Java "bean" is just object with usually language delivered "basic type"... How that poor programmer from article should know what to read from disc when he just have types Java provides ?? How ? Or maybe he should use some domain knowledge or schema for problem he is trying to solve ??

    And in "scripting language" with automatic int's - how to even know how many bits runtime/vm actually use ? Maybe some reflection to check type ? But again how that even helps if there is no knowledge in brain how many bits should be read ?? But calling some cycle burning reflection or virtual and as much as posible indirect things is what fat tigers love the moust :)

  • mjg59 5 hours ago

    I really don't understand why people keep misunderstanding this post so badly. It's not a complaint about C as a programming language. It's a complaint that, due to so much infrastructure being implemented in C, anyone who wants to interact with that infrastructure is forced to deal with some of the constraints of C. C has moved beyond merely being a programming language and become the most common interface for in-process interoperability between languages[1], and that means everyone working at that level needs to care about C even if they have no intention of writing C.

    It's understandable how we got here, but it's an entirely legitimate question - could things be better if we had an explicitly designed interoperability interface? Given my experiences with cgo, I'd be pretty solidly on the "Fuck yes" side of things.

    (Of course, any such interface would probably end up being designed by committee and end up embodying chunks of ALGOL ABI or something instead, so this may not be the worst possible world but that doesn't mean we have to like it)

    [1] I absolutely buy the argument that HTTP probably wins out for out of process

    • tragiclos 3 hours ago

      > could things be better if we had an explicitly designed interoperability interface?

      Yes, we could define a language-agnostic binary interoperability standard with it's own interface definition language, or IDL. Maybe call it something neutral like the component object model, or just COM[1]. :)

      [1] https://en.wikipedia.org/wiki/Component_Object_Model

      • thayne 36 minutes ago

        The general idea is sound. The implementation less so.

    • drnick1 4 hours ago

      I don't see that as a problem. C has been the bedrock of computing since the 1970s because it is the most minimal way of speaking to the hardware in a mostly portable way. Anything can be done in C, from writing hardware drivers, to GUI applications and scientific computing. In fact I deplore the day people stopped using C for desktop applications and moved to bloated, sluggish Web frameworks to program desktop apps. Today's desktop apps are slower than Windows 95 era GUI programs because of that.

      • mjg59 4 hours ago

        Ok you're still missing the point. This isn't about C being good or bad or suitable or unsuitable. It's about whether it's good that C has, through no deliberate set of choices, ended up embodying the interface that lets us build rust that can be called by go.

        • drnick1 3 hours ago

          Yes, because C is, by virtue of its history and central role in the development of all mainstream operating systems, the lowest common denominator.

          Also, if I remember correctly, the first Rust and Go compilers were written in C.

          • mjg59 3 hours ago

            Yes! It's easy to see why we got here, but that doesn't mean it's the optimal outcome!

          • zorobo 3 hours ago

            OCaml was used for rust.

          • Ygg2 an hour ago

            > Yes, because C is, by virtue of its history

            Sure history is great and all, but in C it's hard to say reliably define this int is 64-bit wide, because of the wobbly type system. Plus, the whole historical baggage of not having 128-bit wide ints. Or sane strings (not null terminated).

            • thayne 28 minutes ago

              > in C it's hard to say reliably define this int is 64-bit wide

              That isn't really a problem any more (since c99). You can define it as uint64_t.

              But we have a ton of existing APIs that are defined using the wobbly types, so we're kind of stuck with it. And even new APIs use the wobbly types because the author didn't use that for whatever reason.

              But that is far from the only issue.

              128 bit ints is definitely a problem though, you don't even get agreement between different compilers on the same os on the same hardware.

      • Ygg2 4 hours ago

        > I don't see that as a problem.

        It kinda is. Because it was made in the 1970s, and it shows (cough null-terminated strings uncough).

        Or you know having a 64-bit wide integer. Reliably.

        You did read the article, right?

    • SanjayMehta 4 hours ago

      VHDL vs Verilog is a good parallel from the chip world. VHDL was designed from ground up.

      Verilog is loosely based on C. Most designs are done in Verilog.

  • agentultra 4 hours ago

    I mean… an ABI is more like an agreement. It isn’t a specification. It’d be nice if everything was neatly specified and sound. But as the author notes near the end… there’s a lot of platforms and they all have their own quirks.

    There has to be an ABI that has to be agreed upon by everyone. Otherwise there wouldn’t be any interoperability. And if we didn’t have the SystemV ABI — what would we use instead? Prepare for a long debate as every language author, operating system designer, and platform under the sun argues for their respective demands and proposals. And as sure as the sun rises in the East someone, somewhere, would write an article such as this one decrying that blessed ABI.

    SystemV shouldn’t be the be all and end all, IMO. But progress should be incremental. Because a lingua franca loses its primary feature and utility when we all return to our own fiefdoms and stop talking to one another in the common tongue.

    It’s a pain in the metaphorical butt. But it’s better, IMO, than the alternatives. It’s kind of neat that SystemV works so well let alone at all.

  • Panzerschrek 41 minutes ago

    > Anyone who spends much time trying to parse C(++) headers very quickly says “ah, actually, fuck that” and asks a C(++) compiler to do it.

    That's exactly my case. For my programming language I have wrote a tool for C headers conversion using libclang. And even with help of this library it wasn't that easy, I have found a lot of caveats by trying converting headers like <windows.h>.

  • hacker_homie an hour ago

    It's not that it was made this way to annoy you, it was all we had.

    The whole world shouldn't "need to be fixed" because you won't spend the time to learn something.

    Rust doesn't even have a stable Internal ABI that's why you have to re-compile everything all the time.

  • groundzeros2015 4 hours ago

    What languages does this author like which has a written spec?

    • ChrisSD an hour ago

      This article isn't about languages. It's about the protocol for two or more languages to talk to each other. There is no specification for this.

      The System V ABI is as close as we get to an actual specification but not everyone uses it and in any case it only covers a small part of the protocol.

  • themafia 2 hours ago

    > C was elevated to a role of prestige and power

    We didn't do it to annoy you or to foist bad APIs on you. We did it because it was the best language for writing machine code at the time. By miles. Not understanding why this is true will lead you to make all the same mistakes the languages "bested" by C made.

  • TZubiri 5 hours ago

    >Phantomderp and I

    >Furry avatar

    >"About Me I am Aria Desires, Gankra, and a cat."

    I seem to recall reading this before, I must have not noticed this furry stuff because I would have ignored it.

    My take was that this is a rustacean who was having trouble porting something to C and then went in a deep rabbit hole of C traiditional software, and instead of recognizing that perhaps they are in way over their head, they concluded that the issue was in the C, that it's all wrong and therefore their mission of porting stuff to Rust is even more virtuous.

    • CGamesPlay 2 hours ago

      This is just an ad hominem attack. Doesn't seem like the author is "in over their head"; they seem to have a pretty solid grasp of actual identifiable gaps between implementations and various specs, and the article was written with the same kind of "chastising" tone as you would see from any grey-bearded hacker who's unsatisfied with the way things are.

    • majorchord 5 hours ago

      I hate to make judgments without a mountain of evidence, but a cursory glance of their about page honestly made me think this person likely suffers from a multitude of mental health issues.

      • TZubiri 5 hours ago

        I think we can be accomodating of a wide array of diagnosable mental conditions in software. I'm thinking of Terry King's TempleOS, Ken Reitz's Requests.

        Being upfront about it by authors dispels a lot of the potential tension and substantially changes the way we interact. I understand there may be a conflict and not everyone will want to advertise their diagnosis, but in my experience once it becomes clear that's what's going on, it helps all the parties involved.

    • SanjayMehta 5 hours ago

      It is exactly as you describe.

  • ranger_danger 5 hours ago

    I try not to put much stock in black-and-white opinions because I think the answer is rarely that simple.

  • orionblastar 6 hours ago

    I always thought that C was a stepping stone to learn other languages. Like Pascal, it was educational to learn. My Comp Sci courses in 1986-1990 used Turbo Pascal and Turbo C.

    • twangist 6 hours ago

      C was never a gateway to any flavor of Pascal, a "police state language".

    • TZubiri 5 hours ago

      I think so to, for most devs C is like Latin, or Roman Law, not something we develop and use, but rather something we learn for context and to understand future developments.

      There's some people that still develop on C for sure, but it's limited to FOSS and embedded at this point, Low Level proprietary systems having migrated to C++ or Rust mostly.

      I agree with the main thesis that C isn't a language like the others, something that we practice, that it's mostly an ancient but highly influential language, and it's an API/ABI.

      What I disagree with is that 'critiquing' C is productive in the same way that critiquing Roman Law or Latin or Plato is productive, the horse is dead, one might think they are being clever or novel for finding flaws in the dead horse, but it's more often a defense mechanism to justify having a hard time learning the decades of backwards compatibility, edge cases and warts that have been developed.

      It's easier to think of the previous generation as being dumb and having made mistakes that could have been fixed, and that it all could be simpler, rather than recognize that engineering is super complex and that we might as well dedicate our full life to learning this craft and still not make a dent.

      I applaud the new generation for taking on this challenge and giving their best shot at the revolution, but I'm personally thinking of bridging the next-next generation and the previous generation of devs, the historical complexity of the field will increase linearly with time and I think if we pace ourselves we can keep the complexity down, and the more times we hop unto a revolution that disregards the previous generation as dumb, the bigger the complexity is going to be.

  • bigbuppo 4 hours ago

    TL;DR author loves rust and writing a subset of a c compiler is hard

    • Ygg2 4 hours ago

      Except the author has moved on from Rust, and is still fighting ABI hellscape in different language - Swift.