NHacker Next
  • new
  • past
  • show
  • ask
  • show
  • jobs
  • submit
Why Go? (github.com)
jerf 42 minutes ago [-]
This is posted in the context of the discussion ongoing at https://news.ycombinator.com/item?id=43332830, elsewhere on the front page as I write this.

Note if you are a title-only-before-commenting reader that this is not a generalized apologia for Go, but specifically for the case of porting the Typescript compiler, so reciting the Litany Against Go in a general sense is not really on topic.

(The Litany, naturally, is:

    I must not Go.
    Go is the mind-killer.
    Go is the little-death that brings total obliteration.
    I will face Go.
    I will permit it to pass over me and Go through me.
    And when it has gone past, I will turn the inner eye 
    to see its path.
    Where the Go has Go'ed there will be nothing.
    Only I will remain.

)
afavour 39 minutes ago [-]
The key takeaways for me:

> many languages would be suitable in a ground-up rewrite situation.

> By far the most important aspect is that we need to keep the new codebase as compatible as possible, both in terms of semantics and in terms of code structure

> languages that require fundamental rethinking of memory management, mutation, data structuring, polymorphism, laziness, etc., might be a better fit for a ground-up rewrite, but we're undertaking this more as a port

My initial thought was "why not Rust" and those passages do a pretty good job of answering the question, IMO.

manojlds 38 minutes ago [-]
But not why not C#
afavour 36 minutes ago [-]
It's a fair question! Go is certainly more widely used in web dev circles (e.g. esbuild) than C# is, that might go some way to answering the question.

I think folks want TypeScript to use C# because it's Microsoft, I'm glad they didn't just do that for corporate reasons. But I'm open to there being non-corporate reasons!

exeldapp 14 minutes ago [-]
I agree that it's good they looked passed typical corporate reasons. I admit it's still strange to see.

At the end of the day, companies like Microsoft are in the business of making money and that's one of the reasons they made C#. If they don't see the profit in using one of their own products (and one that competes with Go) in their future products then why would I use them for mine?

It's like if they used Google Cloud instead of Azure, it'd be very weird.

whimsicalism 35 minutes ago [-]
but Go and C# are basically occupying the same space... if even MS isn't doing C# for a project like this, it's basically a death knell for C#.
osigurdson 4 minutes ago [-]
I don't think so. It isn't as if C# isn't competitive in many spaces. However, honestly, if you want to create a simple cli app, Go is a better choice than C#. With C#, you would either need to bundle .NET or try to use AOT features which will either make for a huge executable or development friction. With Go, that is just how it works out of the box so I get it from that standpoint.

I still don't understand their rationale for not using Rust however. This is going to be run millions of times a day by web devs - it makes sense to make it as fast as possible. Optimizing for similarity of codebases doesn't seem right imo, and a dubious position to begin with as Go and Typescript aren't that similar anyway.

klodolph 29 minutes ago [-]
I could write a whole article on this, but my take on this is that Go occupies one space, and Java and C# occupy a different space.

This happens despite the checklist similarity between these languages.

osigurdson 3 minutes ago [-]
Could you perhaps elucidate with a couple of bullet points? In my view Java / C# and Go are technically the same thing. There might be some cultural differences though, which honestly, people seem to care more about anyway.
whimsicalism 20 minutes ago [-]
Generally, I see Go replacing a lot of projects that would have previously been written in Java (namely network services/backends). Compiler is a bit of an exception, for sure.
klodolph 18 minutes ago [-]
Yes… there’s a lot of overlapping territory, for sure. Just like how Java relaces a lot of projects that would have previously been written in C++ or C.
whimsicalism 16 minutes ago [-]
> like how Java relaces a lot of projects that would have previously been written in C++

hearing of this pains me

jillyboel 13 minutes ago [-]
Cheaper and safer software pains you?
afavour 33 minutes ago [-]
That logic gets to the core of what I'm saying: it's "use C# because it's good for C#", not "use C# because it's good for TypeScript".
whimsicalism 19 minutes ago [-]
I'm not even really making an argument for C#, more just what it signals for C#. I am not a C# lover (although I also don't really love love Go).
AnimalMuppet 20 minutes ago [-]
I think whimsicalism's point may be that, if C# isn't the tool of choice for this port, then that's the death knell of C#. The death knell isn't what kills it; that's the death blow. The death knell is sounded after it's dead. If C# wasn't the choice here, then C# is already dead.

