In this letter, Dijkstra talks about readability and maintainability in a time where those topics were rarely talked about (1968). This letter was one of the main causes why modern programmers don’t have to trouble themselves with goto statements. Older languages like Java and C# still have a (discouraged) goto statement, because they (mindlessly) copied it from C, which (mindlessly) copied it from Assembly, but more modern languages like Swift and Kotlin don’t even have a goto statement anymore.

  • eveninghere@beehaw.org
    link
    fedilink
    arrow-up
    19
    ·
    edit-2
    6 months ago

    For C it makes sense. The point of C is that it can work as a low level language. Basically, everything doable with assembly SHOULD be doable with C, and that’s why we don’t need another low level language that’s basically C with goto.

    Even though almost all of C users should never use goto.

        • huginn@feddit.it
          link
          fedilink
          arrow-up
          2
          ·
          6 months ago

          There’s a solid reason for goto in C.

          Bringing goto into Java was (and is) idiotic.

          If you’re trying to squeeze every ounce of performance out of your code then you’ll need those optimizations.

          But any higher level language than C the entire point is to write easily maintainable and useful code that any idiot can go, read and update. A goto is antithetical to readability.

          • ggppjj@lemmy.world
            link
            fedilink
            English
            arrow-up
            1
            ·
            6 months ago

            It can be, sure. But when used in a limited manner where it makes sense it can be the more readable option. I’ve used it in a try/catch to retry the operation after changing a variable. One label (“reconnect”), one goto, totally easy to understand on a surface level.

  • Deebster@programming.dev
    link
    fedilink
    arrow-up
    14
    arrow-down
    1
    ·
    edit-2
    6 months ago

    For such an influential letter, I don’t find his arguement all that compelling. I agree that not using go to will often lead to better structured (and more maintainable) programs, but I don’t find his metric of “indexable process progress” to satisfyingly explain why that is.

    Perhaps it’s because at that time people would be running the programs in their heads before submitting them for processing, so they tended to use more of a computer scientist mindset - whereas now we’re more likely to use test cases to convince ourselves that code is correct.

      • 0x0@programming.dev
        link
        fedilink
        arrow-up
        3
        ·
        6 months ago

        When your CPU clock is measured in megahertz, your RAM is measured in kilobytes

        Ah yes, the good ol’ days when developers programmed for efficiency.

            • BatmanAoD@programming.dev
              link
              fedilink
              arrow-up
              1
              ·
              6 months ago

              Does the catchphrase “blazing fast” ring any bells? Some people care.

              (Arguably that’s just the pendulum swinging the other way; Ruby, Python, and Java ruled the software world for a while, and I think that’s a large part of why the Go and Rust communities make such a big deal about speed.)

    • Kissaki@programming.dev
      link
      fedilink
      English
      arrow-up
      7
      ·
      6 months ago

      I think it’s convoluted way to describe it. Very technically-practical. I agree it’s probably because of historical context.

      The argument I read out of it is that using goto breaks you being able to read and follow the code logic/run-logic. Which I agree with.

      Functions are similar jumps, but with the inclusion of a call stack, you can traverse and follow them.

      I think we could add a goto stack / include goto jumps in the call stack though? It’s not named though, so the stack is an index you only understand when you look at the code lines and match goto targets.

      I disagree with unit tests replacing readability. Being able to read and follow code is central to maintainability, to readability and debug-ability. Those are still central to development and maintenance even if you make use of unit tests.

      • Deebster@programming.dev
        link
        fedilink
        English
        arrow-up
        4
        ·
        edit-2
        6 months ago

        I wasn’t saying that unit tests replaces readability, I was saying that back in the 60s they’d reason and debug using their brains (and maybe pen and paper), with more use of things like formal proofs for correctness. Now that we write more complicated programs in more powerful environments, it’s rare to do this (we’d use breakpoints, unit tests, fuzzing, etc).

    • billybong@lemmynsfw.com
      link
      fedilink
      arrow-up
      3
      ·
      6 months ago

      Single exit point is an assembly rule that was mindlessly ported to C/C++. It doesn’t make sense in a structured language.

          • 0x0@programming.dev
            link
            fedilink
            arrow-up
            1
            ·
            6 months ago

            A common case is a function that uses resources like opening files, sockets, whatever. If there’s an error you want to ensure a clean exit, so at different parts of said function you goto the end where you check if said resources are being used and release them before exiting.

            Cleaner than constantly checking at every error.

  • Kissaki@programming.dev
    link
    fedilink
    English
    arrow-up
    8
    ·
    edit-2
    6 months ago

    Their main argumentation (from page 1) summarized:

    You know the state and progress of a program from the line you are on. A goto breaks that.

    You can index the progress of a program through static line indexes and a dynamic loop index and function call stack. A goto breaks that. Including a “statements/lines since beginning of execution” is infeasible for understanding.

    • abbadon420@lemm.eeOP
      link
      fedilink
      arrow-up
      2
      ·
      6 months ago

      The article does say that there are good cases to use goto, but they are rare and most programmers won’t ever encounter such situations. I believe the jist is that it can do nore harm than good.

    • mrkite@programming.dev
      link
      fedilink
      arrow-up
      4
      arrow-down
      1
      ·
      6 months ago

      And yet it’s still easy to write spaghetti code in Java. Just abuse inheritance. Where is this function implemented? No one knows but the compiler!

      • SatouKazuma@ani.social
        link
        fedilink
        arrow-up
        3
        ·
        6 months ago

        And don’t forget to use miracle sort for any sorting needs you have. Why do the work yourself when you can just hope it gets solved for you?!

      • warlaan@lemm.ee
        link
        fedilink
        arrow-up
        1
        arrow-down
        1
        ·
        6 months ago

        That doesn’t make it spaghetti code though. In well-written OOP code you shouldn’t care where a function is implemented. The problem is a much too high level of abstraction. If your high level code is so abstract that it is only running tasks and handling messages there’s no way to write it in a way that prevents mistakes because you couldn’t possibly know what the actual implementations do.

  • Kissaki@programming.dev
    link
    fedilink
    English
    arrow-up
    3
    ·
    edit-2
    6 months ago

    PDF magic… It has grainy text. But the selectable text and displayed text have a 1-character offset.

    I assume they display the original scan so it definitely does not contain errors, while still providing the image-parsed text for searchability, indexability, and select-+copyability?

    screenshot of text + backing text offset

    Unfortunately, the grainy text is hard[er] to read.