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 ( @eveninghere@beehaw.org ) 19•1 month agoFor 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.
realharo ( @realharo@lemm.ee ) 14•1 month agoC is one of the few languages where using
goto
makes sense as a poor man’s local error/cleanup handler. 42yeah ( @42yeah@lemm.ee ) 1•1 month agoYeah. Without a proper error handling mechanism, goto is actually useful for once.
pkill ( @pkill@programming.dev ) 1•1 month agoStill don’t get why Go simultaneously picked this and introduced
defer
stepan ( @stepan@lemmy.cafe ) English17•1 month agoTIL that C# and Java have a goto statement.
leftzero ( @leftzero@lemmynsfw.com ) 13•1 month agoForget about goto, the latest version of C# introduced what’s essentially comefrom.
NaoPb ( @NaoPb@eviltoast.org ) English6•1 month agoPlease don’t link to medium articles. That page is terrible to visit.
leftzero ( @leftzero@lemmynsfw.com ) 1•1 month agoLooks fine on Firefox on Android with uBlock Origin. 🤷♂️
NaoPb ( @NaoPb@eviltoast.org ) English1•1 month agoI’m running exactly the same and it doesn’t look fine on my end.
leftzero ( @leftzero@lemmynsfw.com ) 1•1 month agoHuh. Maybe it’s NoScript, then.
NaoPb ( @NaoPb@eviltoast.org ) English1•1 month agoCould be. I’m getting forced to make an account and such. That’s why I hate medium.
BatmanAoD ( @BatmanAoD@programming.dev ) 2•1 month agoWhat…? That is a terrible idea.
leftzero ( @leftzero@lemmynsfw.com ) 1•1 month agoIt’s scary as fuck, yeah, but, to be fair, it’s only intended to be used by code generators, and it’s quite awkward to use outside of them.
TehPers ( @TehPers@beehaw.org ) English3•1 month agoIn C# at least,
goto
can take you between case labels in a switch statement (rather than using fallthrough), which I don’t view as being nearly as bad. For example, you can dogoto case 1
orgoto default
to jump to another case.The only other use of
goto
I find remotely tolerable is when paired with a labelled loop statement (like putting a label right before afor
loop), but honestly Rust handles that far better with labelled loops (and labelled block expressions). asyncrosaurus ( @asyncrosaurus@programming.dev ) 5•1 month agoI’ve programmed C# for nearly 15 years, and have used
goto
twice . Once to simplify an early break from a nested loop, essentially a nestedcontinue
. The second was to refactor a giant switch statement in a parser, essentially removing convolutedwhile
loops, and just did agoto
the start.It’s one of those things that almost should never be used, but the times it’s been needed, it removed a lot of silliness.
Naich ( @Naich@lemmings.world ) 13•1 month agoswitch statements are three gotos in a trenchcoat.
magic_lobster_party ( @magic_lobster_party@kbin.run ) 6•1 month agoAnything is a goto in disguise when you think about it
wewbull ( @wewbull@feddit.uk ) English2•1 month agoIn most CPU instruction sets, the only conditional instruction is branch (aka goto).
magic_lobster_party ( @magic_lobster_party@kbin.run ) 2•1 month agoAnd after each instruction, the CPU go to the next instruction
TehPers ( @TehPers@beehaw.org ) English5•1 month agoDuff’s device takes this to a whole new level.
This is very nice and clean
wewbull ( @wewbull@feddit.uk ) English2•1 month agoEgads! My eyes.
I’d rather it was just written in assembly. It’s the
do {
opening a block under thecase 0
, but then proceeding to have furthercase
statements inside that block. You now have case statements in two different scopes that are part of the same switch.
Deebster ( @Deebster@programming.dev ) 11•1 month agoFor 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.
Kissaki ( @Kissaki@programming.dev ) English5•1 month agoI 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 ( @Deebster@programming.dev ) English4•1 month agoI 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).
tedu ( @tedu@azorius.net ) 9•1 month agoLanguages don’t have goto because they mindlessly copied it.
huginn ( @huginn@feddit.it ) 2•1 month agoTrue it wasn’t mindless - just idiotic
Kissaki ( @Kissaki@programming.dev ) English7•1 month agoTheir 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. 0x0 ( @0x0@programming.dev ) 7•1 month agogoto
does have some uses, such as single exit point, but should be used sparingly. billybong ( @billybong@lemmynsfw.com ) 2•1 month agoSingle exit point is an assembly rule that was mindlessly ported to C/C++. It doesn’t make sense in a structured language.
0x0 ( @0x0@programming.dev ) 2•1 month agoMaybe for your use-cases, for mine i find it quite useful.
Kissaki ( @Kissaki@programming.dev ) English4•1 month agoGo has
goto
too. They surely did not “mindlessly copy” it.The standard library makes use of it. So they most definitely see a warranted use-case for it.
OP argument against using it in high level languages may still hold though. Go may have introduced it as a systems language which allows control over alternative implementations.
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.
Kissaki ( @Kissaki@programming.dev ) English2•1 month agoPDF 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?
Unfortunately, the grainy text is hard[er] to read.