News for hackers. Stuff that matters.
Re:Go compiler internals: Adding a new statement to Go by kstenerud on Friday July 05, 2019 @03:30AM (#20360542)
The go compiler is surprisingly easy to modify! I made a modification that allows it to issue warnings instead of errors for unused imports, variables, etc [1]. It was a fun little exercise :)

[1] https://github.com/kstenerud/go

Re:Go compiler internals: Adding a new statement to Go by mavelikara on Friday July 05, 2019 @03:34AM (#20360567)
This is the commit in question: https://github.com/kstenerud/go/commit/334e03f12c9c94fe6aded.... Cool mod!
Re:Go compiler internals: Adding a new statement to Go by saagarjha on Friday July 05, 2019 @04:43AM (#20360875)
Now if only this got merged into mailine ;)
Re:Go compiler internals: Adding a new statement to Go by dullgiulio on Friday July 05, 2019 @08:22AM (#20361955)
Why? The idea that warnings are errors is pretty important actually.

Now, unused imports are mostly harmless (alright, they are not because of init), but they keep unrelated commits clean without needing ad-hoc linting or IDE functionality.

Re:Go compiler internals: Adding a new statement to Go by kstenerud on Friday July 05, 2019 @08:43AM (#20362082)
It's explained in the use case: https://github.com/kstenerud/go#use-case

Use Case

The use case for warnings is the exploratory development or debugging phases, where you really don't care about leaving unused things lying around for the time being (for example, temporarily commenting something out), and would rather that the compiler just got out of your way until you've got something ready to compile normally and commit.

Usage

    go build -gcflags=-warnunused somefile.go
    go test -gcflags=-warnunused
When you're done with your exploratory/debugging phase, simply build or test without the flag:

    go build somefile.go
    go test
Compiling without the flags will fail on unused things as normal.
Re:Go compiler internals: Adding a new statement to Go by icxa on Friday July 05, 2019 @11:50AM (#20363450)
Other comments are missing out the other key point: go packages are sometimes imported for side effects, and this pattern is common enough in the community (although albeit slightly discouraged now). So unused imports can still impact your code due to the init() functions
Re:Go compiler internals: Adding a new statement to Go by atombender on Friday July 05, 2019 @01:07PM (#20364064)
Unused imports that are imported solely for side effects should be imported this way to avoid that problem:

  import (
    _ "github.com/some/package"
  )
Given that this is the only way to have unused imports with mainline Go — in other words, it's impossible to accidentally remove one once it's been declared this way — I'm not sure I see what the argument is.
Re:Go compiler internals: Adding a new statement to Go by icxa on Friday July 05, 2019 @03:16PM (#20365038)
> I'm not sure I see what the argument is.

That there are other reasons why unused imports are a compilation error in go, and it isn't as simple as turning them into warnings

Re:Go compiler internals: Adding a new statement to Go by apta on Friday July 05, 2019 @07:46PM (#20366773)
> go packages are sometimes imported for side effect

Sounds like another source of errors.

Re:Go compiler internals: Adding a new statement to Go by icxa on Wednesday July 10, 2019 @01:47PM (#20404412)
Fatal errors would probably be bubbled up via a panic, in which you can cover in a recover() block
Re:Go compiler internals: Adding a new statement to Go by amiller2571 on Friday July 05, 2019 @08:49AM (#20362112)
"I really need to get this deployed to production. I'll remove the warning debugging flag and build it... AH MAN look at all these unused import error!! Screw it! I don't have time to fix them all. I'll just add it bad and fix it later"
Re:Go compiler internals: Adding a new statement to Go by kstenerud on Friday July 05, 2019 @08:54AM (#20362146)
When your devs do these kinds of things, the problem isn't the tools.

I like tools that serve me, not the other way around.

Re:Go compiler internals: Adding a new statement to Go by eternalban on Friday July 05, 2019 @09:08AM (#20362228)
That is a valid position, but imo at odds with the implicit position of Go's creators. Arguably, the Mommy regime of Go's compiler is very much reflective of Go's creators' appraisal of the software maturity of its intended users.

Regarding the point in general, the notion of "broken windows" is applicable.

(Great github showcase, btw!)

Re:Go compiler internals: Adding a new statement to Go by kstenerud on Friday July 05, 2019 @09:35AM (#20362371)
It's the problem of "he knows what he's doing" vs "I know what I'm doing".

In the old unix days, tools were built under the assumption that "he knows what he's doing", meaning that if you typed "rm -r /" you probably had a good reason to do so. We've since learned that just blindly trusting potentially fat fingers is probably not the best approach, and so the more dangerous of those tools have been modified to require you to add additional flags to do the most dangerous things.

It was the same in C, where the compiler blindly did exactly as told until we realized that software developers have fat fingers too. Unfortunately, they got it backwards, issuing warnings that by default don't halt compilation ("he knows what he's doing"), which led users and managers to believe that warnings aren't serious enough to deal with.

What they SHOULD have done is made those warnings halt compilation by default, and only allow compilation to continue if the user had invoked an additional opt-in ("I know what I'm doing") flag.

There's also the issue of inconsistent warnings across compilers and the subtleties of UB in C that contributed to the warnings problem, but we don't have that in Go.

Re:Go compiler internals: Adding a new statement to Go by pvg on Friday July 05, 2019 @04:34PM (#20365647)
People often say this sort of thing about the constraints imposed by various systems. It's a bit of a rhetorical party trick, though, designed to avoid engaging with the design rationale of the constraints by appealing to the operator's vanity.
Re:Go compiler internals: Adding a new statement to Go by apta on Friday July 05, 2019 @07:48PM (#20366787)
> Go's creators' appraisal of the software maturity of its intended users.

More like immaturity:

“The key point here is our programmers are Googlers, they’re not researchers. They’re typically, fairly young, fresh out of school, probably learned Java, maybe learned C or C++, probably learned Python. They’re not capable of understanding a brilliant language but we want to use them to build good software. So, the language that we give them has to be easy for them to understand and easy to adopt.”

Re:Go compiler internals: Adding a new statement to Go by shhsshs on Friday July 05, 2019 @09:30AM (#20362345)
"I really need to get this deployed to production. I'll build it... AH MAN look at all these compilation errors and failing tests!! Screw it! I don't have time to fix them all. I'll just remove them and fix it later."
Re:Go compiler internals: Adding a new statement to Go by tptacek on Friday July 05, 2019 @03:32PM (#20365170)
I used to want that too, but I've paid pretty close attention over the last couple years and that error has caught a nonzero number of what would otherwise have been runtime bugs.
Re:Go compiler internals: Adding a new statement to Go by napsterbr on Friday July 05, 2019 @03:53PM (#20365330)
For production I agree 100% with you, to the point I think it's just sloppy to leave unused variables and imports hanging around.

But during development that's just a needless obstacle. I may comment large blocks of code and I don't want to scan each import to make sure they are no longer used.

Re:Go compiler internals: Adding a new statement to Go by tptacek on Friday July 05, 2019 @03:58PM (#20365370)
I assume at this point that at least a plurality of Go developers are using goimports and having this stuff handled automatically. That's probably another reason my opinion on this shifted.
Re:Go compiler internals: Adding a new statement to Go by kstenerud on Friday July 05, 2019 @11:19PM (#20367577)
If IDEs did the same for unused variables, I'd probably shift as well, but right now, commenting out a line quickly degenerates into a game of whack a mole, because it causes a previous calculation to become "unused", and commenting out that line causes two more things to become unused, etc. The last thing I want during debugging is to have to fight the compiler at every step.

Debugging is the main reason I wrote this mod.