That may be overstating how dead C# is. But I think it is accurate to whimsicalism's point.

Redoubts 12 minutes ago [-]
That might be their point, but it’s a bad implication for why languages get picked
ClikeX 29 minutes ago [-]
I don't think C# is being harmed by Typescript not being ported to it. There are a lot of companies that have used C# for years, and will continue to do so. They don't care if the TS compiler is not built with it.
whimsicalism 17 minutes ago [-]
There was a movement for C# to be a real developer language that is bonafide cross-platform. If Microsoft is citing cross-platform reasons to not dev with C#....

New companies aren't generally starting with Microsoft as their OS, these 'lots of companies' are legacy/enterprise stragglers and/or European.

wiseowise 30 minutes ago [-]
One wants to be a better Java, another wants to be a better C. Where do they occupy the same space?
tptacek 31 minutes ago [-]
There's an answer for that on the thread: they wanted to get as close to native code as they could while retaining GC, and Go is "native-native" (if you will), while C# is bytecode-native.
interroboink 30 minutes ago [-]
See this comment on the chain: https://github.com/microsoft/typescript-go/discussions/411#d...

(and the comment that spawned it, which is essentially the same as yours but with some more specifics)

Redoubts 5 minutes ago [-]
Why pull a Lattner?
rjzzleep 36 minutes ago [-]
I'd blame MS for it. If they had played their cards differently early on, we would probably be living in a different world now.
koakuma-chan 28 minutes ago [-]
Why not Java
wiseowise 31 minutes ago [-]
Why C#?
wetpaws 32 minutes ago [-]
[dead]
RyanCavanaugh 25 minutes ago [-]
(OP author here) Lots of people reading too much into the tea leaves here; this is just a matter of picking the best tool for this particular task, and our task (porting a JS codebase to the fastest available native target that still works in terms of not altering program structure as part of the port) is pretty unusual as far as things go

I would also recommend reading kdy1's observations when faced with the same task: https://kdy1.dev/2022-1-26-porting-tsc-to-go . The only caveat I'd add is that I can't tell where the 62x measurement in that post came from. Our own experiments doing Rust and Go implementations showed them within the margin of error, with certain phases being faster in one vs the other.

jasonthorsness 16 minutes ago [-]
Would you say C# AOT could have been competitive in startup time and overall performance, and the decision came down to the other factors you've noted? I think everyone would have expected C# AOT to be the default choice so it might be nice to see some more concrete examples of where Go proved itself more suitable for your use-case.
RyanCavanaugh 9 minutes ago [-]
C# AOT is quite strong and would be a great choice in a lot of contexts.

Go was just very, very strong on port-friendliness when coming from the TS codebase in particular. If you pull up both codebases side-by-side, it's hard to even tell which is which. C# is more class-oriented and the core JS checker uses no classes at all, so the porting story gets quite a bit more difficult there.

metayrnc 40 minutes ago [-]
> Go also offers excellent control of memory layout and allocation (both on an object and field level) without requiring that the entire codebase continually concern itself with memory management.

I guess this sheds a bit of light in to the why not rust debate.

davydm 39 minutes ago [-]
yeah, the whole thought process (imo) makes a lot of sense; and I like that they experimented in a few languages first to see how it would fit
ayende 35 minutes ago [-]
C# has both of those capabilities and more The answer doesn't make sense
Kon-Peki 1 minutes ago [-]
I once was in charge of a legacy C codebase that passed around data files, including to customers all around the world. The “file format” was nothing more than a memory dump of the C data structures. Oh, and the customers were running this software on various architectures (x86, sparc - big endian, alpha, itanium) and these data files had to all be compatible.

Occasionally, we had to create new programs that would do various things and sit in the middle of this workflow - read the data files, write out new ones that the customers could use with no change to their installed software. Because the big bosses could never make up their minds, we at various times used C#, Go, Python, and even C.

They all work just fine in a production environment. Seriously, it’s fine to choose any of them. But C# stands out as having the ugliest and sketchiest code to deal with it. But it works just fine!

