Java does not support goto.
Programming
Welcome to the main community in programming.dev! Feel free to post anything relating to programming here!
Cross posting is strongly encouraged in the instance. If you feel your post or another person's post makes sense in another community cross post into it.
Hope you enjoy the instance!
Rules
Rules
- Follow the programming.dev instance rules
- Keep content related to programming in some way
- If you're posting long videos try to add in some form of tldr for those who don't want to watch videos
Wormhole
Follow the wormhole through a path of communities [email protected]
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!
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.
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?!
You mean SpaghettiFactory()
Well it has labeled breaks but that's the closest it gets to it.
goto
does have some uses, such as single exit point, but should be used sparingly.
Single exit point is an assembly rule that was mindlessly ported to C/C++. It doesn't make sense in a structured language.
Maybe for your use-cases, for mine i find it quite useful.
I'll be very interested to hear more, do you have a blog?
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.
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.
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?
Unfortunately, the grainy text is hard[er] to read.
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.
C is one of the few languages where using goto
makes sense as a poor man's local error/cleanup handler.
Yeah. Without a proper error handling mechanism, goto is actually useful for once.
Still don't get why Go simultaneously picked this and introduced defer
Go 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.
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.
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.
This is 1968. You didn't have an IDE or debugger. Your editor was likely pretty terrible too (if you had one). You may have still been using punch cards. It's possible the only output you got from your program was printed on green-bar paper.
"Back in the day" it wasn't uncommon to sit with a printout of your code and manually walk though it keeping state with a pencil. Being able to keep track of things in your head was very important.
GOTO existed in part for performance purposes. When your CPU clock is measured in megahertz, your RAM is measured in kilobytes and your compilers don't do function in-lining it's quicker and cheaper to just move the program pointer than it is to push a bunch of variables on a stack and jump to another location, then pop things off the stack when you're done (especially if you're calling your function inside a loop). Even when I was programming back in the '80s there was a sense that "function calls can be expensive". It wasn't uncommon then to manually un-roll loops or in-line code. Compilers are much more sophisticated today and CPUs are so much faster that 99% of the time you don't need to think about now.
Oddly enough the arguments against GOTO are less important today as we have much better development tools available to us. Though I certainly won't recommend it over better flow-control structures.
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.
Mostly because they had to. Writing efficient code and easy-to-read code are often at odds with each other. I like being able to create lots of functions that can be called from a loop without needing to worry too much about function call overhead. I can prioritize readability for some time before I ever need to worry about performance.
I get that but it seems as though no one cares at all about efficiency these days.
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.)
People have been complaining about this exact thing forever. Even back when "people cared about efficiency".
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.
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).