More telling though. I used this scenario in interview questions many times. How would you approach it with C#? 99% of the time I would get a blank stare, followed by “I don’t think it’s possible”. If you want developers that can maintain code that can do this, perhaps don’t choose C# :)

dagw 23 minutes ago [-]
Two things that have brought up in interviews. They don't seem to believe that AOT compiled C# is mature enough and can give the best possible performance on all their supported platforms. Their current codebase consists of more or less pure functions acting on simple data structures and since they want the port to be as 1:1 as possible, idiomatic Go is closer to that style than idiomatic C#.

See this thread https://news.ycombinator.com/item?id=43332830 for much more discussion.

Thaxll 31 minutes ago [-]
When you code using regular OOP it's def not the case. Go struct memory layout is very straightforward.
ijustlovemath 16 minutes ago [-]
c# also has a runtime you have to ship with any binaries
wiseowise 28 minutes ago [-]
So is Java.
jillyboel 16 minutes ago [-]
Requiring all typescript users to install the .net runtime will probably kill adoption, especially on linux build servers. It still requires custom microsoft repos, if they're even available for your distro, and is barely upstreamed.

For Go, you just run the binary without any bullshit. This can easily be wrapped in an npm package to keep the current experience (`npm install` and it works) on all platforms.

davydm 39 minutes ago [-]
I don't know why some people are losing their minds over it being in go... ok, so I kinda expected rust because that's what all the cool kids are doing - rewriting in rust - but I think go is a pretty good choice for a domain like this.
rjzzleep 37 minutes ago [-]
Rust is a PITA. I started a few Rust projects as well, but it just doesn't vibe with me. I don't like the verbosenes of Go, but it's mostly consistent, and there are accepted best practices. Rust is like the Perl of system programming.
wewtyflakes 23 minutes ago [-]
In my experience, Rust has been a language that writes as terse and bloated at the same time; though it is perhaps my own skill issue. I tried hard to love the language but I ended up walking away.
whimsicalism 34 minutes ago [-]
> Rust is like the Perl of system programming.

So not true. I'm hardly a Rust aficionado, but Rust is definitely a spiritual successor to C++, while Go is more of a successor to Java.

wiseowise 27 minutes ago [-]
> while Go is more of a successor to Java.

In what sense?

whimsicalism 21 minutes ago [-]
garbage collected, the usecases I see it, generally being used to write network services
nullbyte 22 minutes ago [-]
Please do not compare rust to C++, that is an insult to C++
whimsicalism 21 minutes ago [-]
Seriously? I love C++ and barely use Rust, but they both seem like pretty good languages to me.
exeldapp 28 minutes ago [-]
Normally I don't think anyone would be losing their mind, but this is a Microsoft team creating a widely popular Microsoft product and they use a Google product (Go) instead of using another Microsoft product (C#) that is arguably competing with it. It strikes as odd why a Microsoft team isn't comfortable with/trusting a Microsoft product. I think it makes sense that some people are taking this in a way that maybe they shouldn't trust in C#'s future either.
hackyhacky 37 minutes ago [-]
It's not widely known, but the 90s rock band Pearl Jam answered this very question [1].

[1] https://www.youtube.com/watch?v=kzJu4r5vvo8

sepositus 19 minutes ago [-]
It's hard to tell which camp is more angry: the C# developers stating Microsoft is ditching its own ecosystem or the Rust developers unwilling to accept anything in this category not being written in Rust.

From my understanding, all three options (Go, C#, and Rust) represent a significant speedup. The only legitimate concern I see is the one around WASM support, which is quite valid.

But at the end of the day, it seems like the team is making a decision that maximizes speed and deliverability, with the offset being that some cracks are now present (e.g. WASM). I can respect them for that choice.

jasonthorsness 23 minutes ago [-]
For everyone asking Why Not C#? I think it's fair, given Anders who designed both C# and TypeScript was the one who announced this on X and is involved, to take them at face value on things such as "Idiomatic Go strongly resembles the existing coding patterns of the TypeScript codebase, which makes this porting effort much more tractable." Maybe after doing a bunch of prototypes, like they said they did, it was just the obvious choice at the level of the code itself, and I think if that's where they focused their decision rubric instead of on other factors like NIH or the current hot thing it's a refreshing way of making a decision.
aeturnum 18 minutes ago [-]
> Languages that allow for a structurally similar codebase offer a significant boon for anyone making code changes because we can easily port changes between the two codebases.

From this I can understand why they did not go with, say, Rust - but there are other compiled languages with garbage collection that could have worked well. Why Go over Crystal? I imagine it's that the Go is the most mature ecostystem (i.e. the interop) but it feels like a missed opportunity.

nonethewiser 32 minutes ago [-]
Maybe a stupid question but...

With typescript 7 written in Go, am I able to download typescript 7 as an npm module in my package and use that? No, right? I have to have it installed on my system and maybe have a version manager to use different versions across projects. Or maybe it can be compiled to WA and published to npm?

mcintyre1994 26 minutes ago [-]
I don’t see why not. Esbuild is written in Go and installed with NPM: https://esbuild.github.io/getting-started/#install-esbuild
inib 28 minutes ago [-]
It will continue to work from npm. See esbuild as an example.
ClikeX 25 minutes ago [-]
You can upload binaries to npm, so I don't see why you shouldn't be able to download it as a npm module?
nu11ptr 24 minutes ago [-]
I have written a lot of code in many languages, but most recently in Go and Rust. I had actually considered myself a Rust convert up until recently, and if you look at my comment history, you will find me calling out Go for being a poorly designed language on multiple occasions.

I have changed my mind.

Why? Well, I started writing Go again, so I had experience writing both Rust and Go within a close timeframe to each other. These are very different languages with very different strengths. I think choosing one over the other largely comes down to what you are writing. For deep, complex typed algo code esp. things that need to be very fast, I would likely still choose Rust, but Go really excels at writing infra code. Code that needs to be fast, but more importantly needs to be iterated quickly, and Go compiles MUCH faster than Rust.

Most of my objections to Go I find in the "programming language theory part of my brain". I am a language designer at heart, and by that, I mean I iterate on language designs and have a deep love for PLT. The issue I have found is that, while Rust is awesome in theory (and still one of my favorite languages), actually building things quickly is more satisfying to me, and I am finding I can build in Go about 2x the rate as in Rust. I didn't think this was the case until I actually started tracking my own iteration speed. Things like compile time DO matter, because you are always compiling at some level, even if just running tests. Also, every language feature is just a tiny bit of friction, and Go is so simple that friction is nearly non-existent.

Most of my Go language objectionss, such as nil pointers, lack of enums, multi return vs tuples are much less an issue in practice than they are in theory, and once you sit down and actually think on 'why' Go might have done what it did, it actually makes some sense. I had a few lightbulb moments I could expand on in a different post.

In summary, Go and Rust are very different languages. I really like both, but in different use cases. I am back to writing more Go than Rust, but I expect to write some of both going forward.

rowanG077 18 minutes ago [-]
That's interesting. I have some experience in go and rust. A bit more in go although that is also longer ago. And my experience was reverse from yours. Yes go is simpler but just the insane amount of time it took for me to read the existing codebase in go compared to an approx equivalent rust project was the most large difference for me. The code in rust is just so much faster to read in the large. The signal to noise ratio is much higher. Otoh go code is easier to read in the small but harder to read in the large.

I guess for small things I would prefer go.

26 minutes ago [-]
ChocolateGod 32 minutes ago [-]
If people want this to be in <insert their flavour of the month language here> they should do it themselves rather than complaining.
_benton 38 minutes ago [-]
Seeing all the comments about Rust in that other discussion was kind of disappointing. I have a feeling if they chose Rust, go fans wouldn't be complaining about it not being written in Go.
ChocolateGod 31 minutes ago [-]
I don't think so. I've seen some people have a superiority complex over Rust that isn't the case with Go.

"REWRITE EVERYTHING IN RUST" people.

koakuma-chan 26 minutes ago [-]
A typescript compiler doesn't need an embedded async runtime.
28 minutes ago [-]
manojlds 39 minutes ago [-]
Makes no sense, when there is C#.
Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact
Rendered at 18:08:43 GMT+0000 (Coordinated Universal Time) with Vercel.